2012-03-27 7 views
0

コンテキスト切り替えに関するインラインアセンブリ命令についてもう1つの質問があります。このコードはうまくいくかもしれませんが、私は100%ではわからないので、私はこのコードをstackoverflow ;-)のプロに提出します;アームインラインアセンブリを使用したコンテキストスイッチ

arm7TDMIのgcc(最適化なし)を使用してコンパイルします。ある時点で、コードはコンテキスト切り替えを行う必要があります。

/* Software Interrupt */ 
/* we must save lr in case it is called from SVC mode */ 
#define ngARMSwi(code) __asm__("SWI %0" : : "I"(code) : "lr") 
// Note : code = 0x23 

私がコンパイルされたコードをチェックすると、私はこの結果を得る:これをコード化された私の前に

svc 0x00000023 

人は、「我々はLRを保存する必要があります」書いたが、コンパイルされたコードでは、私はしないでください保存されている痕跡を見てください。

私はそのコードが間違っていると思う理由は、リセット例外とコードが実行最後の1コンテキストスイッチがあるに行く前にいくつかの時間のために、プログラムの実行...

答えて

0

__asm__声明clobberedレジスタとしてlrをリストします。これは、が必要な場合は、コンパイラがレジスタを保存することを意味します。

保存が表示されないので、コンパイラがそのレジスタを使用していないと推測できます(少なくともテストケース内)。

0

ユーザーモードでSWI命令を呼び出す必要があると思います。これが正しければ。この命令の後、ARMのモードはSVCモードに切り替わります。 ARMコアはCPSRがSPSR_svcにコピーされ、LRがLR_svcにコピーされるコピー操作を実行します。これは、ユーザモードのcpuのコンテキストをsvcモードから戻すために使用する必要があります。 svc例外ハンドラが別の関数を呼び出すのと同じようにlrを使用する場合、lrレジスタはモードの変更の間にスタックを使用するように保持する必要があります。私はあなたの前にこのようなことを書いて、このような状況について話す人を推測します。

関連する問題