如何获取入口函数不是__iar_program_start的Program entry的stack使用情况

描述

问题

IAR中默认的入口函数是__iar_program_start,使能stack usage analysis之后:

IAR

生成的map文件中STACK USAGE章节里面会包含Program entry的stack使用相关信息:

IAR

如果对应启动代码没有使用默认的入口函数__iar_program_start,需要使用--entry链接器选项指定对应的入口函数(以使用入口函数Reset_Handler为例):

IAR

但是使能stack usage analysis之后,生成的map文件中STACK USAGE章节里面没有包含Program entry的stack使用相关信息:

IAR

 

IAR

原因

正常来说,编译器可以生成每个函数的调用和stack使用信息,链接器可以计算出每个根函数的最大stack使用。但是如果源代码是用汇编写的,那么对应函数的调用和stack使用信息需要用户指定(如果用户不指定,链接器没有办法知道对应的信息,从而没有办法计算出对应的最大stack使用)。

IAR

解决办法

需要在对应的stack usage control file (suc)里面指定对应的函数调用和stack使用信息:

IAR

对应.suc文件中指定对应的信息:

 

 

/* Specify Reset_Handler as the Program entry */
call graph root ["Program entry"]: Reset_Handler;


/* Specify Reset_Handler will call SystemInit and __iar_program_start */
function Reset_Handler: 0, a
  calls SystemInit,
  calls __iar_program_start;
生成的map文件中STACK USAGE章节里面会包含Program entry的stack使用相关信息:

IAR

 

 

注意:上面的情况是基于如下的启动代码:

 

 

Reset_Handler


        LDR     R0, =SystemInit
        BLX     R0
        LDR     R0, =__iar_program_start
        BX      R0
如果对应的启动代码没有调用__iar_program_start,那么suc文件里面需要指定入口函数调用的所有函数:
/* Specify Reset_Handler will call init_data_bss, SystemInit, startup_go_to_user_mode and main */
function Reset_Handler: 0,
  calls init_data_bss,
  calls SystemInit,
  calls startup_go_to_user_mode,
  calls main;
生成的map文件中STACK USAGE章节里面会包含Program entry的stack使用相关信息:

IAR

 

 

参考文献:

1.IAR C/C++ Development Guide (Stack usage analysis)

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分