![](/img/trans.png)
[英]Has anyone implemented __getzone() for IAR Embedded Workbench for MSP430?
[英]IAR Embedded workbench 6 (MSP430 V5.6) Overriding program start
我正在針對MSP430 v5.60.7使用IAR嵌入式工作台,這是IAR嵌入式工作台6.6版。 我正在使用C99。
我試圖用自己的符號覆蓋__program_start(),該符號稱為__unit_test_main()。 我已經進入鏈接器配置選項卡,並選中了“覆蓋默認程序條目”框,選擇了“輸入符號”選項,然后輸入__unit_test_main。 這會編譯並鏈接,但是不會在模擬器中運行。 我收到消息“用戶錯誤:在地址0x0上發現非法操作碼”。 當我嘗試在目標上運行該命令時,它將不起作用-控制器進入低功耗模式。
PC和SP在啟動時都初始化為0x00。
那么,我還需要做/定義什么才能正確初始化PC和SP?
我的單元測試主要功能現在微不足道,這是它的整個文件:
#include <cstdio>
void __unit_test_main(void);
void __unit_test_main(void)
{
printf("Hello World");
for(;;)
{
}
}
__program_start:
在cstartup.s43中定義。 該文件可以復制到您的項目目錄中,並包含在覆蓋庫版本的項目中。
在__program_start:
標簽之后立即初始化堆棧指針, __low_level_init()
,然后調用?cstart_call_main
。
在?cstart_call_main:
標簽(第339行)周圍:
XRSEGCSTART
PUBLIC ?cstart_call_main
EXTERN main
EXTERN exit
?cstart_call_main:
XXCALL main
XXCALL exit
您可以在其中添加要替換main的功能的符號。
您可以使用某些#ifdef
預處理器邏輯有條件地執行此操作。
所以我有
XRSEGCSTART
PUBLIC ?cstart_call_main
#ifdef UNIT_TEST
EXTERN test_runner_main
#else
EXTERN main
#endif
EXTERN exit
?cstart_call_main:
#ifdef UNIT_TEST
XXCALL test_runner_main
#else
XXCALL main
#endif
XXCALL exit
PUBLIC ?cstart_end
我必須在匯編器和編譯器選項中定義UNIT_TEST符號。
另一個選擇是在項目的某個地方實現__low_level_init()
函數,然后有條件地調用test_runner而不是調用main()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.