精华内容
下载资源
问答
  • IAR 堆栈等空间大小设置探讨,RAM分配原理
    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集成开发环境如何设置堆栈大小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设置堆栈合理大小的详细方法,并分享一些好博文(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文件,方法如下:

    216089be86c11368c3574152921da74b.png

    图1 生成map文件

    生成的map文件在项目目录下的/Debug/List,打开map文件在CALL GRAPH找到找到栈的最大使用量(我的理解是main主函数,用栈最多,所以直接拉到文件末尾,靠近SEGMENTS IN ADDRESS ORDER的地方),如下图所示:

    8662520e053836e6bf4124e143c0ffe2.png

    图2 最大栈使用

    由上图可知,最大栈使用量是00000076(注意这里是16进制),即118字节。

    接着,设置堆栈大小,方法如下,可以设置比最大栈稍微大一些:-)

    95050cbff44ad9049cce758697f5fbb8.png

    图3 设置栈大小

    二、一点小心得

    通过上述方法,设置堆栈后,再编译有可能会报如下连接错误(受限的内存远不够使用):

    9329879d8615cf2de66a109f7aecae3a.png

    图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

    四、一些好资料

    展开全文
  • 第1页IAR设置堆栈大小的问题GCC和IAR分配堆栈的方式不同,IAR先分配堆栈空间,相当于定义一个全局数组为堆栈空间,堆栈初始为堆栈空间最高地址;GCC不用先分配堆栈,自动把RAM剩余空间作为堆栈空间,堆栈初始为RAM...
  • IAR开发STM32堆栈设置

    2020-12-19 21:38:15
    一、前言关于堆栈的定义在此就不赘述,详细内容可以看这篇博客。...本文介绍两种获取栈最大消耗的方法,以方便合理设置栈的大小。二、方法1、方法一栈指针 SP 指向的位置可以反应出当前栈的消耗量。在 STM...
  • 前提概要 ... 在KEIL中,直接修改上图中箭头指向值即可实现调整堆栈的大小 下图为IAR中参考代码 提示 以上的参考代码为同一STM32芯片分别在IAR和KEIL中的起始代码顶部位置的代码 ...
  • 最近在MSP430-169LCD(MSP430F169,RAM为2KB)调试一些ucos演示例子,IAR for MSP430默认的堆栈大小是80字节,编译可以通过,运行结果不确定性,调试过程会提示"the stack pointer for stack is outside the stack ...
  • 在编写程序时往往因为代码不规范,而造成堆栈溢出的问题,这种问题困扰了不少编程新人,希望此文档能对你处理堆栈溢出时有所帮助
  • 您好:我用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 ...
  • #设置stack大小 程序需要的stack大小前面已经计算出来了,那么怎么设置呢? 如下图,在项目的Linker选项里设置。 Linker的 Config选项卡里点击Edit变更设置。 Stack/Heap Sizes选项卡里变更CSTACK的大小. 或者是用...
  • IAR STM32 最大堆栈分析

    2020-03-21 14:49:09
    IAR有相关选项,编译完成后,自动分析最大堆栈深度,并将分析结果放在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在线调试不能...
  • STM32的FSMC总线上挂载一个SRAM,实现将堆栈空间放在该外部SRAM中。开发工具使用的是IAR 5.4
  • IAR下如何查看工程的堆栈(STM32)

    千次阅读 2018-06-27 11:37:43
    IAR下编程,难免少不了要跟堆栈打交道,但是打交道之前也要知道堆栈的大小,以及堆栈的位置在哪里?Options->Linker->Overridde default->Edit查看芯片的堆栈大小这里可以看到我们使用的堆栈...
  • 每种模式都有自己的堆栈.诸如中断之类的事情涉及通过在切换到其他模式之前保存上下文寄存器(我相信是保存到当前模式的堆栈)来切换模式.使用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集成编译环境做嵌入式开发,调试代码时经常遇到无法设置断点,各种帖子提供的方法也都尝试过,还是没有完美的办法,毕竟咱们使用的破解版的,bug巨多。   废话少说,无意间发现的一个小骚操作,直接...
  • 3.设置堆栈大小 4.静态查看程序Stack栈使用详情,以及栈深度 5.动态查看程序运行Stack占用情况 6.Call stack查看当前栈空间 7.使用Memory查看程序运行中各种过程数据 8.IAR Map文件解析堆栈信息 9.IAR xx.icf存储...
  • 它不仅支持单步、断点、变量和表达式监测、寄存器和堆栈信息查看等基本调试功能,还支持反汇编等其他特性。相对于打印日志的调试方式,使用C-SPY调试工具对程序进行调试,具有更直观、更高效且不依赖于串口等优势。...
  • Stack打开Stack观察窗口,程序运行一段时间后,手动或由断点让程序暂停运行,stack窗口将显示应用程序运行到当前位置的实际堆栈使用情况 2. HEAP:限制动态分配内存(C函数库中的malloc)的大小,不用可以设置...
  • 1、是否是断点太多? 尝试把所有断点都清除掉,然后再运行试试 2、优化等级是否开到最高?
  • 翻译自 IAR 技术手册 堆和栈在嵌入式系统中是非常基础的概念。正确设置堆和栈的大小对于系统的稳定可靠非常重要。不正确设置时,系统可能会以某种非常奇怪的方式崩溃而造成灾难性的后果。 堆和栈的大小必须被...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,869
精华内容 747
关键字:

iar 堆栈设置