|
|

楼主 |
发表于 2025-10-6 14:59:52
|
显示全部楼层
本帖最后由 coolaimcu 于 2025-10-6 15:14 编辑
感谢回复!
如下是我的代码:
//////////任务A
static void vTask_A_Touch(void* pvParameters) //触摸任务
{
TickType_t xLastWakeTime;
const TickType_t xFreq =1;
xLastWakeTime = xTaskGetTickCount(); //从系统获取时间
read_touch();
vTaskDelayUntil(&xLastWakeTime,pdMS_TO_TICKS(xFreq));
}
//////////任务B
static void vTask_B_SensorCalculate(void* pvParameters) //计算任务
{
if(ulTaskNotifyTake(pdTRUE, 0)>0) //等待来自任务C的开始计算通知,这里换成过无限期等待:ulTaskNotifyTake(pdTRUE, portMAX_DELAY), 问题也没有改善
{
Get_data = sensor_data_calculate(); //计算完成,获得结果
xQueueSend(xQueueSensorData, &Get_data, portMAX_DELAY); // 把计算结果发送给LVGL任务C
}
vTaskDelay(pdMS_TO_TICKS(10));
}
//////////任务C
static void vTask_C_LVGL(void* pvParameters) //显示任务
{
SemaphoreHandle_t xMutexlvglsec = xSemaphoreCreateMutex();
xSemaphoreGive(xMutexlvglsec);
lv_init();
lv_port_disp_init();
lv_port_indev_init();
sensor_data_display_ui(); //主界面的按钮UI函数
for(;;)
{
if(xSemaphoreTake(xMutexlvglsec,portMAX_DELAY) == pdTRUE) //线程安全互斥锁
{
lv_timer_handler();
xSemaphoreGive(xMutexlvglsec);
}
vTaskDelay(pdMS_TO_TICKS(5));
}
}
//主界面的按钮UI函数,按下按钮进入显示UI子界面,同时产生点击回调事件,在回调函数main_screen_btn_cb中通知B任务开始计算
void sensor_data_display_ui(void)
{
main_screen_button(); //按钮UI
}
//如果按下按钮,则进入回调函数
static void main_screen_btn_cb((lv_event_t* e)
{
start_screen_display_ui(); //进入显示子界面
xTaskNotifyGive(xHandleTask_B); //发任务通知给B,通知开始计算
}
//进入显示子界面start_screen_display_ui()后,立即启动一个5ms的定时器,在定时器回调函数中(如下)接收B任务计算好的结果进行显示
static void timer_receivedata_5ms_cb(lv_timer_t* e)
{
sGetSensorData_t GeteDataAll;
if(xQueueReceive(xQueueSensorData, &GeteDataAll, pdMS_TO_TICKS(5))==pdTRUE) //等待来自任务B的计算数据,pdMS_TO_TICKS(5)换成过porMAX_DELAY以及0,都没有改善
{
lv_display(); //接收完毕,LVGL开始刷新显示
xTaskNotifyGive(xHandleTask_B); //一帧显示完毕,再发个通知给任务B,持续进行计算和显示
}
}
以上是就是一个完整的显示流程,按照你所说,有可能没释放CPU权限,但是我按照自己的理解测试过很多释放权限的方法,但不知道对不对,请硬汉哥帮我看一下,还有哪里需要优化,感谢
|
|