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によってトリガすべての割り込みは例外で終わるようですが、私は理由を見つけることができません。
メインアプリケーションの先頭にベクタテーブルを再配置しましたか? –
実際、0x1594は4で割り切れます(しかし8ではありません)! –
はい、ただし0x1596ではありません。 – Traummaennlein