2017-02-09 19 views
0

開発プラットフォームとしてCrossworksを使用しています。ブートローダ移転後のARM M0 +例外スタックポインタ

私はそれをしたとは思わない - しかし、私が書いたブートローダは、 "メイン"スタックを低メモリに置いた。後で(Crossworksのアップグレード後) - 私はアプリケーションコードを書いて、リンカはスタックを高メモリに配置しました。

3日間のデバッグ後、私のアプリケーションでメモリ破損の根本的な原因を発見しました。

アプリケーションは、高メモリだったリセット(再配置されたアドレス0〜0x4000)で定義されたスタックポインタを使用していましたが、割り込みコードがブートローダ(低メモリ)からのスタックポインタを使用していました。

質問ARM文章(私は「プロセス」スタックを使用していません)は、アプリケーションと例外ハンドラが「メイン」スタックを使用していると言います。ブートローダは最初のワードからSPをロードし、2番目のワードに含まれるアドレスにジャンプします。スタートアップコードはスタックポインタを再び設定します。したがって、スタートアップコードがスタックポインタ( "main"スタック)を設定していて、それがアプリケーションが使用するスタックである場合、HOWはまだブートローダからのスタックポインタを使用している例外ハンドラですか?

低メモリのスタックを使用するブートローダと高メモリのスタックを使用するアプリケーションがあるとすれば、アプリケーションの例外に現在「メイン」スタックと見なされる同じスタックポインタを使用するにはどうすればよいですか?

私はフィールドに製品を持っているので、アプリケーションの例外スタックポインタを修正して、高メモリスタックを使用する新しいブートローダを作成するだけではありません。

私はこれを泥よりもはっきりと説明したいと思います。

+0

私は自分のブートローダをチェックします - 私は "メイン"スタックと "プロセス"スタックの両方を使用していましたので、私の問題の一部である可能性があります。 - アプリケーションで - 私は "メイン"スタックだけを使用しています。 – JHinkle

答えて

0

ブートローダが "プロセス"スタックを使用していたため、制御レジスタにビット1が設定されていました。

1つのスタックが使用され、問題が解決されるように、再配置されたアプリケーションのコントロールレジスタをクリアしました。

関連する問題