-
2020-12-19 21:38:05
IAR自动0x0100到 0x013F 设置为空,没听说过。
以下时我一个程序生成的MAP文件:
SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN
======= ===== ============= =========== ==== ==== =====
INTVEC CODE 00000000 - 00000027 28 com 1
?FILL1 CODE 00000028 - 00000053 2C rel 0
DIFUNCT CODE 00000054 - 00000055 2 rel 0
CODE CODE 00000056 - 00000715 6C0 rel 1
INITTAB CODE 00000716 - 00000721 C rel 0
NEAR_ID CODE 00000722 - 0000072D C rel 0
ABSOLUTE DATA 0000003A - 0000003B 2 rel 0
DATA 00000052 - 00000053 2
DATA 00000059 - 00000059 1
DATA 0000005F - 0000005F 1
CSTACK DATA 00000060 - 000000C3 64 dse 0
NEAR_HEAP DATA 000000C4 - 000000F5 32 dse 0
RSTACK DATA 000000F6 - 00000159 64 dse 0
NEAR_I DATA 0000015A - 00000165 C rel 0
NEAR_Z DATA 00000166 - 00000195 30 rel 0
EEPROM_I XDATA 00000000 - 00000000 1 rel 0
可以看出,在RAM里面,首先是CSTACK和RSTACK,然后是NEAR_I和NEAR_Z。
CSTACK是从0X60开始的,并没有空出一段空间不用。
IAR的CSTACK,NEAR_HEAP和RSTACK是预先分配好的,占用存储空间是固定不变的,相当于定义了一个全局数组,
CSTACK,NEAR_HEAP和RSTACK在NEAR_I和NEAR_Z之前还是之后,效果是一样的。
改动连接脚本文件.xcl,也可以把CSTACK,NEAR_HEAP和RSTACK放在NEAR_I和NEAR_Z之后。
GCC堆栈策略与IAR不同。堆栈大小不是预先分配好的,而是把SRAM里面剩余空间作为堆栈空间。
GCC堆栈只使用单指针SP,IAR堆栈使用双指针SP和Y。
GCC堆栈空间利用率更高,而IAR访问堆栈更快。
更多相关内容 -
IAR集成开发环境如何设置堆栈大小
2020-12-19 21:38:14[转]IAR集成开发环境如何设置堆栈大小GCC和IAR分配堆栈的方式不同,IAR先分配堆栈空间,相当于定义一个全局数组为堆栈空间,堆栈初始为堆栈空间最高地址;GCC不用先分配堆栈,自动把RAM剩余空间作为堆栈空间,堆栈...[
转
] IAR
集成开发环境如何设置堆栈大小
GCC
和
IAR
分配堆栈的方式不同,
IAR
先分配堆栈空间,相当于定义一个
全局数组为堆栈空间,堆栈初始为堆栈空间最高地址;
GCC
不用先分配堆栈,
自动把
RAM
剩余空间作为堆栈空间,堆栈初始为
RAM
最高地址。
初学者很容易忽视这个问题,造成程序跑飞而找不到问题的症结,我在用
IAR For MSP430
的时候没遇到过这个问题,
因为
MSP430
的
RAM
比较大,
IAR
默认是
80
字节,足够一般程序使用。
但是使用
IAR For SAM8
的时候,
有一个比较耗费堆栈的程序运行一段时间
后出问题,
由于要记录一个
24
小时的数组,
而数组元素的值是在堆栈里改变的,
所以,记录到一定时间以后,出现了堆栈不足的情况,初学者如果没有仿真器,
是很难发现这个问题的,还好我用的仿真器在
Debug
的时候出现了堆栈不足的
警告,我才意识到是这里问题。
IAR For SAM8
默认堆栈是
32
字节,
既然不够用,
那么就要增大,
但是设置
到多少合适呢?
首先编译你的程序,看程序用了多少自己的
RAM
,
转载
]IAR
下
Data stack(CSTACK)
的设置问题
" alt="[
转载
]IAR
下
Data stack(CSTACK)
的设置问题
"
src="http://s13.sinaimg.cn/middle/51f1a413g82a17692080c&690">
在看看芯片的
Datasheet
,看看芯片总共有多大的
RAM
,
转载
]IAR
下
Data stack(CSTACK)
的设置问题
" alt="[
转载
]IAR
下
Data stack(CSTACK)
的设置问题
"
src="http://s7.sinaimg.cn/middle/51f1a413gd1a4eeb64da6&690"
real_src="http://s7.sinaimg.cn/middle/51f1a413gd1a4eeb64da6&690">
好了现在你就知道剩余多少
RAM
了:
208-142=66
(
Byte
)
前面说过
IAR
的
CSTACK,NEAR_HEAP
和
RSTACK
是预先分配好的,占
用存储空间是固定不变的,相当于定义了一个全局数组,
GCC
堆栈策略与
IAR
不同,堆栈大小不是预先分配好的,而是把
SRAM
里面剩余空间作为堆栈空间。
如果是
GCC
,
那么编译器就会自动设置剩余的
RAM
为数据堆栈
(和数据返
回堆栈
RSTACK
,
NEAR_HEAP
等)。
在
IAR
里,
STACK
应该设置到多少呢?
在工程
-
》
Options-
》
Linker-
》
List
(不同的
IAR
版本会稍有不同),选择生
成
LIST
文件,并包含
stack
选项
转载
]IAR
下
Data stack(CSTACK)
的设置问题
" alt="[
转载
]IAR
下
Data stack(CSTACK)
的设置问题
"
src="http://s11.sinaimg.cn/middle/51f1a413g82a19e1658ea&690"
real_src="http://s11.sinaimg.cn/middle/51f1a413g82a19e1658ea&690">
在
./Debug/list
目录下,得到
.map
(可能是
.lst
等其他格式)文件,用记事本
打开,找到以下内容:
****************************************
* *
* CALL GRAPH *
* *
****************************************
-
IAR修改堆栈大小
2019-06-15 11:31:48前提概要 之前使用KEIL进行作为工程编辑时,堆(Heap)栈(Stack)大小在起始代码中... 在KEIL中,直接修改上图中箭头指向值即可实现调整堆栈的大小 下图为IAR中参考代码 提示 以上的参考代码为同一STM32芯片分...前提概要
之前使用KEIL进行作为工程编辑时,堆(Heap)栈(Stack)大小在起始代码中进行修改
下图为KEIL中参考起始代码
说明
在KEIL中,直接修改上图中箭头指向值即可实现调整堆栈的大小
下图为IAR中参考代码
提示
以上的参考代码为同一STM32芯片分别在IAR和KEIL中的起始代码顶部位置的代码
说明
IDE不同,导致起始代码也不同,同样导致相关的配置也有不同
IAR中修改堆栈大小(参考下图)
说明
修改图中箭头指向的值,即可实现修改堆栈大小
-
IAR MSP430设置合理堆栈大小(the stack pointer for stack is outside the stack range)
2021-02-27 15:04:50摘要:本文给出IAR设置堆栈合理大小的详细方法,并分享一些好博文(icf及map讲解)。最近在MSP430-169LCD(MSP430F169,RAM为2KB)调试一些ucos演示例子,IAR for MSP430默认的堆栈大小是80字节,编译可以通过,运行结果...摘要:
本文给出IAR设置堆栈合理大小的详细方法,并分享一些好博文(icf及map讲解)。
最近在MSP430-169LCD(MSP430F169,RAM为2KB)调试一些ucos演示例子,IAR for MSP430默认的堆栈大小是80字节,编译可以通过,运行结果不确定性,调试过程会提示"the stack pointer for stack is outside the stack range",堆栈溢出。那么,到底设置多大的堆栈够用且不浪费呢。
一、合理设置堆栈大小
首先,查看程序共需要多大的堆栈,生成map文件,方法如下:
图1 生成map文件
生成的map文件在项目目录下的/Debug/List,打开map文件在CALL GRAPH找到找到栈的最大使用量(我的理解是main主函数,用栈最多,所以直接拉到文件末尾,靠近SEGMENTS IN ADDRESS ORDER的地方),如下图所示:
图2 最大栈使用
由上图可知,最大栈使用量是00000076(注意这里是16进制),即118字节。
接着,设置堆栈大小,方法如下,可以设置比最大栈稍微大一些:-)
图3 设置栈大小
二、一点小心得
通过上述方法,设置堆栈后,再编译有可能会报如下连接错误(受限的内存远不够使用):
图4 内存不够用链接错误
此时,唯一的办法就是重新设计程序了。在单片机上跑uC/OS,可以通过以下方法来减少内存使用:
(1)如果是跑uC/OS,可以在os_cfg.h文件配置系统,如将最大任务数(OS_MAX_TASKS)设小一些,关掉一些扩展功能(以EN结尾的变量)
(2)将一些局部变量数组设成全局变量(我就遇到这个问题,我想在MSP430-169LCD完成类似printf功能,难免需要一些字符数组)
三、我的疑问
在实际调试过程中,尽管我把堆栈设得比查看map文件堆栈要大得多(map文件是0x76,即118,我设成250),调试的时候,依然有这个问题,如下:
Sat Dec 22, 2012 22:23:21: The stack pointer for stack 'Stack' (currently Memory:0x55A) is outside the stack range (Memory:0x906 to Memory:0xA00)
很费解,求指点Jelline@126.com
四、一些好资料
-
IAR设置堆栈大小的问题
2020-12-19 21:38:11第1页IAR设置堆栈大小的问题GCC和IAR分配堆栈的方式不同,IAR先分配堆栈空间,相当于定义一个全局数组为堆栈空间,堆栈初始为堆栈空间最高地址;GCC不用先分配堆栈,自动把RAM剩余空间作为堆栈空间,堆栈初始为RAM... -
IAR开发STM32堆栈设置
2020-12-19 21:38:15一、前言关于堆栈的定义在此就不赘述,详细内容可以看这篇博客。...本文介绍两种获取栈最大消耗的方法,以方便合理设置栈的大小。二、方法1、方法一栈指针 SP 指向的位置可以反应出当前栈的消耗量。在 STM... -
Heap堆的理解以及在IAR中如何设置堆的大小
2021-08-05 10:29:21前提概要 ... 在KEIL中,直接修改上图中箭头指向值即可实现调整堆栈的大小 下图为IAR中参考代码 提示 以上的参考代码为同一STM32芯片分别在IAR和KEIL中的起始代码顶部位置的代码 ... -
IAR MSP430设置合理堆栈大小
2020-12-19 21:38:07最近在MSP430-169LCD(MSP430F169,RAM为2KB)调试一些ucos演示例子,IAR for MSP430默认的堆栈大小是80字节,编译可以通过,运行结果不确定性,调试过程会提示"the stack pointer for stack is outside the stack ... -
IAR编译器堆栈溢出问题查找
2014-03-21 12:20:07在编写程序时往往因为代码不规范,而造成堆栈溢出的问题,这种问题困扰了不少编程新人,希望此文档能对你处理堆栈溢出时有所帮助 -
关于IAR7.51A中的堆栈设置问题
2020-12-29 06:54:27您好:我用8.20版本的IAR打开原来的工程文件,选择device为CC2530F256后,编译提示一下错误:Error[e16]: Segment RAM_CODE_FLASH (size: 0x27 align: 0) is too long for segment definition. At least 0x4 more ... -
栈的理解以及如何计算程序所需栈的大小并在IAR中设置栈
2020-12-19 21:38:10#设置stack大小 程序需要的stack大小前面已经计算出来了,那么怎么设置呢? 如下图,在项目的Linker选项里设置。 Linker的 Config选项卡里点击Edit变更设置。 Stack/Heap Sizes选项卡里变更CSTACK的大小. 或者是用... -
IAR STM32 最大堆栈分析
2020-03-21 14:49:09IAR有相关选项,编译完成后,自动分析最大堆栈深度,并将分析结果放在map文件中。 具体操作如下: 01堆栈使用理论分析 1、通过下方路径选项勾选,使能堆栈理论分析。 Project > Options > Linker > ... -
IAR堆栈溢出的问题
2020-12-15 23:57:25现在感觉不单单是软件问题,因为我例程1个字没改往开发板里都下不进去了。。。现在就是怀疑STM的FLASH被锁定了,导致我无法下载。。下面是例程的map*******************************************... -
如何解决IAR不能设置断点的问题
2017-06-04 21:38:18推荐 分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang 我的网站:...IAR在线调试不能... -
IAR环境下STM32F1xx堆栈的外部SRAM实现
2014-09-29 11:19:07STM32的FSMC总线上挂载一个SRAM,实现将堆栈空间放在该外部SRAM中。开发工具使用的是IAR 5.4 -
在IAR下如何查看工程的堆栈(STM32)
2018-06-27 11:37:43在IAR下编程,难免少不了要跟堆栈打交道,但是打交道之前也要知道堆栈的大小,以及堆栈的位置在哪里?Options->Linker->Overridde default->Edit查看芯片的堆栈大小这里可以看到我们使用的堆栈... -
不了解ARM硬件堆栈(使用IAR)
2020-12-19 21:38:03每种模式都有自己的堆栈.诸如中断之类的事情涉及通过在切换到其他模式之前保存上下文寄存器(我相信是保存到当前模式的堆栈)来切换模式.使用RTOS不会改变这些堆栈的用途,但是有时RTOS可能对此有要求(您可能希望对CMX... -
处理IAR无法设置断点的问题
2016-08-05 11:00:25今天遇到了IAR无法设置断点的问题。这个问题之前是没有遇到的,并且我这个工程之前也是可以设置断点的。用了一些网友的方法都没有解决问题,后来自己摸索了一个方法,记录一下: 在project下边点击clean,把已经... -
IAR中更改堆栈的大小
2019-12-09 20:19:17##IAR中更改堆栈大小 IAR版本7.20 在项目配置界面中,打开Linker 完成之后 在这就可以改了。 -
解决IAR不能设置断点
2019-08-02 08:57:03一、本人遇到的问题 ...这个时候就容易出现:在先调试过程中,在反汇编的窗口中可以设置断点,在C编译区不能设置断点。 Project -> Options -> C/C++ Compiler -> Optimizations选择优化的等级: -
IAR集成开发环境中无法设置断点的问题
2019-03-12 23:17:12使用IAR集成编译环境做嵌入式开发,调试代码时经常遇到无法设置断点,各种帖子提供的方法也都尝试过,还是没有完美的办法,毕竟咱们使用的破解版的,bug巨多。 废话少说,无意间发现的一个小骚操作,直接... -
IAR调试使用技巧汇总:数据断点、CallStack、设置堆栈、查看栈使用和栈深度、Memory、Set Next Statement等
2019-10-30 10:34:523.设置堆栈大小 4.静态查看程序Stack栈使用详情,以及栈深度 5.动态查看程序运行Stack占用情况 6.Call stack查看当前栈空间 7.使用Memory查看程序运行中各种过程数据 8.IAR Map文件解析堆栈信息 9.IAR xx.icf存储... -
IAR程序调试方法说明.doc
2020-07-29 13:58:03它不仅支持单步、断点、变量和表达式监测、寄存器和堆栈信息查看等基本调试功能,还支持反汇编等其他特性。相对于打印日志的调试方式,使用C-SPY调试工具对程序进行调试,具有更直观、更高效且不依赖于串口等优势。... -
IAR 中设置 CSTACK HEAP作用
2022-04-20 11:45:36Stack打开Stack观察窗口,程序运行一段时间后,手动或由断点让程序暂停运行,stack窗口将显示应用程序运行到当前位置的实际堆栈使用情况 2. HEAP:限制动态分配内存(C函数库中的malloc)的大小,不用可以设置... -
解决IAR main函数内能设置断点,但其他地方不能设置断点的问题
2020-12-28 09:19:061、是否是断点太多? 尝试把所有断点都清除掉,然后再运行试试 2、优化等级是否开到最高? -
掌控堆栈确保系统稳定 IAR技术手册翻译
2018-01-06 16:23:57翻译自 IAR 技术手册 堆和栈在嵌入式系统中是非常基础的概念。正确设置堆和栈的大小对于系统的稳定可靠非常重要。不正确设置时,系统可能会以某种非常奇怪的方式崩溃而造成灾难性的后果。 堆和栈的大小必须被...