1

私は C (gcc) で STM32F4 をプログラミングしています。これは ARM Cortex M4 です。プログラムの残りの部分が割り込みから実行される場合でも、すべての例で main() 関数が無限ループで終了することがわかります。プログラムからループを削除しようとすると、割り込みも発生しなくなります。

このループを削除してメインスレッドを終了できないのはなぜですか?

これがアセンブリです(親指だと思いますが、ドキュメントがあってもそれを読むことはできません):

LoopFillZerobss:
ldr  r3, = _ebss
cmp  r2, r3
bcc  FillZerobss

/* Call the clock system intitialization function.*/
bl  SystemInit 
/* Call the application's entry point.*/
bl  main
bx  lr    
.size  Reset_Handler, .-Reset_Handler
4

2 に答える 2

10

mainプロジェクトの前に実行されるセットアップ コードを見てください。それはスリムなアセンブリ コードか、より複雑なものかもしれませんが、一般的には、スタックを初期化し、C ランタイムを動作させるために必要な最小限のプロセッサ セットアップにかなり近いものです。

から戻ってきた場合main、プロセッサは何をすることになっていますか? リセットしますか?下がる?唯一の正解はありません。そのため、プログラムにリンクされているランタイム サポート コードを調べて、その設計者が何を決定したかを確認する必要があります。あなたの場合、彼らは何の許可も与えなかったように聞こえるmainので、プロセッサがクラッシュ/例外を起こし、プログラムが動作しなくなります。

編集:実際に探しているのは、アイドル ループ中に低電力状態に入る方法のようです。それは確かに可能です - あなたのプロセッサはARM Cortex-M4なので、それを行うための簡単な命令があります:

while (1)
{
    asm("wfi");
}

CMSIS を使用している場合 (および を使用しているように見える場合SystemInit)、アセンブリはおそらく既に行われています。

while(1)
{
   __WFI();
}

詳細については、このリンクを参照してください。

于 2013-04-27T17:42:24.947 に答える