打印
[STM32F1]

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

[复制链接]
22537|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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 | 只看该作者

这里打勾了没有?









使用特权

评论回复
地板
jiashijiang|  楼主 | 2015-1-1 21:42 | 只看该作者
玄德 发表于 2015-1-1 20:37
这里打勾了没有?

Run to main  打上钩了。就是第一下进程序后,不能运行,要复位或者断电再上电就能运行了。另外,和我加入UCOSiii没关系吧

使用特权

评论回复
5
jiashijiang|  楼主 | 2015-1-1 21:44 | 只看该作者
icecut 发表于 2015-1-1 19:38
应该是仿真器问题吧

我觉得不像是仿真器的问题,不知道那儿没设置对,哎,怎么个整呀!

使用特权

评论回复
6
mmuuss586| | 2015-1-2 10:18 | 只看该作者

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

软件的仿真器设置部分;

使用特权

评论回复
7
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)   ,在这个函数里死循环。

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

使用特权

评论回复
8
求学问路| | 2015-1-2 14:42 | 只看该作者
设置选项中有一个 Reset and Run,打勾选中后保持即可。

使用特权

评论回复
9
jiashijiang|  楼主 | 2015-1-2 14:55 | 只看该作者
求学问路 发表于 2015-1-2 14:42
设置选项中有一个 Reset and Run,打勾选中后保持即可。

我用的IAR编译的,里面没有Reset and Run这项

使用特权

评论回复
10
求学问路| | 2015-1-2 17:36 | 只看该作者
jiashijiang 发表于 2015-1-2 14:55
我用的IAR编译的,里面没有Reset and Run这项

KEIL下载设置中有但不清楚IAR,还有就是BOOT0,B00T1接高度电平的问题, 刚开始接触STM32时遇到过这个问题,但年代久远忘记了。

使用特权

评论回复
11
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)   ,在这个函数里死循环

使用特权

评论回复
12
jiashijiang|  楼主 | 2015-1-3 08:26 | 只看该作者
The stack pointer for stack 'CSTACK' (currently 0x20000E20) is outside the stack range (0x20001C18 to 0x20002018)
没人知道这是为什么?

使用特权

评论回复
13
小浣熊| | 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只是在系统启动时使用,之后就没用了,,所以可以配置的小一点,一面造成太大的浪费。。至于你程序的问题,,应该是其他原因导致的

使用特权

评论回复
14
jiashijiang|  楼主 | 2015-1-3 21:47 | 只看该作者
小浣熊 发表于 2015-1-3 19:49
应用程序启动时要有一个堆栈,不管是裸机,还是基于uCOS,,那就是CSTACK堆栈uCOS-III运行起来后,每个任务 ...

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

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

使用特权

评论回复
评论
myqq12 2015-6-2 15:00 回复TA
我在430里面也遇到这个问题,将栈申请到很大好像也不对,但是脱机跑好像有没有问题,很诡异 
15
董不喝舟| | 2016-2-29 16:00 | 只看该作者
我刚刚也遇到了同样的问题,现在解决了,楼主试试project/options/runtime checking/debugger/download里面的use flash loader打勾试试

使用特权

评论回复
16
749120145| | 2016-12-16 08:41 | 只看该作者
我现在也遇到了这种问题,下载下来直接运行没事,就是在进行仿真调试的时候会出现栈溢出。楼主解决了吗?麻烦给我说一下吧

使用特权

评论回复
17
Wechat| | 2018-8-14 10:15 | 只看该作者
遇到同样问题+1;


不过我是所有栈都说溢出,恳请高手指导

使用特权

评论回复
18
天命风流| | 2019-8-26 11:46 | 只看该作者
我换了一个烧录器就可以了   估计是接线错误  还没查清楚

使用特权

评论回复
19
alternate| | 2019-8-26 15:40 | 只看该作者
程序下进去就需要复位动作的啊

使用特权

评论回复
20
戈卫东| | 2019-8-26 15:59 | 只看该作者
OS有自己的栈管理,那个信息可以无视。

使用特权

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

本版积分规则

13

主题

44

帖子

0

粉丝