2017-05-17 9 views
4

ARMのCortex M3(LPC1519)ARM M3コードを再配置 - >障害

私はフラッシュで実行され、フラッシュ(ブートローダの後ろ)にプログラムを書き込む(これまでに動作しているようです)ブートローダを書かれています。 プログラムは書き込まれ、(少なくともデバッグ時に)正しく実行されます。

私はSEGGERオゾンデバッガを使用するとき、私は 'main'にブレークポイントを設定し、ファームウェアをステップ実行することができます。 私は(別のブレークポイントまで)のコードで大きなreagionを実行するときしかし、私は常にいくつかの予期しない割り込みを取得:

  • UsageFault_Handler
  • BusFault_Handler
  • など

これは起こりません。私はコマンドでcodeコマンドを実行します。 割り込みが正しく機能しないことがあります。

アドレス0x00000000にフラッシュするとプログラムが正常に動作します。 リンカースクリプトを変更して、起点が(ブートローダーがファームウェアを置く)後のオフセットに位置するようにしました。

誰かに同様の問題が発生しましたか?

おかげで、 ヨハン

PS:私は

編集を開始する場所がわからない原因私は、最小限のサンプルを提供することはできません申し訳ありません - 追加情報: は、私は今、小さなをダウンロード私はデバッガでエラーを見つけることができます。 構造体にエラーを引き起こすようなuint32_t変数があります。 それは言う:

ミスallignedメモリリード:住所:0x00001596、NUMBYTES:8、アライメント:4ファクト0x1596で

はとても誤りがある4でdevideableではありません(ワード・アライン)正当化されましたが、どうすればこのことができますか?コンパイラは構造体の変数を整列させてはいけませんか?

編集 - 追加情報: USART0 IRQがトリガされると(txReady)、このエラーが発生するようです。 私は割り込みに問題がある可能性がありますか? ARM Cortex SysTick(SysTick_Handler)が正常に動作しています!

[[noreturn]] 
inline void startFirmware(std::uint32_t address) noexcept 
{ 
    //<removed checks for correct address> 

    //pointer to the address 
    const auto ptr = reinterpret_cast<std::uint32_t*>(address); 

    // Set vector table offset 
    SCB->VTOR = address & SCB_VTOR_TBLOFF_Msk; 

    // Set top stack handler 
    __set_MSP(*ptr); 

    // Get address of reset handler 
    const auto resetHandler = *(ptr + 1); 

    // Jump to reset handler 
    reinterpret_cast<internal::ResetHandlerFunction>(resetHandler)(); 
    while(true); 
} 

編集 - 追加情報: USARTなど、CCTimerによってトリガすべての割り込みは例外で終わるようですが、私は理由を見つけることができません。

+1

メインアプリケーションの先頭にベクタテーブルを再配置しましたか? –

+0

実際、0x1594は4で割り切れます(しかし8ではありません)! –

+0

はい、ただし0x1596ではありません。 – Traummaennlein

答えて

2

なぜ割り込みが機能しなかったのかを知りました。

TBLOFFを設定する場合、あなたはベクタテーブルの 例外エントリの数にオフセット合わせる必要があります。ARM Doku

私はこの文を見つけました。最小のアライメントは、最大32割り込みまで32 ワードです。さらに割り込みを行うには、次の2の累乗に切り上げて のアライメントを調整します。たとえば、 に21個の割り込みが必要な場合は、必要なテーブルサイズが37ワードで、2つの の次の累乗が64であるため、アライメントは64ワード境界 でなければなりません。 のアライメントの詳細については、あなたのデバイス。

これは、割り込みが16回以上ある場合、32ワードのアライメントされた(0x80で終わる)アドレスにはSCB-> VTORを配置することはできませんが、 0x00で)。私の場合、0x1080の代わりに0x1100(ブートローダが確認できるプログラムに関する情報の最初の128バイトを使用します)。