OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6737|回复: 3

基于freertos下的栈溢出问题

[复制链接]

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2018-8-6
在线时间
13 小时
发表于 2018-10-11 22:46:40 | 显示全部楼层 |阅读模式
1金钱
开发板: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钩子函数查找是哪个任务导致栈溢出,很可惜没有检测到。。。现在不知道怎么办????栈空间的大小代码哪里有限制??求助大神。谢谢
微信图片_20181011221232.png
钩子函数,FreeRTOSConfig.h里面#define configCHECK_FOR_STACK_OVERFLOW          2
微信图片_20181011224232.png
存储器分配文件定义如下:
#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



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-10-12 02:05:07 | 显示全部楼层
回复

使用道具 举报

0

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2018-5-9
在线时间
164 小时
发表于 2018-10-12 14:32:28 | 显示全部楼层
用cmbacktrace调试一下
回复

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2018-8-6
在线时间
13 小时
 楼主| 发表于 2018-10-13 21:27:10 | 显示全部楼层
以上问题已经解决了。就是重新分配一下存储器,如下:
#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

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

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 13:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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