Top -> FreeRtos -> stackover.html |
スタック使用法とスタックオーバフローのチェック |
---|
[More Advanced] |
スタック使用法 |
各タスクが自身のスタックを保守します。 タスクが作成されるとき、タスクスタックのメモリは自動的に割り当てられます。メモリ量はxTaskCreate
() API 関数で渡すパラメータで決められます。 スタックオーバフローはアプリケーションが不安定性になる一般的な原因です。 従って FreeRTOS は、このような事象の検出と訂正を支援するために2つのオプション・メカニズムを提供します。 このオプションは configCHECK_FOR_STACK_OVERFLOW コンフィギュレーション定数で設定される。 |
このオプションはメモリマップがセグメントされていないアーキテクチャだけ利用可能なことに注意。同様に、若干のプロセッサはカーネルオーバーフロー検査の前に、スタック破損に備えてフォールトあるいは例外を起こすことができる。
もし configCHECK_FOR_STACK_OVERFLOW が0以外にセットしたなら、アプリケーションはスタックオーバフローフック機能を提供しなくてはなりません。 ホック関数は 次に示すプロトタイプvApplicationStackOverflowHook () を呼ばなくければならない: |
void vApplicationStackOverflowHook(xTaskHandle *pxTask, signed portCHAR *pcTaskName); |
pxTask と pcTaskName パラメータはそれぞれフック関数に攻撃的なタスクのハンドルと名前を渡します。 注意してくださいスタックオーバーフローは致命的であり、これらのパラメータもそれ自身使用不能なり得ます、そのような場合 pxCurrentTCB 変数を直接調べることになる。 |
スタックオーバーフローのチェックは、開発やテストのフェーズでの使用をお勧めします、その使用はコンテキストスイッチのオーバーヘッドを紹きます。 |
スタックオーバフロー検出 − 方法1 |
カーネルがタスクを実行状態からスワップした時、タスクのスタックが最も深い値に届くであろう、なぜならこの時のスタックはタスク・コンテキストが積みあがっている時ですから。
この時点でカーネルはプロセススタックポインタが正当なスタック領域以内に残っていることを調べることができます。
もしスタックポインタが正当なスタック範囲の外にあれば、スタックオーバフローフック機能は呼び出されます。 この方法は速いです、しかしすべてのスタックオーバフローを捕える保証はありません。 この方法のみを使うには configCHECK_FOR_STACK_OVERFLOW を1にセットしてください。 |
スタックオーバフロー検出 − 方法2 |
タスクが最初に作成されるとき、そのスタックは周知の値で満たします。 実行状態からタスクをスワップするとき、カーネルはそれを保証するために正当なスタック範囲の中で最後16バイト(これの周知の値がタスクあるいは割り込みによって上書きされていないこと)をチェックすることができます。 もしこれらの16バイトのいずれも、それらの初期値が残っていなかったなら、スタックオーバフローホック関数は呼び出されます。 |
この方法は方法1より効率的でないが、それでもかなり速いです。 これはスタックオーバフローをとらえる可能性は非常に高いが、全てのオーバーフローをとらえる保証はありません。 |
方法1と共にこの方法を使うには、configCHECK_FOR_STACK_OVERFLOW を2にセットします。 なお、この方法だけを使うことはできません。 |
[More Advanced] |