マイコン工作実験日記

Microcontroller を用いての工作、実験記録

SAM3UでASPを動かす - その2

2010-05-16 11:14:44 | SAM3
SAM3UでASPを起動した際の画面を再掲しておきます。



バナーのメッセージは全て正しく表示されているので、タスクが起動される前の初期化で使用されるシリアルポートへの出力は正しく動いています。main_taskの始めで出力されるべきメッセージも正しく表示されています。よって、シリアルの割り込み処理もちゃんと動いているように思われます。ところが、そのあとで例外が発生してしまっているので、何回かシリアル割り込みが連続するか、あるいはタイマ割り込みが発生した時点で例外が発生しているように見受けられます。

そのように考えて、デバイス依存部のコードを見直したのですが、SAM7Sと大きく変わる箇所があるわけでもなし、問題となりそうな点は見つかりません。NVICやSystick関連はSTM32と同一でいいはずで、異なるのはベクタの番号関連の部分だけですし。同じCortex-M3でも、STM32とSAM3Uとで異なる点があるかどうかと考えて、ようやく重要なポイントがあることを思い出しました。STM32はもう2年も前にDWMのおまけになったくらいで、Cortex-M3コアを採用したデバイスとしては比較的初期に登場したものです。そのため、Corex-M3コアのレビジョン1が採用されています。それに対して、まだ発表されて日が浅いSAM3Uはレビジョン2が採用されています。レビジョンの違いいよって例外を生じる要因があるのではないかと推測して、「ARM Cortex-M3システム開発ガイド」の17章を確認すると、レビジョン2では例外処理時のスタックのアライメントがディフォルトで8バイトに設定されっているとの説明を見つけました。SAM3Uのマニュアルを確認すると、確かにCCRレジスタのSTKALIGNビットのディフォルト設定は8バイトになっています。レビジョン1では4バイトで動作するようなので、この点が影響しているようです。

そこでhardware_init_hook()に
    *AT91C_NVIC_CCR = 0;
の1行を追加してビルドし直してみると...



メデタクsample1がちゃんと動くようになりました!! LPC17xxのマニュアルも確認してみましたが、こちらもレビジョン2ですね。同じ箇所で引っ掛かるでしょう。