問題
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)
-
IAR
+關注
關注
5文章
345瀏覽量
36625 -
函數
+關注
關注
3文章
4307瀏覽量
62433
原文標題:如何獲取入口函數不是__iar_program_start的Program entry的stack使用情況
文章出處:【微信號:IAR愛亞系統,微信公眾號:IAR愛亞系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論