各位大神好,我这里有个问题,我在ZYNQ平台上 使用裸机跑LVGL 现在做的界面是有比较多的数据需要更新的,然而由于是裸机 我使用了lvgl的定时器去刷新这些数据。由于数据很多需要更新 导致定时器的回调函数就要执行很久 ,影响到了我用户界面的刷新 这应该怎么处理?
是不是跑freertos就会好很多?
LVGL的定时器实际就是在 lv_task_handler(); 中运行,屏幕刷新显示也是通过定时器操作;所以,如果你创建了很多定时器,并且通过定时去执行一些操作,那么会影响到屏幕的刷新显示,如果有的定时器耗时非常大,那么会造成显示卡顿,这个时候建议使用RTOS多任务执行这些操作,LVGL的定时器只是去读取RTOS任务产生的数据去显示。
1 个赞
你好 老师 ,我现在是这样的 就是我数据都在一个数组中,显示这些数据 我也需要用for循环遍历,而显示操作都是在定时器里完成 。是不是如果要不卡顿的话我需要跑freertos 用一个任务去跑这些数据显示,我的理解是由于freertos是任务调度制,每个任务会运行例如1ms就切换为下一个任务执行,这样的话 我的刷新显示就可以类似分段显示,是不是就不会让我用户界面刷新产生卡顿的问题。
我的具体思路为,每次我数据更新好,我会让定时器定时输出一个标志位,当标志位为高 我就会去进行显示操作,这些操作在任务中跑。
char ua_hamonic_buf[5];
char ub_hamonic_buf[5];
char uc_hamonic_buf[5];
char ia_hamonic_buf[5];
char ib_hamonic_buf[5];
char ic_hamonic_buf[5];
for (int i = 1; i < 50; i++){
//A相
snprintf(ua_hamonic_buf, sizeof(ua_hamonic_buf), "%.1f%%", lcd_disp_data.Ua_EHD[i]);
snprintf(ia_hamonic_buf, sizeof(ia_hamonic_buf), "%.1f%%", lcd_disp_data.Ia_EHD[i]);
lv_table_set_cell_value_fmt(sqA_hamonic_table, 1, i, "%s",ua_hamonic_buf);
lv_table_set_cell_value_fmt(sqA_hamonic_table, 2, i, "%s",ia_hamonic_buf);
//B相
snprintf(ub_hamonic_buf, sizeof(ub_hamonic_buf), "%.1f%%", lcd_disp_data.Ub_EHD[i]);
snprintf(ib_hamonic_buf, sizeof(ib_hamonic_buf), "%.1f%%", lcd_disp_data.Ib_EHD[i]);
lv_table_set_cell_value_fmt(sqB_hamonic_table, 1, i, "%s",ub_hamonic_buf);
lv_table_set_cell_value_fmt(sqB_hamonic_table, 2, i, "%s",ib_hamonic_buf);
//C相
snprintf(uc_hamonic_buf, sizeof(uc_hamonic_buf), "%.1f%%", lcd_disp_data.Uc_EHD[i]);
snprintf(ic_hamonic_buf, sizeof(ic_hamonic_buf), "%.1f%%", lcd_disp_data.Ic_EHD[i]);
lv_table_set_cell_value_fmt(sqC_hamonic_table, 1, i, "%s",uc_hamonic_buf);
lv_table_set_cell_value_fmt(sqC_hamonic_table, 2, i, "%s",ic_hamonic_buf);
}我在定时器做了这样的操作
相对来说,耗时的并不是数据的显示,而是数据的采集、处理过程,建议将数据处理好之后再交给lvgl显示,而不是lvgl又要处理(snprintf是比较耗时的函数)又要显示。你可以新建一个lvgl定时器,如果标志位代表数据已经准备好,那么就去读取数据显示(注意多任务间的冲突问题),否则不进行任何处理
你好 老师 我发现还是因为显示的数据太多导致的卡顿 我把所有的snprintf操作都放在for循环中,定时器中for循环中要显示的内容(字符串数组)去除以后 我发现就没有卡顿了,这样我是不是可以把定时器时间弄短一些 然后分批去显示数据这样是不是好点