|

楼主 |
发表于 2024-11-4 10:30:00
|
显示全部楼层
主要还是想解决摄像头传递图像不正确、完整,以及返回时的硬件错误问题。lvgl任务栈和lvgl memsize都设置的挺大的,应该不会是它们的问题
单任务和多任务都有这个问题,单任务甚至百分百触发。
void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
{
CAM_Stop();
g_tCam.CaptureOk = 1; /* 表示DMA传输结束 */
lv_event_send(guider_ui.screen_1_canvas_1, LV_EVENT_VALUE_CHANGED, NULL);
}
static void screen_1_btn_1_event_handler (lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
switch (code) {
case LV_EVENT_CLICKED:
{
osMutexAcquire(LVGLMutex,0);
ui_load_scr_animation(&guider_ui, &guider_ui.screen, guider_ui.screen_del, &guider_ui.screen_1_del, setup_scr_screen, LV_SCR_LOAD_ANIM_NONE, 200, 200, true, true);
lv_timer_resume(lv_timer_dclock);//返回主页面,拉起时钟
lv_timer_resume(lv_timer_update);
#if ANOTHERTASK
vTaskSuspend(ThreadCAMERA);
#else
flag =1;
#endif
osMutexRelease(LVGLMutex);
break;
}
default:
break;
}
}
static void screen_btn_2_event_handler (lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
switch (code) {
case LV_EVENT_CLICKED:
{
osMutexAcquire(LVGLMutex,0);
ui_load_scr_animation(&guider_ui, &guider_ui.screen_1, guider_ui.screen_1_del, &guider_ui.screen_del, setup_scr_screen_1, LV_SCR_LOAD_ANIM_NONE, 200, 200, true, true);
lv_timer_pause(lv_timer_dclock); //进入摄像头页面,关闭时钟
lv_timer_pause(lv_timer_update);
#if ANOTHERTASK
vTaskResume(ThreadCAMERA);
#else
flag =0;
CAM_Start1(SDRAM_CAMERA); //刷新一次,以让canvas控件左脚踩右脚
#endif
osMutexRelease(LVGLMutex);
break;
}
default:
break;
}
}
static void screen_1_canvas_1_event_handler (lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
switch (code) {
case LV_EVENT_VALUE_CHANGED:
{
osMutexAcquire(LVGLMutex,0);
#if ANOTHERTASK
lv_obj_invalidate(guider_ui.screen_1_canvas_1);
#else
if(!flag)
{
lv_obj_invalidate(guider_ui.screen_1_canvas_1);
CAM_Start1(SDRAM_CAMERA);
}
#endif
osMutexRelease(LVGLMutex);
// printf("flush once!\r\n ");
break;
}
default:
break;
}
}
static void screen_1_canvas_1_event_handler (lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
switch (code) {
case LV_EVENT_VALUE_CHANGED:
{
osMutexAcquire(LVGLMutex,0);
#if ANOTHERTASK
lv_obj_invalidate(guider_ui.screen_1_canvas_1);
#else
if(!flag)
{
lv_obj_invalidate(guider_ui.screen_1_canvas_1);
CAM_Start1(SDRAM_CAMERA);
}
#endif
osMutexRelease(LVGLMutex);
// printf("flush once!\r\n ");
break;
}
default:
break;
}
}
分别是我的回调以及两个按钮触发页面更换,以及canvas控件刷新的逻辑,Anothertask是我昨晚测试两种方法时定义的宏,flag是我临时拿出来给单任务的全局标志。
互斥量感觉没什么意义,是刚刚才加上的。硬汉哥或者其他搞过的大佬能不能帮忙看下
|
|