10 posts / 0 new
Last post
cxzs1234
Offline
Last seen:2 weeks 2 days ago
Joined:2017-06-23 07:28
关于systick_wait()的使用

我使用DA14580读取DS18B20的数据,在裸机的时候通过调用systick_wait()进行延时可以正常的读取温度数据,但是移植到BLE系统是就直接导致死机。这个函数在BLE系统时候不能用么?有其他延时函数替代么?

Device:
PW_Dialog
Offline
Last seen:2 weeks 2 days ago
Staff
Joined:2019-04-03 02:54
请具体描述一下你说的裸机系统和BLE系统,以及如何移植的。

请具体描述一下你说的裸机系统和BLE系统,以及如何移植的。

cxzs1234
Offline
Last seen:2 weeks 2 days ago
Joined:2017-06-23 07:28
裸机系统就是简单的读取温度数据

裸机系统就是简单的读取温度数据,通过串口将数据传输到电脑端方便观察数据,我单独写了一个DS18B20驱动文件,裸机是通过SDK5.0.4样例SDK 5.0.4\SDK 5.0.4\DA1458x_SDK\5.0.4\projects\target_apps\peripheral_examples\uart修改而成。主要修改mian.c中添加对DS18B20初始化引脚函数和在while循环中不断的调用获取温度函数。如代码

int main (void)
{
uint16_t valve=0;
uint32_t temperatureValve=0;;
int i=0;
system_init();
periph_init();
如果(ds18b20_init () = = 1)
printf_string("\n\r* Temperature Sensor isn't exist *\n\r");
else
printf_string("\n\r* Temperature Sensor is exist *\n\r");
uart_test();
while(1)
{
i++;
if (LED_OFF_THRESHOLD == i)
{
GPIO_SetActive( LED_PORT, LED_PIN);
printf_string("\n\r *LED ON* ");
}
if (LED_ON_THRESHOLD == i)
{
GPIO_SetInactive(LED_PORT, LED_PIN);
valve=ds18b20_get_tem();
printf_string("*\n\r *LED OFF* ");
printf_string("\n\r *Temperature:");
printf_num(valve);
}
if (i== 2*LED_ON_THRESHOLD)
{
i=0;
}
};
}

其他未做修改,可以整合长读取温度值。

驱动函数参考sdk通过的dht11.c设计的,dht11.c也是1wire通信的。

CYibin
Offline
Last seen:4 months 3 weeks ago
Staff
Joined:2017-12-14 02:48
你好,

你好,

请描述下你在 "BLE系统" 中,对 DHT11 驱动接口的使用方式。

BLE 系统运行在 rw 内核之上,是一个基于消息机制的内核;写应用程序时,需要注意不能有阻塞,否则会导致系统实时性变差、触发看门狗死机等问题。

cxzs1234
Offline
Last seen:2 weeks 2 days ago
Joined:2017-06-23 07:28
在app_htpt_task.c文件中的app_htpt

在app_htpt_task.c文件中的app_htpt_timer_handler函数中有一个获取温度值的语句app_htpt_env.temp_value = ds18b20_get_tem();调用这个函数后就死机了

但是仅仅让系统进行自加,是可以正常获得这个温度值的,app_htpt_env.temp_value += 0x01;

static int app_htpt_timer_handler(ke_msg_id_t const msgid,
void const *param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
if (ke_state_get(dest_id) == APP_CONNECTED)
{
// Random generation of a temperature value
uint32_t rand_temp_step;
// Sign used to know if the tempererature will be increased or decreased
int8_t sign;

/ /生成温度ep
rand_temp_step = 22;
// Increase or decrease the temperature value
sign = (int8_t)(rand_temp_step & 0x00000001);

if (!sign)
{
sign = -1;
}

//app_htpt_env.temp_value += sign*rand_temp_step;
app_htpt_env.temp_value += 0x01; //为了调试方便
//app_htpt_env.temp_value = ds18b20_get_tem();
// Send the new temperature
app_htpt_temp_send();


// Reset the Timer (Measurement Interval is not 0 if we are here) The timer is programmed in time units (TU is 10ms)
ke_timer_set(APP_HTPT_TIMER, dest_id, 200);
}

return (KE_MSG_CONSUMED);
}

app_htpt_task.c文件和app_htpt.c是自己从SDK3中移植过来的文件,不知道为啥SDK5中没有。没有调用哪个函数而是用自加时可以在手机软件上观察到数据是正常的,应该移植比较成功。

我是个菜鸟,第一次使用这个芯片和这个系统,还有好多不懂的地方,请指正。

PW_Dialog
Offline
Last seen:2 weeks 2 days ago
Staff
Joined:2019-04-03 02:54
请描述如何移植到BLE系统的,基于某个BLE项目

请问systick_wait()的参数是多少?死机时ds18b20_get_tem()里代码停在哪里,有什么打印信息?

cxzs1234
Offline
Last seen:2 weeks 2 days ago
Joined:2017-06-23 07:28
app_htpt_task.c文件和app_htpt

app_htpt_task.c文件和app_htpt.c这两个文件时根据你们论坛上有一个关于移植的帖子,然后对比其他相似的app_xxx_task.c文件和app_xxx.c,理解后修改的,而且可以使用。systick_wait()参数最小的值是3,最大是300000,最后一个值是为了等待温度转换而等待250ms。

CYibin
Offline
Last seen:4 months 3 weeks ago
Staff
Joined:2017-12-14 02:48
你好,

你好,

你的单线外设驱动可以裸机运行,功能正常;而在有BLE功能的系统中,该驱动会导致系统死机。

以上问题,基于之前的讨论,猜测死机原因和你系统中有比较大的阻塞有关。你应该想办法,把较大的阻塞(250ms)从你的外设驱动中去除。

kongxiangmin
Offline
Last seen:1 year 2 months ago
Joined:2019-01-02 01:33
你好,

你好,

有没有关于去除阻塞的建议,原有的传感器驱动中是需要一定的延时的,这些延时会造成阻塞,请问有没有好的方法代替这种延时?

CYibin
Offline
Last seen:4 months 3 weeks ago
Staff
Joined:2017-12-14 02:48
你好,

你好,

参考以下方式:

// 实现 delay 1s for (i = 0; i < 20; i++) { wdg_freeze(); rwip_schedule(); delay_50ms(); }

原理是在大延时的中间,喂狗并给予 rw 内核执行的机会。

这样做,需要注意防止形成递归调用。

建议实际应用中,还是尽量设计一个合理的状态机,通过 app_easy_timer 来驱动状态机、实现延时等方式。