[ACON][要約]組み込みシステムアーキテクチャネットワークの組み込みシステム基礎Chapter 4-Boot-upプロセス


4.1. IVT (Interrupt Vector Table)

  • IVTは、処理中断の処理関数ISR(Interrupt Service Routin)ポインタを含む配列である.
  • IVTは、通常、フラッシュメモリの最小開始アドレスであるバイナリ画像の開始部に記憶される.
  • ARM Cortex-Mで定義されたシステム割込みのタイプは次のとおりです.
  • Reset
  • NMI (non-maskable interrupt)
  • Hard fault
  • Memory exception
  • Bus fault
  • Usage fault
  • Supervisor call (Scheduler)
  • Debug monitor (Breakpoint)
  • PendSV (Shared resource, Semaphore …)
  • System tick (Timer)
  • 4.2. 手順1:メモリレイアウト


  • リンクスパイラルナイフの.textには、まずIVTに関する部分が含まれるべきである.
    .text : {
        *(.isr_vector),
        *(.text),
        *(.rodata)
    } > FLASH	// Flash에 할당되는 읽기전용 내용들

  • システムを起動するには、まずIVTを実行し、reset handler関数を実行します.これにより、.bss.data節で定義された要素を初期化することができるからである.したがって、.textの一番上には、flashで読み取り専用の.isr_vectorを指すポインタがあるはずです.
  • 4.3. ステップ2:起動コード

  • ブートプロセスの最初のステップは、IVTを定義し、ポインタを接続することである.
    IVTは、GCCのattribute sectionを使用して定義される.
  •   __attribute__ ((section(".isr_vector")))
      void (* const IV[])(void) {
          (void (*)(void))(END_STACK),	// Stack pointer 초기값 지정
          isr_reset,
          isr_nmi,
          ...
      }
      // ISR은 parameter도 return도 없다.
      void isr_reset(void) {
          /*...구현...*/
          while(1) {}
      }
      // 사용자 정의 ISR 또는 빈 ISR은 오버라이드 될 수 있도록 __weak 심볼을 사용한다.
      void isr_user(void)__weak {
          /*...구현...*/
          while(1) {}
      }

  • MCUが電源を入れると、IVTの上部に定義されたreset handlerが最初に動作します.
  • Reset Handlerは.data.bss節の初期化を実行します!
  • RAMの.bssセグメントを0セグメントに初期化し、.dataセグメントおよび.bssセグメントをRAMの実際のセグメントにコピーする.
  • 初期化操作の後、main()関数を呼び出すことができる.

  • Rinker Scripterは、仮想メモリアドレス(VMA)とLoad Memory Address(LMA)を分離するメカニズムを提供します.もちろん、MCUにはMMUがないので、いずれも物理アドレスであるが、flashで定義された.dataのアドレスはコンパイル時に実際のRAMにマッピングされた位置を決定できないため、このメカニズムが必要である.ATキーワードと_stored_dataという名前のRinker scriptor変数を使用します.△内容が複雑で、翻訳が難解で、それだけでスキップした.
  • 4.4. ステップ3:スタックの割り当て

  • CPUは、プログラムを実行するためにメモリにスペースを割り当てる必要がある.
  • IVTの最上位層には、END_STACKという未使用RAM領域の終了アドレスが格納されている.IVTはflashに格納されており、実行時に計算できないため、予め定義された定数値である必要があります.
  • プログラムを最も効率的に実行するために適切なスタックサイズ割り当てを行うタスクは非常に敏感で複雑である.

  • (複数のブートおよびマルチシステムデバッグ、および.utils共有ライブラリの内容は省略する.)