Memory 用于ARM运行的Micrium OS-III的IAR-了解内存使用情况 如何通过生成的映射文件确定任务使用的堆栈大小 如何确定ARM RAM中堆栈和堆的大小 如何确定是否需要为任务分配更多的堆栈大小

Memory 用于ARM运行的Micrium OS-III的IAR-了解内存使用情况 如何通过生成的映射文件确定任务使用的堆栈大小 如何确定ARM RAM中堆栈和堆的大小 如何确定是否需要为任务分配更多的堆栈大小,memory,embedded,iar,micrium,Memory,Embedded,Iar,Micrium,如果您运行的是最新版本的IAR EWARM,则有一个内置工具,您会发现它对解决这些问题非常有帮助 如何通过生成的映射文件确定任务使用的堆栈大小? 对于第一个问题,您需要在映射文件中搜索每个任务堆栈的名称。在这种情况下,映射文件没有多大帮助,因为您最好在项目中搜索CPU\u STK类型,因为这样会得到所有正确定义堆栈的结果。如果查看地图文件,您可能会看到这样一行: MainStack 0x20000000 0x1000 Data Lc main.o [1] U

如果您运行的是最新版本的IAR EWARM,则有一个内置工具,您会发现它对解决这些问题非常有帮助

  • 如何通过生成的映射文件确定任务使用的堆栈大小?
  • 对于第一个问题,您需要在映射文件中搜索每个任务堆栈的名称。在这种情况下,映射文件没有多大帮助,因为您最好在项目中搜索
    CPU\u STK
    类型,因为这样会得到所有正确定义堆栈的结果。如果查看地图文件,您可能会看到这样一行:

    MainStack               0x20000000  0x1000  Data  Lc  main.o [1]
    
    Uncalled function
      "MainTask" in main.o [1]: 0x0000ac41
      Maximum call chain                            *?* 396 bytes
    
    这意味着
    MainStack
    (可能是
    MainTask
    的堆栈)的大小为0x1000或4096字节。第一列是符号名,第二列是地址空间中的位置,第三列是大小,第四列是类型(数据、代码),第五列是范围(Lc=本地,Gb=全局),最后一列是它所在的对象模块

    相反,如果您在项目中搜索
    CPU\u STK
    的实例,您将发现以下内容:

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

    static  CPU_STK          MainStack[4096];
    static  CPU_STK          AuxStack[512];
    
    因此,现在您可以看到还有一个
    AuxStack
    (大概是针对
    AuxTask
    ),它是512字节。这需要在映射文件中搜索特定的堆栈名才能得到结果,因此我会发现这更容易

  • 如何确定ARM RAM中堆栈和堆的大小?
  • 对于本例,您需要深入研究链接器配置文件或选项中的链接器部分。更简单的方法是通过选项。转到项目选项,然后转到左侧的链接器项。在配置选项卡下,选择编辑…,然后转到堆栈/堆选项卡。这将使您能够轻松访问IAR用于在链接器中分配堆和CSTACK内存区域的大小

    或者,您可以深入查看
    .icf
    文件,您可能会发现一组如下所示的行:

    /*-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__     { };
    
    它也可能看起来完全不同!对于这个问题很难给出一个概括的答案,所以你最好看看选项。但是,在上面的代码中,您可以看到
    CSTACK
    HEAP
    的大小由文件前面定义的符号定义。您可以按照这些定义获得尺寸。您的链接器文件可能与此非常不同,但是,正如我所说的,很难给出一般性的答案

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

    MainStack               0x20000000  0x1000  Data  Lc  main.o [1]
    
    Uncalled function
      "MainTask" in main.o [1]: 0x0000ac41
      Maximum call chain                            *?* 396 bytes
    
    这告诉我MainTask是一个未调用的函数(它不是直接调用的,而是通过函数指针调用的,IAR无法自动解析),它需要396字节的堆栈。在它下面,它将显示总计396字节的调用链

    这个工具需要注意的是,如果您使用函数指针和间接调用,IAR无法自动找出这些引导的位置。有一组
    pragma
    指令可用于告诉它在间接调用点调用了哪些可能的函数,您需要将这些指令放入以获得100%准确的堆栈深度


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

    如果您运行的是最新版本的IAR EWARM,则有一个内置工具可以帮助您解决这些问题

  • 如何通过生成的映射文件确定任务使用的堆栈大小?
  • 对于第一个问题,您需要在映射文件中搜索每个任务堆栈的名称。在这种情况下,映射文件没有多大帮助,因为您最好在项目中搜索
    CPU\u STK
    类型,因为这样会得到所有正确定义堆栈的结果。如果查看地图文件,您可能会看到这样一行:

    MainStack               0x20000000  0x1000  Data  Lc  main.o [1]
    
    Uncalled function
      "MainTask" in main.o [1]: 0x0000ac41
      Maximum call chain                            *?* 396 bytes
    
    这意味着
    MainStack
    (可能是
    MainTask
    的堆栈)的大小为0x1000或4096字节。第一列是符号名,第二列是地址空间中的位置,第三列是大小,第四列是类型(数据、代码),第五列是范围(Lc=本地,Gb=全局),最后一列是它所在的对象模块

    相反,如果您在项目中搜索
    CPU\u STK
    的实例,您将发现以下内容:

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

    static  CPU_STK          MainStack[4096];
    static  CPU_STK          AuxStack[512];
    
    因此,现在您可以看到还有一个
    AuxStack
    (大概是针对
    AuxTask
    ),它是512字节。这需要在映射文件中搜索特定的堆栈名才能得到结果,因此我会发现这更容易

  • 如何确定ARM RAM中堆栈和堆的大小?