首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARM运行Micrium OS-III的IAR -理解内存的使用

ARM运行Micrium OS-III的IAR -理解内存的使用
EN

Stack Overflow用户
提问于 2015-07-10 07:17:00
回答 1查看 375关注 0票数 0
  • 如何通过生成的映射文件确定任务使用的堆栈大小?
  • 如何确定ARM内存中堆栈和堆的大小
  • 如何确定是否需要为任务分配更多的堆栈大小?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-10 14:42:30

如果您正在运行最新版本的IAR,您会发现有一个内置工具可以帮助您解决这些问题。

  1. 如何通过生成的映射文件确定任务使用的堆栈大小?

对于第一个问题,您需要在地图文件中搜索每个任务堆栈的名称。在这种情况下,映射文件没有多大帮助,因为您最好在项目中搜索CPU_STK类型,因为这将为您提供所有正确定义的堆栈的结果。如果您确实查看了地图文件,您可能会看到如下一行:

代码语言:javascript
复制
MainStack               0x20000000  0x1000  Data  Lc  main.o [1]

这意味着MainStack (可能是MainTask的堆栈)的大小为0x1000或4096字节。第一列是符号名,第二列是地址空间中的位置,第三列是大小,第四列是类型(数据、代码),第五列是范围(Lc = local,Gb = Global),最后一列是它所在的对象模块。

如果您在项目中搜索CPU_STK实例,您会发现以下内容:

代码语言:javascript
复制
static  CPU_STK          MainStack[4096];

这给您提供了与MainStack大小4096相同的信息,但通过搜索CPU_STK,它还将为其他任务提供结果,因此您可能会在结果中实际看到以下内容:

代码语言:javascript
复制
static  CPU_STK          MainStack[4096];
static  CPU_STK          AuxStack[512];

所以,现在您可以看到也有一个AuxStack (大概是一个AuxTask),它是512个字节。这将需要在映射文件中搜索特定的堆栈名称才能获得结果,因此我会发现这更容易。

  1. 如何确定ARM内存中堆栈和堆的大小?

对于这一项,您需要深入了解链接器配置文件或选项中的链接器部分。更容易的方法是通过选择。转到您的项目选项,然后左边的链接器项。在configuration选项卡下,选择Edit.,然后转到Stack/Heap选项卡。这将使您轻松访问IAR将用于分配链接器中堆和CSTACK内存区域的大小。

或者,您可以深入研究.icf文件,您可以找到如下所示的一组行:

代码语言:javascript
复制
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__   = 0x400;

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

它也可能看起来完全不同!很难对这个问题给出一个概括的答案,所以你最好考虑一下这些选项。但是,在上面的代码中,您可以看到CSTACKHEAP的大小是由文件前面定义的符号定义的。您可以按照这些定义来获得大小。但是,您的链接器文件可能与此非常不同,因此,正如我所说的,很难给出一个一般性的答案。

  1. 如何确定是否需要为任务分配更多的堆栈大小?

新版本的IAR有一个很好的实用程序,可以确定任何函数所需的堆栈深度。在“项目选项”中,在“高级”选项卡的“链接器”下,可以检查“启用堆栈使用情况分析”。启用此功能后,映射文件将包含根函数及其最大调用链。例如,我的MainTask如下所示:

代码语言:javascript
复制
Uncalled function
  "MainTask" in main.o [1]: 0x0000ac41
  Maximum call chain                            *?* 396 bytes

因此,这告诉我,MainTask是一个未调用的函数(它不是直接调用的,而是由函数指针调用的,IAR无法自动解析),它需要396字节的堆栈。在它下面,它将向您显示总计为396字节的调用链。

值得注意的是,如果您使用函数指针和间接调用,IAR无法自动确定这些指针的位置。有一组pragma指令可以用来告诉它在一个间接调用点调用哪些可能的函数,您需要将这些函数放入其中才能获得100%的精确堆栈深度。

另一种方法是在硬件上运行程序,但让操作系统监视堆栈溢出。Micrium在这里有一个关于检测堆栈溢出的页面:检测任务堆栈溢出。此外,下面是一个函数的文档,用于获取有关任务堆栈使用情况的信息:OSTaskStkChk()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31334743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档