注:実機が無いので
金澤ソフト設計様のWindows版iTRONを使用しています。
【質問1】
タスクコンテキストとは
タスク、及びタスクから呼び出される関数
非タスクコンテキストとは
上記以外の、タスク処理とは完全に独立している処理
という考え方でよろしいでしょうか?
【質問2】
iTRONのメールボックスについて
以下のパターン1、2、3の考え方に間違いがありませんでしょうか?
・メッセージを格納するポインタは静的変数(static宣言)にするのが無難である。
メッセージを格納するポインタが自動変数のとき
- (パターン1)
タスクを定義している箇所から直接送信する場合、
そのタスクが休止状態になると、メッセージポインタがメモリから削除されるため、
他所での受信処理ができなくなる。
C
1TASK tsk_mbx1_send_test( VP_INT stacd ) 2{ 3 //メッセージ送信後、タスクが終了して休止状態になる場合 4 //送信メッセージポインタがメモリから削除される 5 T_MSGEX mbx_msgex; 6/**** 中 略 *****/ 7 result = snd_msg(MBX1_NO,(T_MSG *)&mbx_msgex); 8}
- (パターン2)
上記の場合でも、そのタスクが休止状態にならない場合、
メッセージポインタがメモリに保持されるため、他所での受信処理が可能になる。
C
1TASK tsk_mbx1_send_test( VP_INT stacd ) 2{ 3 //メッセージ送信後も、タスクが終了しない場合、 4 //送信メッセージポインタはメモリに保持される 5 6 T_MSGEX mbx_msgex; 7 8 while(TRUE) //無限ループ 9 { 10/**** 中 略 *****/ 11 result = snd_msg(MBX1_NO,(T_MSG *)&mbx_msgex); 12 } 13}
- (パターン3)
タスクから別の関数を介してメッセージ送信する場合、
呼び出し元のタスクが休止状態にならない場合であっても、
関数が終了した時点でメッセージポインタがメモリから削除されてしまい、
他所での受信処理ができなくなる。
C
1TASK tsk_mbx1_send_test( VP_INT stacd ) 2{ 3 while(TRUE) //無限ループ 4 { 5/**** 中 略 *****/ 6 result = f_mbx1_send_test(); //メッセージ送信を別関数化 7 } 8} 9 10static ER f_mbx1_send_test(void) 11{ 12 //関数の実行終了とともに送信メッセージポインタが 13 //メモリから削除されてしまう 14 T_MSGEX mbx_msgex; 15/**** 中 略 *****/ 16 result = snd_msg(MBX1_NO,(T_MSG *)&mbx_msgex); 17}