[STM32F1] IAR堆栈溢出The stack pointer for stack 'CSTACK' is outside the stack range

[复制链接]
 楼主| jiashijiang 发表于 2015-1-1 19:18 | 显示全部楼层 |阅读模式
本帖最后由 jiashijiang 于 2015-1-2 18:07 编辑

   用IAR编译的程序,第一次把程序下进STM32里后,不运行,但是复位后就能运行,或者掉电再上电也能运行。为什么把程序第一次下进STM32不运行?

BOOT1=0  BOOT0=0  从用户闪存启动,正常的工作模式。
   

    IAR中在的linker 中作如下设置
stm32f10x_flash.icf 对应生成的代码放在内部 flash 中运行

为什么会是这个样子?
icecut 发表于 2015-1-1 19:38 | 显示全部楼层
应该是仿真器问题吧
玄德 发表于 2015-1-1 20:37 | 显示全部楼层

这里打勾了没有?

无标题.png







 楼主| jiashijiang 发表于 2015-1-1 21:42 | 显示全部楼层
玄德 发表于 2015-1-1 20:37
这里打勾了没有?

Run to main  打上钩了。就是第一下进程序后,不能运行,要复位或者断电再上电就能运行了。另外,和我加入UCOSiii没关系吧
 楼主| jiashijiang 发表于 2015-1-1 21:44 | 显示全部楼层
icecut 发表于 2015-1-1 19:38
应该是仿真器问题吧

我觉得不像是仿真器的问题,不知道那儿没设置对,哎,怎么个整呀!
mmuuss586 发表于 2015-1-2 10:18 | 显示全部楼层

应该是哪里设置问题;
用KEIL也一样的;

软件的仿真器设置部分;
 楼主| jiashijiang 发表于 2015-1-2 13:50 | 显示全部楼层
mmuuss586 发表于 2015-1-2 10:18
应该是哪里设置问题;
用KEIL也一样的;

我先说下现象,把程序第一次下进CPU没运行,复位后或重新上电正常运行,太奇怪了!

  在IAR的debugger方式下,出现一个报警
The stack pointer for stack 'CSTACK' (currently 0x20000E20) is outside the stack range (0x20001C18 to 0x20002018)
查了些资料,说是堆栈溢出,我就开了一个任务,点亮LED灯,用的是CPU的PC3、PC4、PC5引脚。

一步一步跟踪调试,发现问题就出在任务切换的时候,在空闲任务void  OS_IdleTask (void *p_arg)   ,在这个函数里死循环。

为什么复位后就能正常运行了,哎 。。。

求学问路 发表于 2015-1-2 14:42 | 显示全部楼层
设置选项中有一个 Reset and Run,打勾选中后保持即可。
 楼主| jiashijiang 发表于 2015-1-2 14:55 | 显示全部楼层
求学问路 发表于 2015-1-2 14:42
设置选项中有一个 Reset and Run,打勾选中后保持即可。

我用的IAR编译的,里面没有Reset and Run这项
求学问路 发表于 2015-1-2 17:36 | 显示全部楼层
jiashijiang 发表于 2015-1-2 14:55
我用的IAR编译的,里面没有Reset and Run这项

KEIL下载设置中有但不清楚IAR,还有就是BOOT0,B00T1接高度电平的问题, 刚开始接触STM32时遇到过这个问题,但年代久远忘记了。
 楼主| jiashijiang 发表于 2015-1-2 18:03 | 显示全部楼层

RE: IAR编译 The stack pointer for stack 'CSTACK' is outside the stack range

求学问路 发表于 2015-1-2 17:36
KEIL下载设置中有但不清楚IAR,还有就是BOOT0,B00T1接高度电平的问题, 刚开始接触STM32时遇到过这个问 ...

我的问题应该和BOOT0,B00T1的设置没关系,现在我发现问题是这个
The stack pointer for stack 'CSTACK' (currently 0x20000E20) is outside the stack range (0x20001C18 to 0x20002018)

一步一步跟踪调试,发现问题就出在任务切换的时候,在空闲任务void  OS_IdleTask (void *p_arg)   ,在这个函数里死循环
 楼主| jiashijiang 发表于 2015-1-3 08:26 | 显示全部楼层
The stack pointer for stack 'CSTACK' (currently 0x20000E20) is outside the stack range (0x20001C18 to 0x20002018)
没人知道这是为什么?
小浣熊 发表于 2015-1-3 19:49 | 显示全部楼层
应用程序启动时要有一个堆栈,不管是裸机,还是基于uCOS,,那就是CSTACK堆栈uCOS-III运行起来后,每个任务有自己的堆栈,所以,当任务运行的时候,IAR编译器会识别到堆栈指针不在CSTACK之内,所以会报The stack pointer for stack 'CSTACK' (currently 0x20007A1C) is outside the stack range (0x20008B88 to 0x20009B88) 这个不是问题,是正常的,,当然,uCOS-III官方移植中,中断堆栈也是独立的,专门用于处理中断,这个好处就是:每个任务堆栈不必考虑中断嵌套层数,从而不用为中断嵌套增加堆栈大小。所以执行中断程序时,也会报The stack pointer for stack 'CSTACK' (currently 0x20007A1C) is outside the stack range (0x20008B88 to 0x20009B88) CSTACK只是在系统启动时使用,之后就没用了,,所以可以配置的小一点,一面造成太大的浪费。。至于你程序的问题,,应该是其他原因导致的
 楼主| jiashijiang 发表于 2015-1-3 21:47 | 显示全部楼层
小浣熊 发表于 2015-1-3 19:49
应用程序启动时要有一个堆栈,不管是裸机,还是基于uCOS,,那就是CSTACK堆栈uCOS-III运行起来后,每个任务 ...

先说下程序现象,用IAR编译的程序,第一次把程序下进STM32里后,不运行,但是复位后就能运行,或者掉电再上电也能运行。为什么把程序第一次下进STM32不运行?

一步一步跟踪调试,发现问题就出在任务切换的时候,在空闲任务void  OS_IdleTask (void *p_arg)   ,移植在这个函数里死循环

评论

我在430里面也遇到这个问题,将栈申请到很大好像也不对,但是脱机跑好像有没有问题,很诡异  发表于 2015-6-2 15:00
董不喝舟 发表于 2016-2-29 16:00 | 显示全部楼层
我刚刚也遇到了同样的问题,现在解决了,楼主试试project/options/runtime checking/debugger/download里面的use flash loader打勾试试
749120145 发表于 2016-12-16 08:41 | 显示全部楼层
我现在也遇到了这种问题,下载下来直接运行没事,就是在进行仿真调试的时候会出现栈溢出。楼主解决了吗?麻烦给我说一下吧
Wechat 发表于 2018-8-14 10:15 | 显示全部楼层
遇到同样问题+1;
151945b723b2d54e8a.png

不过我是所有栈都说溢出,恳请高手指导
天命风流 发表于 2019-8-26 11:46 | 显示全部楼层
我换了一个烧录器就可以了   估计是接线错误  还没查清楚
alternate 发表于 2019-8-26 15:40 | 显示全部楼层
程序下进去就需要复位动作的啊
戈卫东 发表于 2019-8-26 15:59 | 显示全部楼层
OS有自己的栈管理,那个信息可以无视。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

44

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部