RT-Thread论坛
直播中

俞舟群

9年用户 1157经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

rtt5.0.0下lvgl在正点原子stm32f407探索者开发板V3上mdk编译报错怎么解决?

开发板为正点原子STM32f407探索者V3,在rtt5.0.0版本下加入lvgl及相应的lcd, touch驱动,其它什么功能也没加,在mdk中编译,报错:

  • Program Size: Code=232810 RO-data=24750 RW-data=768656 ZI-data=9616
  • Error: Q0147E: Failed to create Directory rtthread.binER_IROM1: File exists


如下图:

上网搜索好象是irom区超了。
我的mdk设置如下:

这应该已经是最大了。
我把网上的帖子都搜索了一遍,好象没看到有说这个问题。
请问各位大佬有遇到这种情况吗?
它最后也能编译出一个文件来,但烧录进开发板后,直接报硬件错。
不知道是我编译出来的文件体积问题,还是程序运行报错,导致报错。



回帖(1)

王树林

2025-9-25 18:17:44

在STM32F407探索者V3开发板上使用RT-Thread 5.0.0和LVGL时遇到编译和运行错误,以下是系统性的解决方案:


1. 解决编译错误 Failed to create Directory rtthread.bin



  • 问题原因:输出目录路径过长或权限问题,导致无法生成.bin文件。

  • 解决方案

    • 缩短工程路径:将整个工程移动到更简单的路径,例如 D:rtthread_project

    • 清理并重建工程:在MDK中执行菜单命令:

      • Project -> Clean Targets

      • Project -> Rebuild all target files


    • 检查防病毒软件:临时关闭实时文件保护功能(如Windows Defender),防止其锁定输出文件。

    • 手动删除残留文件:在工程目录下删除 build 文件夹内的所有内容(尤其是旧 .bin/.axf 文件),确保目录可写。





2. 解决 RW-data=768656 异常值问题



  • 问题分析:RW-data值异常大(768KB),远超STM32F407的192KB RAM,表明内存分配或链接脚本错误。

  • 诊断步骤

    • 检查链接脚本:确认 link.lds 文件中的RAM配置正确:
      MEMORY {
      ROM (rx) : ORIGIN = 0x08000000, LENGTH = 1024K  /* Flash */
      RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K /* 主RAM */
      }

      确保 LENGTH 与实际芯片匹配(主RAM为128KB)。


    • 禁用外部SRAM初始化:在 board.c 中注释掉外部SRAM初始化代码(避免冲突):
      // void rt_hw_board_init() {
      //   ...
      //   #ifdef RT_USING_EXT_SDRAM
      //   rt_system_heap_init((void*)EXT_SRAM_BEGIN, (void*)EXT_SRAM_END);
      //   #endif
      // }

    • 检查LVGL配置:在 lv_conf.h 中降低内存使用:
      #define LV_MEM_SIZE (32 * 1024)  // 推荐32KB,勿超过64KB
      #define LV_DISP_DEF_REFR_PERIOD 30  // 降低刷新率
      #define LV_ATTRIBUTE_LARGE_RAM_ARRAY  // 将大数组分配到特定段





3. 解决烧录后的硬件错误



  • 关键原因:RAM溢出或栈空间不足导致运行时崩溃。

  • 解决方案

    • 调整栈大小:增大主线程栈空间(在 rtconfig.h 中):
      #define RT_MAIN_THREAD_STACK_SIZE 4096  // 原值可能为1024或2048

    • 启用MPU保护:在 board.h 中定义防止非法内存访问:
      #define RT_USING_MPU

    • 检查中断优先级:确保LVGL定时器中断优先级合理(避免抢占冲突):
      #define LV_TICK_CUSTOM_SYS_TIME_EXPR (rt_tick_get_millisecond())





4. 优化LVGL性能与内存



  • 启用双帧缓冲:利用STM32F4的LTDC外接显存(外部SRAM):
     // 在显示驱动初始化中配置
    static lv_disp_buf_t disp_buf;
    static lv_color_t buf1[LV_HOR_RES_MAX * 10]; // 内部RAM行缓冲
    static lv_color_t buf2[LV_HOR_RES_MAX * 10];
    lv_disp_buf_init(&disp_buf, buf1, buf2, LV_HOR_RES_MAX * 10);

  • 使用DMA2D加速:在 lv_conf.h 启用硬件加速:
     #define LV_USE_GPU_STM32_DMA2D 1




5. 验证步骤



  1. 最小系统测试:暂时移除LVGL,仅保留RT-Thread内核,确认基础工程能运行。

  2. 逐步添加组件:先添加LCD驱动(无LVGL),再逐步集成LVGL。

  3. 监视内存使用:使用 msh 命令查看内存:
      free  # 查看堆剩余
      list_mem  # 详细内存分布


最终配置示意图


// lv_conf.h 关键配置
#define LV_COLOR_DEPTH 16
#define LV_MEM_SIZE (32 * 1024)
#define LV_USE_GPU_STM32_DMA2D 1

// rtconfig.h 系统配置
#define RT_MAIN_THREAD_STACK_SIZE 4096
#define RT_USING_MPU

通过以上调整,可解决编译错误和硬件故障,确保LVGL流畅运行。如问题仍存,请提供 map 文件分析内存分布。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分