ただし、以下の注意事項2点を守れば、他のメモリ・モデルに対応することができます。
サービスコールへnearポインタを渡してはいけません。 nearポインタをサービスコールへ渡した場合、その後の動作は不定です。 サービスコールへは以下のようにfarポインタを渡してください。
------------------------------ VP __far *pk_msg; get_mpf(ID_MPF1, (VP __far *)&pk_msg); snd_mbx(ID_MBX1, (T_MSG __far *)pk_msg); ------------------------------
1の注意事項(サービスコールにはfarポインタを渡す)を守るために、 RX78K0R提供ヘッダを修正する必要があります。
以下に修正箇所を示します。
<現状> ------------------------------ typedef struct t_msg { struct t_msg * msgnext; } T_MSG; typedef struct t_msg_pri { struct t_msg * msgque; PRI msgpri; } T_MSG_PRI; ------------------------------ <修正> ------------------------------ typedef struct t_msg { struct t_msg __far * msgnext; } T_MSG; typedef struct t_msg_pri { struct t_msg __far * msgque; PRI msgpri; } T_MSG_PRI; ------------------------------
<現状> ------------------------------ typedef struct t_rmbx { ID wtskid; T_MSG * pk_msg; } T_RMBX; ------------------------------ <修正> ------------------------------ typedef struct t_rmbx { ID wtskid; T_MSG __far * pk_msg; } T_RMBX; ------------------------------
-78K0R-
リアルタイム OS を使ったアプリケーションで、うまく動作しなくなる原因のほとんどがこれです。 つまり、タスク・スタックや割り込みスタックが、指定したサイズを突き抜け、他のタスクのスタックを破壊したり、RX78K0R のシステム管理領域を破壊したりして、結果的に暴走しています。 RX78K0R は、アドレス情報を頼りに動くため、そのアドレスにおかしな値が入っていても疑わずに動作しますので、注意してください。
RX78K0Rはラージ・モデルにのみ対応しています。メモリ・モデルがラージ以外の場合、サービス・コールに渡されるポインタが不正になり、不正アドレスへアクセスする場合があります。
待ちを解除するために、サービス・コールを発行したときに、解除されるタスクの優先度が他のタスクの優先度よりも低かった場合、すぐに動作を開始しないため、期待した動作をしないことがあります。
wai_flg や wai_sem などの待ち系のサービス・コールを発行し、その待ちを解除しようとしてもうまくいかない場合、タスク・スタックや割り込みスタックによる領域破壊が原因である可能性があります。 タスク・スタックや割り込みスタックが設定値より伸び、それが リアルタイムOS (RXシリーズ) の管理領域を破壊し、その中の待ち情報などが破壊されていることがあります。