基于freertos下的栈溢出问题

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

基于freertos下的栈溢出问题

2,219 Views
jiangshicong
Contributor III

开发板:nxp imxrt1052evkb

自己创建了一个基于freertos的工程,包含了lwip,emwin,fatfs,USB,SDcard,CAN等功能。各个任务创建如下图所示,分配的栈大小总共为 3316WORD,FreeRTOSConfig.h里面#define configTOTAL_HEAP_SIZE           ((size_t)(17 * 1024))。
问题是编译通过后,下载到开发板上,实际运行发现我基于lwip写的client端连接不上服务器,而且也ping不同client开发板,(理论上初始化lwip后,应该是可以ping通的)。后面我一个个任务调试,发现屏蔽掉emwin任务后,就可以了;或者我屏蔽掉SDcard和USB任务后也可以了。这两种注释方法的共同点就是分配的栈大小差不多,由此我推测出可能是栈溢出了,然后我想用vApplicationStackOverflowHook钩子函数查找是哪个任务导致栈溢出,很可惜没有检测到。。。现在不知道怎么办????栈空间的大小代码哪里有限制??求助大神。谢谢

钩子函数,FreeRTOSConfig.h里面#define configCHECK_FOR_STACK_OVERFLOW          2

存储器分配文件定义如下:
#define m_flash_config_start 0x60000000
#define m_flash_config_size 0x00001000

#define m_ivt_start 0x60001000
#define m_ivt_size 0x00001000

#define m_interrupts_start 0x60002000
#define m_interrupts_size 0x00000400

#define m_text_start 0x60002400
#define m_text_size 0x03FFDC00

#define m_data3_start 0x80000000
#define m_data3_size 0x01E00000

#define m_ncache_start 0x81E00000
#define m_ncache_size 0x00200000

#define m_data_start 0x20000000
#define m_data_size 0x00020000

#define m_data2_start 0x20200000
#define m_data2_size 0x00040000

/* Sizes */
#if (defined(__stack_size__))
#define Stack_Size __stack_size__
#else
#define Stack_Size 0x4000
#endif

#if (defined(__heap_size__))
#define Heap_Size __heap_size__
#else
#define Heap_Size 0x4000
#endif

2 Replies

1,757 Views
jiangshicong
Contributor III

以上问题已经解决了。就是重新分配一下存储器,如下:
#define m_flash_config_start 0x60000000
#define m_flash_config_size 0x00001000

#define m_ivt_start 0x60001000
#define m_ivt_size 0x00001000

#define m_interrupts_start 0x60002000
#define m_interrupts_size 0x00000400

#define m_text_start 0x60002400
#define m_text_size 0x03FFDC00

#define m_data3_start 0x80000000
#define m_data3_size 0x01E00000

#define m_ncache_start 0x81E00000
#define m_ncache_size 0x00200000

#define m_data_start 0x20000000
#define m_data_size 0x00020000

#define m_data2_start 0x20200000
#define m_data2_size 0x00040000

/* Sizes */
#if (defined(__stack_size__))
#define Stack_Size __stack_size__
#else
#define Stack_Size 0x4000
#endif

#if (defined(__heap_size__))
#define Heap_Size __heap_size__
#else
#define Heap_Size 0x0200
#endif

虽然问题解决了,但是我还有一个问题,如下:
我查看了keil5生成的.map文件,发现栈大小的设置是在DTCM里面,也就是设置m_data_size就可以决定栈的总大小
#define m_data_start 0x20000000
#define m_data_size 0x00020000

212532q7459auxz7sc5cs7.png

然而我发现参考手册上明明说DTCM有512KB,可是为什么m_data_size只能设置0x20000,即128KB。如果我设置成0x40000,编译没有问题,但是程序下载进去后,运行不起来。为什么?????

1,757 Views
1920844004
Contributor III

你好,参考手册上明明说DTCM有512KB,可是为什么m_data_size只能设置0x20000,即128KB。我估计应该是RT1052只有128KB。且这个大小也是可以设置的,不是不变的。

0 Kudos