uCos-ii の一部の機能 (主にスケジューリング) を変更しています。
そして、OSTaskDel 関数が ISR によって呼び出されたときに何もしないことがわかりました。
OS の基本的な機能をいくつか学びましたが、なぜそれを禁止する必要があるのか よくわかりません。
実行するのは、レディリストから引き出して、TCB やセマフォなどの取得したリソースを解放することだけです...
割り込みの処理中にそれらが禁止される理由はありますか?
uCos-ii の一部の機能 (主にスケジューリング) を変更しています。
そして、OSTaskDel 関数が ISR によって呼び出されたときに何もしないことがわかりました。
OS の基本的な機能をいくつか学びましたが、なぜそれを禁止する必要があるのか よくわかりません。
実行するのは、レディリストから引き出して、TCB やセマフォなどの取得したリソースを解放することだけです...
割り込みの処理中にそれらが禁止される理由はありますか?
この場合に禁止されている理由はドキュメントから明らかではありませんが、OSTaskDel()
明示的に を呼び出しますOS_Sched()
。ISR では、最も外側にネストされた割り込みハンドラが存在する (によって処理されるOSIntExit()
) 場合にのみ発生するはずです。
これが禁止されている理由は他にもある可能性があるため、次のことはお勧めできませんが、次のものを削除できます。
if (OSIntNesting > 0) {
return (OS_TASK_DEL_ISR);
}
次に、OS_Sched()
次のように呼び出しを条件付きにします。
if (OSIntNesting == 0) {
OS_Sched();
}
これが恐ろしく死ぬなら、私がそれは賢明ではないと言ったことを思い出してください!
この操作は、いずれにしても割り込み処理時間を延長するため、その理由だけではおそらく悪い考えです。
タスクの状態やリソースの使用状況に関係なく、別のタスクを非同期的に削除することは一般的に (ISR からだけでなく) 悪い考えです。uC/OS-II は、OSTaskDelReq()
タスクが要求に応じて自身を削除できるようにタスクの削除を管理する機能を提供し、その結果、そのすべてのリソースを正しく解放できます。それがなくても、通常は、タスクの通常の IPC メカニズムを介してリクエストを送信する方が優れています (そして移植性も高くなります)。
タスクがオンデマンドで自己削除するように設計されていない場合は、単純に OSSuspend() を使用できます。
一般に、ISR で実行できないことはいくつかあります。
ISR で上記のいずれかを行うと、デッドロックが発生します。
OSTaskDel()
おそらくこれらのことのいくつかを行っています。