打印

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

[复制链接]
1939|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
各位大佬  我用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 回复TA
调试看具体卡在什么位置,才好分析原因。 
沙发
耀星空|  楼主 | 2025-5-20 08:58 | 只看该作者
只要开启了 FREERTOS RAM超过96k 就会卡死

使用特权

评论回复
板凳
tanleitanlei| | 2025-5-20 09:30 | 只看该作者
调试看具体卡在什么位置,才好分析原因。

使用特权

评论回复
地板
dffzh| | 2025-5-20 14:46 | 只看该作者
找到原因了吗?阁下

使用特权

评论回复
5
耀星空|  楼主 | 2025-5-20 17:23 | 只看该作者
dffzh 发表于 2025-5-20 14:46
找到原因了吗?阁下

还没有 ,不知道什么原因 我用他们的 demo也是这样的,可能是有什么限制,但是我用stm32f407 就没问题。。。。

使用特权

评论回复
6
dffzh| | 2025-5-21 08:44 | 只看该作者
耀星空 发表于 2025-5-20 17:23
还没有 ,不知道什么原因 我用他们的 demo也是这样的,可能是有什么限制,但是我用stm32f407 就没问题。 ...

等我抽空帮你看下

使用特权

评论回复
7
耀星空|  楼主 | 2025-5-21 08:58 | 只看该作者
dffzh 发表于 2025-5-21 08:44
等我抽空帮你看下

感谢

使用特权

评论回复
8
dffzh| | 2025-5-21 14:52 | 只看该作者

我看了芯片数据手册,这个型号的SRAM总共是224KB,
1、看下RTOS头文件里的下面三个宏定义配置是多少?

configMAX_TASK_NAME_LEN是用来配置任务名称最大长度的;
2、你debug仿真一下,程序死机时,你点击停止按钮,看程序计数器PC停在哪个代码位置;
试一下,这样便于找到问题出现在哪里。
3、启动文件里,堆栈分配多少KB?

95792682d73a2e9523.png (78.63 KB )

95792682d73a2e9523.png

使用特权

评论回复
9
zjsx8192| | 2025-5-22 08:04 | 只看该作者
反汇编看死机的地方吧

使用特权

评论回复
10
耀星空|  楼主 | 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

使用特权

评论回复
11
dffzh| | 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按钮,看反汇编程序停在哪里:




3、或者方便的话,直接把V信发来,我有空帮你看下,这样解决速度更快。

49656682e7bb324838.png (121.43 KB )

49656682e7bb324838.png

使用特权

评论回复
12
耀星空|  楼主 | 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);
    }

使用特权

评论回复
13
耀星空|  楼主 | 2025-5-22 09:51 | 只看该作者
dffzh 发表于 2025-5-22 09:22
1、任务名称最大长度为10,你定义的任务名称没有超过10的吧?
2、死机时点击Stop按钮,看反汇编程序停在哪 ...

加了 lVGL 后 程序就卡死在了 delay 那里 我的lvgl时基 是由 FREERTOS 提供的 不知道什么个问题

989.png (132.51 KB )

989.png

使用特权

评论回复
14
耀星空|  楼主 | 2025-5-22 09:56 | 只看该作者
耀星空 发表于 2025-5-22 09:51
加了 lVGL 后 程序就卡死在了 delay 那里 我的lvgl时基 是由 FREERTOS 提供的 不知道什么个问题
...

看这个报错是 系统时钟挂了  但是不加LVGL 就没挂 lvgl 的时钟用的是FREERTOS的呀,咋会挂了呢,搞不懂

使用特权

评论回复
15
dffzh| | 2025-5-22 10:13 | 只看该作者
本帖最后由 dffzh 于 2025-5-22 10:19 编辑
耀星空 发表于 2025-5-22 09:56
看这个报错是 系统时钟挂了  但是不加LVGL 就没挂 lvgl 的时钟用的是FREERTOS的呀,咋会挂了呢,搞不懂{: ...

我大概知道是什么问题了;可能是死锁了。

使用特权

评论回复
16
耀星空|  楼主 | 2025-5-22 10:15 | 只看该作者
耀星空 发表于 2025-5-22 09:56
看这个报错是 系统时钟挂了  但是不加LVGL 就没挂 lvgl 的时钟用的是FREERTOS的呀,咋会挂了呢,搞不懂{: ...

卡死在了这个地方。。。。。

使用特权

评论回复
17
dffzh| | 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外设定时器处理;

自己加个MCU的高级定时器来处理LVGL的心跳任务,定时器中断优先级设置高,LVGL的心跳函数比较重要,如果调用间隔不准确,可能会导致显示卡顿或者任务处理不及时等问题。



使用特权

评论回复
18
耀星空|  楼主 | 2025-5-22 10:58 | 只看该作者
dffzh 发表于 2025-5-22 10:15
LVGL的定时延时,不要直接用RTOS里面的,你直接外加一个MCU的定时器外设来处理;这样试试;然后别使用滴答 ...

这样确实可以 ,但是我用stm32 这样用没有问题的,这两个 IC 不是可以平替的吗

使用特权

评论回复
19
dffzh| | 2025-5-22 13:04 | 只看该作者
耀星空 发表于 2025-5-22 10:58
这样确实可以 ,但是我用stm32 这样用没有问题的,这两个 IC 不是可以平替的吗 ...

解决就好;
不建议使用的原因就是可能会出问题,但不是百分百会出问题;STM32可以那么使用,也许产品量大了可能就会出一些奇奇怪怪的偶发性Bug;
或者你想弄清楚根因的话,可以尝试咨询一下雅特力MCU的技术支持。

使用特权

评论回复
20
耀星空|  楼主 | 2025-5-22 14:24 | 只看该作者
dffzh 发表于 2025-5-22 13:04
解决就好;
不建议使用的原因就是可能会出问题,但不是百分百会出问题;STM32可以那么使用,也许产品量大 ...

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

11

帖子

0

粉丝