我在LVGL+Freertos中,使用了GUIGuider生成相应的GUI界面,目前遇见当界面切换会随机卡死的情况,我目前思路是Freertos中定时器回调使用了lv_event_send()来定时发送事件,触发相应的标签数据更新,现在我主界面中时间显示用这种思路不会卡死,但是换到其他两个需要读取数据的界面,再调用就会有一定概率卡死,想问一下该怎么解决啊?
//这个是停止测量中的回调,用于关闭Freertos的定时器
static void screen_get_temp_btn_end_temp_event_handler(lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
switch (code)
{
case LV_EVENT_CLICKED:
{
if(xTimerIsTimerActive(shizhongtimerHandle) == pdTRUE)
osTimerStop(shizhongtimerHandle); //点结束测量停止定时器
printf(“shizhongtimer stoped from gettemp end\n”);
}
break;
default:
break;
}
}
//这个是开始测量按钮的回调,
static void screen_get_temp_btn_start_temp_event_handler(lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
switch (code)
{
case LV_EVENT_CLICKED:
{
if(xTimerIsTimerActive(shizhongtimerHandle) == pdFALSE)
osTimerStart(shizhongtimerHandle, pdMS_TO_TICKS(1000)); //启动定时器,每秒触发一次,用于更新温度数据
printf(“shizhongtimer started from gettemp start\n”);
}
break;
default:
break;
}
}
static void screen_get_temp_label_temp_temp_update_event_handler(lv_event_t e)
{
lv_event_code_t code = lv_event_get_code(e); //获取事件类型
switch (code)
{
case LV_EVENT_VALUE_CHANGED:
{
//处理温度数据标签
if(use_sheshidu_flag) //根据标志位判断使用哪种温度单位
lv_label_set_text_fmt(guider_ui.screen_get_temp_label_temp, “%.1f℃”, get_temp_label_data);
else
lv_label_set_text_fmt(guider_ui.screen_get_temp_label_temp, “%.1f℉”, get_temp_label_data1.8+32.00);
}
break;
default:
break;
}
}
然后在Freertos的定时器的回调里主要就是到达定时时间后获取数据并通过lv_event_send()发送事件更新相应的标签数据,另一个界面思路和这个是一样的,目前就是这两个界面触发回调后有一定概率卡死