问题
IAR中默认的入口函数是__iar_program_start,使能stack usage analysis之后:
生成的map文件中STACK USAGE章节里面会包含Program entry的stack使用相关信息:
如果对应启动代码没有使用默认的入口函数__iar_program_start,需要使用--entry链接器选项指定对应的入口函数(以使用入口函数Reset_Handler为例):
但是使能stack usage analysis之后,生成的map文件中STACK USAGE章节里面没有包含Program entry的stack使用相关信息:
原因
正常来说,编译器可以生成每个函数的调用和stack使用信息,链接器可以计算出每个根函数的最大stack使用。但是如果源代码是用汇编写的,那么对应函数的调用和stack使用信息需要用户指定(如果用户不指定,链接器没有办法知道对应的信息,从而没有办法计算出对应的最大stack使用)。
解决办法
需要在对应的stack usage control file (suc)里面指定对应的函数调用和stack使用信息:
对应.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使用相关信息:
注意:上面的情况是基于如下的启动代码:
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使用相关信息:
参考文献:
1.IAR C/C++ Development Guide (Stack usage analysis)
全部0条评论
快来发表一下你的评论吧 !