メインに入る前でも、リセット割り込みベクタSYSRSTIVは001Eh(ペリフェラル/コンフィギュレーションエリアフェッチ-PERF)に設定されています。なぜこうなった?
デバイス:MSP430F5418(RAM:16 K) コンパイラ:IAR MSP430 試したデータモデル:中規模および大規模の両方 FreeRTOSバージョン7の使用 メモリ統計 48 444バイトのCODEメモリ(+ 342絶対) 14 678バイトのDATAメモリ(+ 102絶対) 14150バイトのCONSTメモリ
使用されるcstartup.s43ファイル
#define DISABLE_WATCHDOG #include "macros.m43" #include "cfi.m43" #ifdef DISABLE_WATCHDOG #include "msp430.h" #endif #define XRSEGCSTART RSEG CSTART:CODE:NOROOT(1) XCFI_NAMES libNames XCFI_COMMON libCommon、libNames // ------------------------------------------------ --------- // cstartupコード-__low_level_initを呼び出し、初期化を実行し、 //コンストラクターを呼び出し、mainを呼び出します。mainが出口システムを返す場合 //開始されます。 // モジュール?cstart // //これが同じ「位置に依存しない」で構築されていることを確認します //コンパイラが使用する「コード」設定。 // XPICRTMODEL // //セグメントの前方宣言。 // RSEG HEAP:DATA:NOROOT(1) RSEG CSTACK:DATA:NOROOT RSEG DATA16_Z:DATA:NOROOT RSEG DATA16_I:DATA:NOROOT RSEG DATA16_ID:CONST:NOROOT RSEG CODE_I:DATA:NOROOT RSEG CODE_ID:CONST:NOROOT #if __CORE __ == __ 430X_CORE__ RSEG DATA20_Z:DATA:NOROOT RSEG DATA20_I:DATA:NOROOT RSEG DATA20_ID:CONST:NOROOT #endif // ------------------------------------------------ --------- //システムの初期化。 // XRSEGCSTART パブリック__program_start_x EXTERN?reset_vector REQUIRE?reset_vector __program_start_x: PUBLIC?cstart_begin ?cstart_begin: // -------------------- //ウォッチドッグをオフにします。 // //注:これはデフォルトで除外されています。定義してください //DISABLE_WATCHDOGを含めます。 // #ifdef DISABLE_WATCHDOG MOV #WDTPW + WDTHOLD、&WDTCTL #endif // -------------------- //スタックの最上位を指すようにSPを初期化します。 // MOV #SFE(CSTACK)、SP // //mainが呼び出されていることを確認します。 // REQUIRE?cstart_call_main // ----------------------------------------------- // __low_level_initを呼び出して、初期化する前に初期化を実行します //セグメントとmainの呼び出し。関数が0を返す場合、セグメントはありません //初期化を行う必要があります。 // //独自のバージョンの__low_level_initとリンクして、 //デフォルトのアクション:1を返す以外に何もしません。 // XRSEGCSTART PUBLIC?cstart_call_low_level_init EXTERN __low_level_init ?cstart_call_low_level_init: XCALL #__low_level_init CMP#0、W0 JEQ?cstart_call_main // ----------------------------------------------- //セグメントの初期化: // //xxx_Z-ゼロで埋められた初期化されていないデータ。 //xxx_I-対応する値から値を取得する初期化されたデータ //xxx_IDセグメント。 // #ifndef IGNORE_SEG_INIT // -------------------- //__ramfunc関数のコードを初期化します。 // XRSEGCSTART PUBLIC?cstart_init_copy_ramfunc ?cstart_init_copy_ramfunc: #ifndef IGNORE_RAMFUNC_INIT #ifndef REGISTER_MODEL_REG20 MOV #SFB CODE_I、CW0 MOV #SFB CODE_ID、CW1 MOV #sizeof CODE_I、CW2 XCALL#__ data16_memcpy #else//20ビットポインタを備えたMSP430X。 EXTERN __data20_memcpy MOVA #SFB CODE_I、CW0 MOVA #SFB CODE_ID、CW1 MOV.W #LWRD(sizeof CODE_I)、L1L MOV.W #HWRD(sizeof CODE_I)、L1H XCALL #__ data20_memcpy #endif // REGISTER_MODEL_REG20 #endif // IGNORE_RAMFUNC_INIT // -------------------- //data16を初期化します // #ifndef IGNORE_DATA16_DATA // //DATA16_Zをクリアします。 // XRSEGCSTART PUBLIC?cstart_init_zero EXTERN __data16_memzero ?cstart_init_zero: MOV #SFB DATA16_Z、CW0 MOV #sizeof DATA16_Z、CW1 XCALL#__ data16_memzero // //DATA16_IDをDATA16_Iにコピーします // XRSEGCSTART PUBLIC?cstart_init_copy EXTERN __data16_memcpy ?cstart_init_copy: MOV #SFB DATA16_I、CW0 MOV #SFB DATA16_ID、CW1 MOV #sizeof DATA16_I、CW2 XCALL#__ data16_memcpy #endif // IGNORE_DATA16_DATA // -------------------- // Data20 // #if __CORE __ == __ 430X_CORE__ #ifndef IGNORE_DATA20_DATA // //DATA20_Zをクリアします。 // XRSEGCSTART PUBLIC?cstart_init_zero20 EXTERN __data20_memzero ?cstart_init_zero20: MOVA#SFB DATA20_Z、W0 MOV.W #LWRD(sizeof DATA20_Z)、L1L MOV.W #HWRD(sizeof DATA20_Z)、L1H XCALL #__ data20_memzero // //DATA20_IDをDATA20_Iにコピーします // XRSEGCSTART PUBLIC?cstart_init_copy20 EXTERN __data20_memcpy ?cstart_init_copy20: MOVA#SFB DATA20_I、CW0 MOVA#SFB DATA20_ID、CW1 MOV.W #LWRD(sizeof DATA20_I)、L1L MOV.W #HWRD(sizeof DATA20_I)、L1H XCALL #__ data20_memcpy #endif // IGNORE_DATA16_DATA #endif // MSP430X #endif // IGNORE_SEG_INIT // ----------------------------------------------- //静的オブジェクトのコンストラクターを呼び出します。 // RSEG DIFUNCT:CONST:NOROOT(1) XRSEGCSTART PUBLIC?cstart_call_ctors EXTERN __call_ctors ?cstart_call_ctors: #ifdef REGISTER_MODEL_REG20 MOVA #SFB DIFUNCT、CW0 MOVA #SFE DIFUNCT、CW1 #else / * REGISTER_MODEL_REG20 * / MOV.W #SFB DIFUNCT、CW0 MOV.W #SFE DIFUNCT、CW1 #endif / * REGISTER_MODEL_REG20 * / XCALL #__call_ctors // ----------------------------------------------- //引数なしでmain()を呼び出し、戻り値を使用して終了します //パラメータとしてmainの。 // XRSEGCSTART PUBLIC?cstart_call_main EXTERNメイン EXTERN出口 ?cstart_call_main: XCALL #main XCALL #exit PUBLIC?cstart_end ?cstart_end: //注:「ENDMODラベル」は、このモジュールが //アプリケーションの開始。 ENDMOD __program_start_x // ------------------------------------------------ --------- // __low_level_init // //このデフォルトバージョンの__low_level_initの唯一のアクションは、 // 1を返します。そうすることで、データの通常の初期化を通知します //セグメントを実行する必要があります。 // // __low_level_initのカスタマイズされたバージョンは、 //セグメントを初期化してmainを呼び出す前に初期化を実行します //および/または特定のデータセグメントの初期化をスキップする // 状況。 // //詳細については、サンプルファイルlowinit.cを参照してください // モジュールlowinit PUBLIC __low_level_init RSEG CODE:CODE:NOROOT(1) __low_level_init: MOV#1、W0//1を返すことでこの関数 XRET//通常のことを示します //初期化を行う必要があります ENDMOD // ------------------------------------------------ --------- //リセットベクトルを定義します。 // モジュール?reset_vector RSEG RESET:CONST:NOROOT(1) PUBLIC?reset_vector EXTERN __program_start_x ?reset_vector: DC16 __program_start_x ENDMOD 終わり