2017-06-21 32 views
-1

dsPIC30F6014AのADCチャンネルのデータを読み込んでいます。 私は、ADCごとに別々のタスクを実装しています(7チャネル - 7タスク)。
私はすべてのタスクを最初に作成しました。私のヒープサイズは5120、私はheap_4.cを使用しており、各タスクのスタック割り当てはconfigMINIMAL_Stack(つまり115)です。開始時
これらのタスクは、継続的かつ定期的に実行されている(ただvTaskSuspend()vTaskResume()私がやっているものです)
すべてのタスクが正常に動作しているが、いくつかの時間後にvApplicationStackOverflowHook()が発生し、すなわち、スタックがオーバーフローします。freertosのスタックオーバーフロー

メモリを誤って処理する可能性はありますか?

+1

あなたのコードを表示してください。 https://stackoverflow.com/help/how-to-ask – Tschallacka

答えて

3

ADC入力ごとにタスクを作成するのは無駄に思えます。 ADCを読む以外に何をしているのですか?

あなたのタスクはスタックの端に非常に近いと思います。ある時点では、最大スタック深度にあるときに割り込みが発生し、オーバーフローが発生します。 uxTaskGetStackHighWaterMark()を定期的に呼び出して、到達したスタックの終わりにどれくらい近いかを判断できます。

+0

アプリケーションは安全アプリケーションのようなものです。そして、PICのADCサンプリングについては、DONEビットをポーリングしているので、ポーリング時にコントローラがスタックする可能性はわずかです。だから私は別のタスクを実装しています。何が必要なときにタスクを作成して削除すればよいでしょうか?タスクによって占有されているメモリを解放してそのメモリを別のタスクに割り当てることができますか?ありがとうございました –

+0

"安全アプリケーション"お勧めしません!リチャードが述べたように、おそらく割り込みが発生してスタックを限界を超えてプッシュするか、通常より多くのスタックを使用するタスクコードのパスがあります。いずれにせよ、単純な解決策は(各ADCタスクの)スタックサイズを増やすことです。最小限のスタックサイズは、おそらくあなたの要件に十分な大きさではありません。あなたがこれをすべて1つのタスクで行うことができれば、もっと大きなスタックを使用しても、メモリをかなり少なくすることができます(パフォーマンスは向上します) –

+0

PCTaskNameを印刷することで、 lcdとそれは "IDL"を表示するので、私はちょっと混乱します。それに私のヒープは5120なので、どれくらい多くのタスクを最小限のスタックサイズで作成できるのか?私はタスクを一時停止し、別のタスクを再開するたびに毎回新しいメモリを占有しますか?ありがとうございます。 –

関連する問題