AT32F403A 移植FreeRTOS 后 configTOTAL_HEAP_SIZE 设置太大死机

[复制链接]
 楼主| 发表于 2025-5-20 08:55 | 显示全部楼层 |阅读模式
各位大佬  我用AT32F403ARGT7 移植FreeRTOS 跟LVGL RAM 已经修改为了224k 出现了一个问题  如果只是单独跑LVGL RAM超过96k 是没有问题的,但是如果开启freeRTOS在 freeRTOS中运行lvgl就会卡死,我排查过后发现是freeRTOS 导致的,只要freertos开启 且RAM超过96k 就会卡死,我单独运行FREERTOS 将 configMAX_TASK_NAME_LEN 设置到60k 我的ram这个时候是105k FREERTOS就卡死了,这个是什么问题呀?有没有大佬知道的

点评

调试看具体卡在什么位置,才好分析原因。  发表于 2025-5-21 13:37
 楼主| 发表于 2025-5-20 08:58 | 显示全部楼层
只要开启了 FREERTOS RAM超过96k 就会卡死
发表于 2025-5-20 09:30 来自手机 | 显示全部楼层
调试看具体卡在什么位置,才好分析原因。
发表于 2025-5-20 14:46 | 显示全部楼层
找到原因了吗?阁下
 楼主| 发表于 2025-5-20 17:23 | 显示全部楼层
dffzh 发表于 2025-5-20 14:46
找到原因了吗?阁下

还没有 ,不知道什么原因 我用他们的 demo也是这样的,可能是有什么限制,但是我用stm32f407 就没问题。。。。
发表于 2025-5-21 08:44 | 显示全部楼层
耀星空 发表于 2025-5-20 17:23
还没有 ,不知道什么原因 我用他们的 demo也是这样的,可能是有什么限制,但是我用stm32f407 就没问题。 ...

等我抽空帮你看下
 楼主| 发表于 2025-5-21 08:58 | 显示全部楼层
dffzh 发表于 2025-5-21 08:44
等我抽空帮你看下

感谢
发表于 2025-5-21 14:52 | 显示全部楼层

我看了芯片数据手册,这个型号的SRAM总共是224KB, 43634682d741ac58ad.png
1、看下RTOS头文件里的下面三个宏定义配置是多少?
33614682d76bcefc83.png
configMAX_TASK_NAME_LEN是用来配置任务名称最大长度的;
2、你debug仿真一下,程序死机时,你点击停止按钮,看程序计数器PC停在哪个代码位置;
试一下,这样便于找到问题出现在哪里。
3、启动文件里,堆栈分配多少KB?
95792682d73a2e9523.png
发表于 2025-5-22 08:04 | 显示全部楼层
反汇编看死机的地方吧
 楼主| 发表于 2025-5-22 08:55 | 显示全部楼层
dffzh 发表于 2025-5-21 14:52
我看了芯片数据手册,这个型号的SRAM总共是224KB,
1、看下RTOS头文件里的下面三个宏定义配置是多少?

#define configMINIMAL_STACK_SIZE                ( ( unsigned short ) 130 )
#define configTOTAL_HEAP_SIZE                        ( ( size_t ) ( 96 * 1024 ) )
#define configMAX_TASK_NAME_LEN                        ( 10 )

Stack_Size      EQU     0x00002000
Heap_Size       EQU     0x00002000

用的IC型号是  AT32F403A RGT7  用官方的ICP开启了 244k SRAM

发表于 2025-5-22 09:22 | 显示全部楼层
本帖最后由 dffzh 于 2025-5-22 09:27 编辑
耀星空 发表于 2025-5-22 08:55
#define configMINIMAL_STACK_SIZE                ( ( unsigned short ) 130 )
#define configTOTAL_HEAP_SIZE                        ( ( s ...

1、任务名称最大长度为10,你定义的任务名称没有超过10的吧?
2、死机时点击Stop按钮,看反汇编程序停在哪里:
37238682e7c29b5d7d.png
85025682e7c1137885.png
48369682e7c528f642.png
73318682e7c45d37a7.png
3、或者方便的话,直接把V信发来,我有空帮你看下,这样解决速度更快。
49656682e7bb324838.png
 楼主| 发表于 2025-5-22 09:43 | 显示全部楼层
耀星空 发表于 2025-5-22 08:55
#define configMINIMAL_STACK_SIZE                ( ( unsigned short ) 130 )
#define configTOTAL_HEAP_SIZE                        ( ( s ...

奇怪了,用keil debug 仿真 FREERTOS 单独能运行 但是不能用Jlink RTT打印了。然后我把RTT重工程里面删掉后开启lvgl lvgl卡死在vTaskDelay   而且 system_ms 这个值也不正常了  感觉是RTT跟lvgl的问题,还要找一下了

volatile static uint32_t system_ms = 0;

uint32_t millis(void)
{
    return system_ms;
}
void vApplicationTickHook( void )
{
  system_ms++;
}
    while (1) {
        if (xSemaphoreTake(AT_xSemaphore, portMAX_DELAY) == pdTRUE) {
            lv_task_handler();
            xSemaphoreGive(AT_xSemaphore);
        }
         vTaskDelay(5);
    }
 楼主| 发表于 2025-5-22 09:51 | 显示全部楼层
dffzh 发表于 2025-5-22 09:22
1、任务名称最大长度为10,你定义的任务名称没有超过10的吧?
2、死机时点击Stop按钮,看反汇编程序停在哪 ...

加了 lVGL 后 程序就卡死在了 delay 那里 我的lvgl时基 是由 FREERTOS 提供的 不知道什么个问题
989.png
 楼主| 发表于 2025-5-22 09:56 | 显示全部楼层
耀星空 发表于 2025-5-22 09:51
加了 lVGL 后 程序就卡死在了 delay 那里 我的lvgl时基 是由 FREERTOS 提供的 不知道什么个问题
...

看这个报错是 系统时钟挂了  但是不加LVGL 就没挂 lvgl 的时钟用的是FREERTOS的呀,咋会挂了呢,搞不懂
发表于 2025-5-22 10:13 | 显示全部楼层
本帖最后由 dffzh 于 2025-5-22 10:19 编辑
耀星空 发表于 2025-5-22 09:56
看这个报错是 系统时钟挂了  但是不加LVGL 就没挂 lvgl 的时钟用的是FREERTOS的呀,咋会挂了呢,搞不懂{: ...

我大概知道是什么问题了;可能是死锁了。
 楼主| 发表于 2025-5-22 10:15 | 显示全部楼层
耀星空 发表于 2025-5-22 09:56
看这个报错是 系统时钟挂了  但是不加LVGL 就没挂 lvgl 的时钟用的是FREERTOS的呀,咋会挂了呢,搞不懂{: ...

3332682e888a374f9.png 卡死在了这个地方。。。。。
发表于 2025-5-22 10:15 | 显示全部楼层
本帖最后由 dffzh 于 2025-5-22 10:29 编辑
耀星空 发表于 2025-5-22 09:56
看这个报错是 系统时钟挂了  但是不加LVGL 就没挂 lvgl 的时钟用的是FREERTOS的呀,咋会挂了呢,搞不懂{: ...

LVGL的定时延时,不要直接用RTOS里面的,你直接外加一个MCU的定时器外设来处理;这样试试;然后别使用滴答时钟SysTick产生LVGL的时基,这个一般被用于RTOS。vTaskDelay尽量只用于RTOS,其他模块的定时延时,自己加MCU外设定时器处理;
42563682e8a8e5d4f4.png
自己加个MCU的高级定时器来处理LVGL的心跳任务,定时器中断优先级设置高,LVGL的心跳函数比较重要,如果调用间隔不准确,可能会导致显示卡顿或者任务处理不及时等问题。



 楼主| 发表于 2025-5-22 10:58 | 显示全部楼层
dffzh 发表于 2025-5-22 10:15
LVGL的定时延时,不要直接用RTOS里面的,你直接外加一个MCU的定时器外设来处理;这样试试;然后别使用滴答 ...

这样确实可以 ,但是我用stm32 这样用没有问题的,这两个 IC 不是可以平替的吗
发表于 2025-5-22 13:04 | 显示全部楼层
耀星空 发表于 2025-5-22 10:58
这样确实可以 ,但是我用stm32 这样用没有问题的,这两个 IC 不是可以平替的吗 ...

解决就好;
不建议使用的原因就是可能会出问题,但不是百分百会出问题;STM32可以那么使用,也许产品量大了可能就会出一些奇奇怪怪的偶发性Bug;
或者你想弄清楚根因的话,可以尝试咨询一下雅特力MCU的技术支持。
 楼主| 发表于 2025-5-22 14:24 | 显示全部楼层
dffzh 发表于 2025-5-22 13:04
解决就好;
不建议使用的原因就是可能会出问题,但不是百分百会出问题;STM32可以那么使用,也许产品量大 ...

嗯嗯谢谢 大佬,
关于这个问题已经解决了。 因为我的lvgl刷新函数是放在 freertos 一个任务里面的,所以要在这个任务前面重新配置 系统时钟 这样 freeRTOS 跟 LVGL 就都可以正常运行了。 但是就是不知道是什么原因,因为我在创建这个任务前 配置系统时钟 就没有用。  因为不知道什么原因引起的 不敢用  还是用定时器来产生时基,再次感谢大佬的帮助 感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

11

帖子

0

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