簡體   English   中英

IAR嵌入式工作台6(MSP430 V5.6)覆蓋程序啟動

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM