硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1402|回复: 7
收起左侧

[emWin] emWin运行一段时间死机,卡在HAL_LTDC_SetAddress()

[复制链接]

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2022-3-13 18:48:29 | 显示全部楼层 |阅读模式
本帖最后由 chance 于 2022-3-13 19:22 编辑

最近参照emWin的WeatherForecast_800x600做了一个Demo,目前只做了背景图片显示和切换的动画;硬件为STM32H743II的开发板。使用HAL库+FreeRTOS+emWin(V544)+Fatfs。每5秒切换一张背景图片,动画类似幻灯片的切出;功能一开始正常,持续运行一段时间后会死机,然后进入HardFault。死机的时间不定,有时候半个小时,有时候3个小时。请教各位如何进一步分析,或有解决过类似问题。

背景图一共有4张800*480的图片,GUI_Task()初始化时通过文件系统加载到内存设备。建立一个背景图片窗口后,创建动画并添加动画和开启定时器,在窗口回调函数WM_PAINT使用GUI_MEMDEV_CopyToLCDAt()定时绘图。

做过以下排查:1) 打印各个任务堆栈,堆栈没有溢出。且CPU占用率还有余量;
image.png

2) emWin分配内存8MB,目前只使用45%。
image.png

3)通过cm_Backtrace,定位到每次死机都是发生在HAL_LTDC_SetAddress()这个函数,显示的问题为:发生用法错误,原因:试图切换到 ARM 状态;

4)开启configCHECK_FOR_STACK_OVERFLOW为1,发生死机时没有printf消息输出。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107397
QQ
发表于 2022-3-13 19:25:27 | 显示全部楼层
底层接口文件不做任何优化,仅仅是告诉emWin使用的显存地址,测试下,这样可以排查底层优化问题,然后再排查emWin应用问题。
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2022-3-13 23:07:11 | 显示全部楼层
测试了将HAL库文件、全部文件编译优化等级都调整为Level 0,还是会死机。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107397
QQ
发表于 2022-3-14 00:25:48 | 显示全部楼层
chance 发表于 2022-3-13 23:07
测试了将HAL库文件、全部文件编译优化等级都调整为Level 0,还是会死机。

二楼说的接口文件调整没
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2022-3-14 20:55:21 | 显示全部楼层
不好意思,硬汉哥。不太理解你指的是那部分,能否再解析下。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107397
QQ
发表于 2022-3-15 10:14:28 | 显示全部楼层
chance 发表于 2022-3-14 20:55
不好意思,硬汉哥。不太理解你指的是那部分,能否再解析下。

image.png
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2022-3-15 22:05:54 | 显示全部楼层
是指关闭DMA2D和多缓冲吗?我的程序是开了DMA2D的。缓冲NUM_BUFFERS定义为3。对比了你的例程,DMA2D是比较大的差异。
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2022-3-19 21:55:00 | 显示全部楼层
eric2013 发表于 2022-3-13 19:25
底层接口文件不做任何优化,仅仅是告诉emWin使用的显存地址,测试下,这样可以排查底层优化问题,然后再排 ...

修改了底层接口文件,仍然会出现死机的情况;函数LCD_X_Config()内只剩下简单的配置了。

  1. void LCD_X_Config(void)
  2. {
  3.   int i;
  4.   //
  5.   // Set display driver and color conversion for 1st layer
  6.   //
  7.   GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER_0, COLOR_CONVERSION_0, 0, 0);
  8.   //
  9.   // Display driver configuration, required for Lin-driver
  10.   //
  11.   LCD_SetSizeEx (0, XSIZE_PHYS, YSIZE_PHYS);
  12.   LCD_SetVSizeEx(0, XSIZE_PHYS, YSIZE_PHYS * NUM_VSCREENS);
  13.    
  14.   layer_prop[0].address=LCD_LAYER0_FRAME_BUFFER;
  15.   
  16.   /* Setting up VRam address and get the pixel size */
  17.   for (i = 0; i < GUI_NUM_LAYERS; i++)
  18.   {
  19.     layer_prop[i].pending_buffer=-1;
  20.     layer_prop[i].pColorConvAPI=(LCD_API_COLOR_CONV *)_apColorConvAPI[i];
  21.    
  22.     /* Setting up VRam address */
  23.     LCD_SetVRAMAddrEx(i, (void *)(layer_prop[i].address));
  24. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-30 05:03 , Processed in 0.236704 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表