2014-12-03 38 views
1

我使用的是IAR嵌入式工作臺,用於MSP430 v5.60.7,它是IAR嵌入式工作臺版本6.6。我正在使用C99。IAR嵌入式工作臺6(MSP430 V5.6)重寫程序啓動

我想覆蓋__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(;;) 
     { 
     } 
    } 
+0

我不知道,如果你可以調用庫函數該功能。如果我理解正確,當初始化工作尚未完成時,您正在接管程序; '.bss'節沒有被清零,'.data'節沒有被初始化。這可能意味着庫函數所需的全局變量(我想'printf'有一些)具有垃圾值。注意:這只是一個猜測,我沒有與MSP合作,或者入門覆蓋。 – user694733 2014-12-04 07:56:48

+0

我甚至不能運行到__unit_test_main,雖然 - 不知道爲什麼這將與CLIB有什麼關係。 – Nick 2014-12-04 15:09:09

回答

0

__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 

在那裏,你可以添加你要更換主用功能的象徵。

您可以通過一些#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()

相關問題