2

私は C でマイクロコントローラーのコードを持っています。私が持っている例に基づいて、関数 " void osSleep(tU32 ticks)" を使用してプログラムをしばらく停止します。残念ながら、それが実際にどのように機能し、マイクロコントローラーに対して何をするのか (どのピン、状態などがどの値に設定されているか) はわかりません。

ソースがあるので、 setBuzzer() 関数を理解しました:

void setBuzzer(tBool on)
{
  if (TRUE == on)
    IOCLR = BUZZER_PIN;
  else
    IOSET = BUZZER_PIN;
}

そのため、GPIO ポートは、ブザーに関連する PIN (BUZZER_PIN = 0x00002000) に対して 1 または 0 に設定されます。ブザーには 1 つのピンがあるので、それを有効または無効にすることができます (高電圧と低電圧)。

私は osSleep() に対して同様の分析を行いたいのですが、奇妙なことに、コード全体でその実装を見つけることができず、宣言のみです:

void osSleep(tU32 ticks);

たぶん、その関数はいくつかのライブラリにあります。とにかく、それが実際に下位レベルでどのように機能するかを知りたいです (たとえば、タイマーを呼び出したときに何が起こるか、ブザーの例のように、どの命令が実行されるか)。

また、 Embedded Artistsによる「Pre-emptive Operating System v 1.4.0」と呼ばれるコードのドキュメントには、高レベルの短い定義しかありません。

4

1 に答える 1

1

残念ながら、それが実際にどのように機能し、マイクロコントローラーに何をするのかはわかりません

ソースにアクセスできなければ、確認する方法はありません。実際の動作を理解するために、逆アセンブラ (GNU のものなど) を使用してみてbinutilsください。objdumposSleep

おそらく、タイマーティック ISR によって (直接的または間接的に) 切り替えられるセマフォで保留されています。ただし、あなたの質問は興味深いものです。ドキュメントには、「この関数は、指定されたティック数の間、プロセスをスリープ状態にする」以外には何も言及されていません。しかし、実行できるものがない場合は、uC 全体を低電力モードにすることができます。

于 2012-11-12T02:00:26.557 に答える