HOS-V4 Advance の開発リポジトリ
Revision | 85b0e77d02b663c84a72ffa35384f41843fcc205 (tree) |
---|---|
Time | 2009-08-16 10:40:47 |
Author | ryuz <ryuz> |
Commiter | ryuz |
(none)
@@ -228,6 +228,10 @@ C言語構文(例えばtypedefなど)はこの中には記載せず、マクロ | ||
228 | 228 | /* Data queues */ |
229 | 229 | /* ---------------------------------------------- */ |
230 | 230 | |
231 | +/* Configuration */ | |
232 | +#define _KERNEL_CFG_DTQ_DTQCNT_ZERO TRUE /**< %jp{キューサイズ0に対応する} */ | |
233 | +#define _KERNEL_CFG_DTQ_DTQCNT_NONZERO TRUE /**< %jp{キューサイズ非0に対応する} */ | |
234 | + | |
231 | 235 | /* Attribute */ |
232 | 236 | #define _KERNEL_CFG_DTQ_TA_TFIFO TRUE /**< %jp{TA_TFIFO属性に対応する} */ |
233 | 237 | #define _KERNEL_CFG_DTQ_TA_TPRI TRUE /**< %jp{TA_TPRI属性に対応する} */ |
@@ -181,9 +181,9 @@ typedef struct t_cdtq | ||
181 | 181 | /** %jp{データキュー状態}%en{Data queue state packet} */ |
182 | 182 | typedef struct t_rdtq |
183 | 183 | { |
184 | - ID stskid; /**< %jp{データキューの送信待ち行列の先頭のタスクのID番号}%en{ID number of the task at the head of the send-wait queue} */ | |
185 | - ID rtskid; /**< %jp{データキューの受信待ち行列の先頭のタスクのID番号}%en{ID number of the task at the head of the receive-wait queue} */ | |
186 | - UINT sdtqcnt; /**< %jp{データキューに入っているデータの数}%en{The number of data elemnts int the data queue} */ | |
184 | + ID stskid; /**< %jp{データキューの送信待ち行列の先頭のタスクのID番号}%en{ID number of the task at the head of the send-wait queue} */ | |
185 | + ID rtskid; /**< %jp{データキューの受信待ち行列の先頭のタスクのID番号}%en{ID number of the task at the head of the receive-wait queue} */ | |
186 | + UINT sdtqcnt; /**< %jp{データキューに入っているデータの数}%en{The number of data elemnts int the data queue} */ | |
187 | 187 | } T_RDTQ; |
188 | 188 | |
189 | 189 |
@@ -182,6 +182,12 @@ | ||
182 | 182 | #define _KERNEL_SPT_KSND_DTQ FALSE |
183 | 183 | #endif |
184 | 184 | |
185 | +#if _KERNEL_SPT_TRCV_DTQ || (_KERNEL_SPT_RCV_DTQ && _KERNEL_SPT_PRCV_DTQ) | |
186 | +#define _KERNEL_SPT_KRCV_DTQ TRUE | |
187 | +#else | |
188 | +#define _KERNEL_SPT_KRCV_DTQ FALSE | |
189 | +#endif | |
190 | + | |
185 | 191 | |
186 | 192 | /* Mailboxes */ |
187 | 193 | #define _KERNEL_SPT_CRE_MBX _KERNEL_CFG_CRE_MBX /* cre_mbx */ |
@@ -985,6 +991,12 @@ | ||
985 | 991 | #define _KERNEL_DTQCB_SPLIT_RO _KERNEL_CFG_DTQCB_SPLIT_RO |
986 | 992 | #endif |
987 | 993 | |
994 | +/* Configuration */ | |
995 | +#define _KERNEL_SPT_DTQ_DTQCNT_ZERO _KERNEL_CFG_DTQ_DTQCNT_ZERO /**< %jp{キューサイズ0に対応する} */ | |
996 | +#define _KERNEL_SPT_DTQ_DTQCNT_NONZERO _KERNEL_CFG_DTQ_DTQCNT_NONZERO /**< %jp{キューサイズ非0に対応する} */ | |
997 | +#if !_KERNEL_SPT_DTQ_DTQCNT_ZERO && !_KERNEL_SPT_DTQ_DTQCNT_NONZERO | |
998 | +#error "!_KERNEL_SPT_DTQ_DTQCNT_ZERO && !_KERNEL_SPT_DTQ_DTQCNT_NONZERO" | |
999 | +#endif | |
988 | 1000 | |
989 | 1001 | /* Attribute */ |
990 | 1002 | #define _KERNEL_SPT_DTQ_TA_TFIFO _KERNEL_CFG_DTQ_TA_TFIFO /**< %jp{TA_TFIFO属性に対応する} */ |
@@ -21,10 +21,13 @@ | ||
21 | 21 | /** %jp{データキューへの送信(ポーリング)}%en{Send to Data Queue(Polling)} */ |
22 | 22 | ER prcv_dtq(ID dtqid, VP_INT *p_data) |
23 | 23 | { |
24 | - _KERNEL_T_DTQCB *dtqcb; | |
25 | - _KERNEL_T_TSKHDL tskhdl; | |
26 | - _KERNEL_T_TCB *tcb; | |
27 | - ER ercd; | |
24 | + _KERNEL_T_DTQCB *dtqcb; | |
25 | + const _KERNEL_T_DTQCB_RO *dtqcb_ro; | |
26 | + _KERNEL_T_TSKHDL tskhdl; | |
27 | + _KERNEL_T_TCB *tcb; | |
28 | + _KERNEL_DTQ_T_DTQCNT sdtqcnt; | |
29 | + ER ercd; | |
30 | + | |
28 | 31 | |
29 | 32 | /* %jp{コンテキストチェック} */ |
30 | 33 | #if _KERNEL_SPT_PRCV_DTQ_E_CTX |
@@ -63,65 +66,87 @@ ER prcv_dtq(ID dtqid, VP_INT *p_data) | ||
63 | 66 | /* %jp{待ちタスクがあれば待ち解除} */ |
64 | 67 | tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */ |
65 | 68 | |
66 | - /* %jp{送信データ取得} */ | |
67 | - *p_data = (VP_INT)_KERNEL_TSK_GET_DATA(tcb); | |
68 | - | |
69 | 69 | /* %jp{タスクを起す} */ |
70 | 70 | _KERNEL_TSK_SET_ERCD(tcb, E_OK); /* %jp{エラーコード設定} */ |
71 | 71 | _KERNEL_DSP_WUP_TSK(tskhdl); /* %jp{タスクの待ち解除} */ |
72 | 72 | _KERNEL_DTQ_RMV_STOQ(tskhdl); /* %jp{タイムアウトキューからはずす} */ |
73 | - | |
74 | - /* %jp{タスクディスパッチの実行} */ | |
75 | - _KERNEL_DSP_TSK(); | |
76 | - | |
77 | - ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */ | |
78 | 73 | } |
79 | - else | |
74 | + | |
75 | + | |
76 | +#if _KERNEL_SPT_DTQ_DTQCNT_NONZERO /* %jp{データキュー情報取得} */ | |
77 | + sdtqcnt = _KERNEL_DTQ_GET_SDTQCNT(dtqcb); | |
78 | + if ( sdtqcnt > 0 ) /* %jp{キューにデータはあるか?} */ | |
80 | 79 | { |
81 | - const _KERNEL_T_DTQCB_RO *dtqcb_ro; | |
82 | - _KERNEL_DTQ_T_DTQCNT sdtqcnt; | |
83 | - VP_INT *dtq; | |
80 | + _KERNEL_DTQ_T_DTQCNT dtqcnt; | |
81 | + VP_INT *dtq; | |
82 | + _KERNEL_DTQ_T_DTQCNT head; | |
84 | 83 | |
85 | 84 | /* %jp{RO部取得} */ |
86 | 85 | dtqcb_ro = _KERNEL_DTQ_GET_DTQCB_RO(dtqid, dtqcb); |
87 | - | |
88 | - /* %jp{データキュー情報取得} */ | |
89 | - sdtqcnt = _KERNEL_DTQ_GET_SDTQCNT(dtqcb); | |
90 | - dtq = _KERNEL_DTQ_GET_DTQ(dtqcb_ro); | |
91 | - | |
92 | - if ( sdtqcnt > 0 ) /* %jp{キューにデータはあるか?} */ | |
86 | + | |
87 | + /* %jp{データキュー取得} */ | |
88 | + dtq = _KERNEL_DTQ_GET_DTQ(dtqcb_ro); | |
89 | + | |
90 | + /* %jp{キューからデータを取り出し} */ | |
91 | + head = _KERNEL_DTQ_GET_HEAD(dtqcb); | |
92 | + dtqcnt = _KERNEL_DTQ_GET_DTQCNT(dtqcb_ro); | |
93 | + *p_data = dtq[head]; | |
94 | + | |
95 | + /* %jp{送信待ちタスクがあればデータを追加} */ | |
96 | + if ( tskhdl != _KERNEL_TSKHDL_NULL ) | |
93 | 97 | { |
94 | - _KERNEL_DTQ_T_DTQCNT head; | |
95 | - _KERNEL_DTQ_T_DTQCNT dtqcnt; | |
96 | - | |
97 | - /* %jp{キューからデータを取り出し} */ | |
98 | - head = _KERNEL_DTQ_GET_HEAD(dtqcb); | |
99 | - dtqcnt = _KERNEL_DTQ_GET_DTQCNT(dtqcb_ro); | |
100 | - *p_data = dtq[head]; | |
101 | - | |
102 | - /* %jp{データ個数を減ずる} */ | |
98 | + /* %jp{送信データ格納} */ | |
99 | + tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */ | |
100 | + dtq[head] = (VP_INT)_KERNEL_TSK_GET_DATA(tcb); | |
101 | + } | |
102 | + else | |
103 | + { | |
104 | + /* %jp{送信待ちが無ければキューのデータ個数を減ずる} */ | |
103 | 105 | sdtqcnt--; |
104 | 106 | _KERNEL_DTQ_SET_SDTQCNT(dtqcb, sdtqcnt); |
107 | + } | |
108 | + | |
109 | + /* %jp{先頭位置をずらす} */ | |
110 | + if ( head + 1 < dtqcnt ) | |
111 | + { | |
112 | + head++; | |
113 | + } | |
114 | + else | |
115 | + { | |
116 | + head = 0; | |
117 | + } | |
118 | + _KERNEL_DTQ_SET_HEAD(dtqcb, head); | |
119 | + | |
120 | + if ( tskhdl != _KERNEL_TSKHDL_NULL ) | |
121 | + { | |
122 | + /* %jp{タスクディスパッチの実行} */ | |
123 | + _KERNEL_DSP_TSK(); | |
124 | + } | |
125 | + | |
126 | + ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */ | |
127 | + } | |
128 | + else | |
129 | +#endif | |
130 | + { | |
131 | +#if _KERNEL_SPT_DTQ_DTQCNT_ZERO | |
132 | + if ( tskhdl != _KERNEL_TSKHDL_NULL ) | |
133 | + { | |
134 | + /* %jp{送信データ取得} */ | |
135 | + tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */ | |
136 | + *p_data = (VP_INT)_KERNEL_TSK_GET_DATA(tcb); /* %jp{送信データ格納} */ | |
105 | 137 | |
106 | - /* %jp{先頭位置をずらす} */ | |
107 | - if ( head + 1 < dtqcnt ) | |
108 | - { | |
109 | - head++; | |
110 | - } | |
111 | - else | |
112 | - { | |
113 | - head = 0; | |
114 | - } | |
115 | - _KERNEL_DTQ_SET_HEAD(dtqcb, head); | |
116 | - | |
117 | - ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */ | |
138 | + /* %jp{タスクディスパッチの実行} */ | |
139 | + _KERNEL_DSP_TSK(); | |
140 | + | |
141 | + ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */ | |
118 | 142 | } |
119 | 143 | else |
144 | +#endif | |
120 | 145 | { |
121 | - ercd = E_TMOUT; /* %jp{タイムアウト}%en{Normal completion} */ | |
146 | + ercd = E_TMOUT; /* %jp{タイムアウト} */ | |
122 | 147 | } |
123 | 148 | } |
124 | - | |
149 | + | |
125 | 150 | _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ |
126 | 151 | |
127 | 152 | return ercd; |
@@ -21,11 +21,13 @@ | ||
21 | 21 | /** %jp{データキューからの受信} */ |
22 | 22 | ER rcv_dtq(ID dtqid, VP_INT *p_data) |
23 | 23 | { |
24 | - _KERNEL_T_DTQCB *dtqcb; | |
25 | - _KERNEL_T_TSKHDL tskhdl; | |
26 | - _KERNEL_T_TCB *tcb; | |
27 | - ER ercd; | |
28 | - | |
24 | + _KERNEL_T_DTQCB *dtqcb; | |
25 | + const _KERNEL_T_DTQCB_RO *dtqcb_ro; | |
26 | + _KERNEL_T_TSKHDL tskhdl; | |
27 | + _KERNEL_T_TCB *tcb; | |
28 | + _KERNEL_DTQ_T_DTQCNT sdtqcnt; | |
29 | + ER ercd; | |
30 | + | |
29 | 31 | /* %jp{コンテキストチェック} */ |
30 | 32 | #if _KERNEL_SPT_RCV_DTQ_E_CTX |
31 | 33 | if ( _KERNEL_SYS_SNS_DPN() ) |
@@ -63,61 +65,86 @@ ER rcv_dtq(ID dtqid, VP_INT *p_data) | ||
63 | 65 | /* %jp{待ちタスクがあれば待ち解除} */ |
64 | 66 | tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */ |
65 | 67 | |
66 | - /* %jp{送信データ取得} */ | |
67 | - *p_data = (VP_INT)_KERNEL_TSK_GET_DATA(tcb); | |
68 | - | |
69 | 68 | /* %jp{タスクを起す} */ |
70 | 69 | _KERNEL_TSK_SET_ERCD(tcb, E_OK); /* %jp{エラーコード設定} */ |
71 | 70 | _KERNEL_DSP_WUP_TSK(tskhdl); /* %jp{タスクの待ち解除} */ |
72 | 71 | _KERNEL_DTQ_RMV_STOQ(tskhdl); /* %jp{タイムアウトキューからはずす} */ |
73 | - | |
74 | - /* %jp{タスクディスパッチの実行} */ | |
75 | - _KERNEL_DSP_TSK(); | |
76 | - | |
77 | - ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */ | |
78 | 72 | } |
79 | - else | |
73 | + | |
74 | + | |
75 | +#if _KERNEL_SPT_DTQ_DTQCNT_NONZERO /* %jp{データキュー情報取得} */ | |
76 | + sdtqcnt = _KERNEL_DTQ_GET_SDTQCNT(dtqcb); | |
77 | + if ( sdtqcnt > 0 ) /* %jp{キューにデータはあるか?} */ | |
80 | 78 | { |
81 | - const _KERNEL_T_DTQCB_RO *dtqcb_ro; | |
82 | - _KERNEL_DTQ_T_DTQCNT sdtqcnt; | |
83 | - VP_INT *dtq; | |
79 | + _KERNEL_DTQ_T_DTQCNT dtqcnt; | |
80 | + VP_INT *dtq; | |
81 | + _KERNEL_DTQ_T_DTQCNT head; | |
84 | 82 | |
85 | 83 | /* %jp{RO部取得} */ |
86 | 84 | dtqcb_ro = _KERNEL_DTQ_GET_DTQCB_RO(dtqid, dtqcb); |
87 | - | |
88 | - /* %jp{データキュー情報取得} */ | |
89 | - sdtqcnt = _KERNEL_DTQ_GET_SDTQCNT(dtqcb); | |
90 | - dtq = _KERNEL_DTQ_GET_DTQ(dtqcb_ro); | |
91 | - | |
92 | - if ( sdtqcnt > 0 ) /* %jp{キューにデータはあるか?} */ | |
85 | + | |
86 | + /* %jp{データキュー取得} */ | |
87 | + dtq = _KERNEL_DTQ_GET_DTQ(dtqcb_ro); | |
88 | + | |
89 | + /* %jp{キューからデータを取り出し} */ | |
90 | + head = _KERNEL_DTQ_GET_HEAD(dtqcb); | |
91 | + dtqcnt = _KERNEL_DTQ_GET_DTQCNT(dtqcb_ro); | |
92 | + *p_data = dtq[head]; | |
93 | + | |
94 | + /* %jp{送信待ちタスクがあればデータを追加} */ | |
95 | + if ( tskhdl != _KERNEL_TSKHDL_NULL ) | |
93 | 96 | { |
94 | - _KERNEL_DTQ_T_DTQCNT head; | |
95 | - _KERNEL_DTQ_T_DTQCNT dtqcnt; | |
96 | - | |
97 | - /* %jp{キューからデータを取り出し} */ | |
98 | - head = _KERNEL_DTQ_GET_HEAD(dtqcb); | |
99 | - dtqcnt = _KERNEL_DTQ_GET_DTQCNT(dtqcb_ro); | |
100 | - *p_data = dtq[head]; | |
101 | - | |
102 | - /* %jp{データ個数を減ずる} */ | |
97 | + /* %jp{送信データ格納} */ | |
98 | + tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */ | |
99 | + dtq[head] = (VP_INT)_KERNEL_TSK_GET_DATA(tcb); | |
100 | + } | |
101 | + else | |
102 | + { | |
103 | + /* %jp{送信待ちが無ければキューのデータ個数を減ずる} */ | |
103 | 104 | sdtqcnt--; |
104 | 105 | _KERNEL_DTQ_SET_SDTQCNT(dtqcb, sdtqcnt); |
106 | + } | |
107 | + | |
108 | + /* %jp{先頭位置をずらす} */ | |
109 | + if ( head + 1 < dtqcnt ) | |
110 | + { | |
111 | + head++; | |
112 | + } | |
113 | + else | |
114 | + { | |
115 | + head = 0; | |
116 | + } | |
117 | + _KERNEL_DTQ_SET_HEAD(dtqcb, head); | |
105 | 118 | |
106 | - /* %jp{先頭位置をずらす} */ | |
107 | - if ( head + 1 < dtqcnt ) | |
108 | - { | |
109 | - head++; | |
110 | - } | |
111 | - else | |
112 | - { | |
113 | - head = 0; | |
114 | - } | |
115 | - _KERNEL_DTQ_SET_HEAD(dtqcb, head); | |
119 | + if ( tskhdl != _KERNEL_TSKHDL_NULL ) | |
120 | + { | |
121 | + /* %jp{タスクディスパッチの実行} */ | |
122 | + _KERNEL_DSP_TSK(); | |
123 | + } | |
124 | + | |
125 | + ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */ | |
126 | + } | |
127 | + else | |
128 | +#endif | |
129 | + { | |
130 | +#if _KERNEL_SPT_DTQ_DTQCNT_ZERO | |
131 | + if ( tskhdl != _KERNEL_TSKHDL_NULL ) | |
132 | + { | |
133 | + /* %jp{送信データ取得} */ | |
134 | + tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */ | |
135 | + *p_data = (VP_INT)_KERNEL_TSK_GET_DATA(tcb); /* %jp{送信データ格納} */ | |
136 | + | |
137 | + /* %jp{タスクディスパッチの実行} */ | |
138 | + _KERNEL_DSP_TSK(); | |
116 | 139 | |
117 | 140 | ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */ |
118 | 141 | } |
119 | 142 | else |
143 | +#endif | |
120 | 144 | { |
145 | + /* %jp{RO部取得} */ | |
146 | + dtqcb_ro = _KERNEL_DTQ_GET_DTQCB_RO(dtqid, dtqcb); | |
147 | + | |
121 | 148 | /* %jp{実行中タスクを取得} */ |
122 | 149 | tskhdl = _KERNEL_SYS_GET_RUNTSK(); /* %jp{タスクハンドル取得} */ |
123 | 150 | tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */ |
@@ -130,10 +157,10 @@ ER rcv_dtq(ID dtqid, VP_INT *p_data) | ||
130 | 157 | _KERNEL_TSK_SET_WOBJID(tcb, dtqid); /* %jp{待ちオブジェクトID設定} */ |
131 | 158 | _KERNEL_DSP_WAI_TSK(tskhdl); /* %jp{待ち状態に設定} */ |
132 | 159 | _KERNEL_DTQ_ADD_RQUE(dtqcb, dtqcb_ro, tskhdl); /* %jp{待ち行列に追加} */ |
133 | - | |
160 | + | |
134 | 161 | /* %jp{タスクディスパッチの実行} */ |
135 | 162 | _KERNEL_DSP_TSK(); |
136 | - | |
163 | + | |
137 | 164 | /* %jp{エラーコードの取得} */ |
138 | 165 | ercd = _KERNEL_TSK_GET_ERCD(tcb); |
139 | 166 | } |
@@ -129,11 +129,10 @@ ER snd_dtq(ID dtqid, VP_INT data) | ||
129 | 129 | _KERNEL_TSK_SET_DATA(tcb, data); |
130 | 130 | _KERNEL_DSP_WAI_TSK(tskhdl); |
131 | 131 | _KERNEL_DTQ_ADD_SQUE(dtqcb, dtqcb_ro, tskhdl); /* %jp{待ち行列に追加} */ |
132 | - | |
133 | - | |
132 | + | |
134 | 133 | /* %jp{タスクディスパッチの実行} */ |
135 | 134 | _KERNEL_DSP_TSK(); |
136 | - | |
135 | + | |
137 | 136 | /* %jp{エラーコードの取得} */ |
138 | 137 | ercd = _KERNEL_TSK_GET_ERCD(tcb); |
139 | 138 | } |
@@ -72,12 +72,13 @@ ER trcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout) | ||
72 | 72 | */ |
73 | 73 | ER _kernel_rcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout) |
74 | 74 | { |
75 | - _KERNEL_T_DTQCB_PTR dtqcb; | |
76 | - _KERNEL_T_TSKHDL tskhdl; | |
77 | - _KERNEL_T_TCB *tcb; | |
78 | - _KERNEL_DTQ_T_DTQCNT dtqcnt; | |
79 | - ER ercd; | |
80 | - | |
75 | + _KERNEL_T_DTQCB *dtqcb; | |
76 | + const _KERNEL_T_DTQCB_RO *dtqcb_ro; | |
77 | + _KERNEL_T_TSKHDL tskhdl; | |
78 | + _KERNEL_T_TCB *tcb; | |
79 | + _KERNEL_DTQ_T_DTQCNT sdtqcnt; | |
80 | + ER ercd; | |
81 | + | |
81 | 82 | /* %jp{コンテキストチェック} */ |
82 | 83 | #if _KERNEL_SPT_KRCV_DTQ_E_CTX |
83 | 84 | if ( tmout != TMO_POL && _KERNEL_SYS_SNS_DPN() ) |
@@ -104,8 +105,8 @@ ER _kernel_rcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout) | ||
104 | 105 | return E_NOEXS; /* %jp{オブジェクト未生成}%en{Non-existant object} */ |
105 | 106 | } |
106 | 107 | #endif |
107 | - | |
108 | - /* %jp{コントロールブロック取得} */ | |
108 | + | |
109 | + /* %jp{データキューコントロールブロック取得} */ | |
109 | 110 | dtqcb = _KERNEL_DTQ_ID2DTQCB(dtqid); |
110 | 111 | |
111 | 112 | /* %jp{送信待ち行列先頭からタスク取り出し} */ |
@@ -115,60 +116,82 @@ ER _kernel_rcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout) | ||
115 | 116 | /* %jp{待ちタスクがあれば待ち解除} */ |
116 | 117 | tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */ |
117 | 118 | |
118 | - /* %jp{送信データ取得} */ | |
119 | - *p_data = (VP_INT)_KERNEL_TSK_GET_DATA(tcb); | |
120 | - | |
121 | 119 | /* %jp{タスクを起す} */ |
122 | 120 | _KERNEL_TSK_SET_ERCD(tcb, E_OK); /* %jp{エラーコード設定} */ |
123 | 121 | _KERNEL_DSP_WUP_TSK(tskhdl); /* %jp{タスクの待ち解除} */ |
124 | 122 | _KERNEL_DTQ_RMV_STOQ(tskhdl); /* %jp{タイムアウトキューからはずす} */ |
125 | - | |
126 | - /* %jp{タスクディスパッチの実行} */ | |
127 | - _KERNEL_DSP_TSK(); | |
128 | - | |
129 | - ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */ | |
130 | 123 | } |
131 | - else | |
124 | + | |
125 | + | |
126 | +#if _KERNEL_SPT_DTQ_DTQCNT_NONZERO /* %jp{データキュー情報取得} */ | |
127 | + sdtqcnt = _KERNEL_DTQ_GET_SDTQCNT(dtqcb); | |
128 | + if ( sdtqcnt > 0 ) /* %jp{キューにデータはあるか?} */ | |
132 | 129 | { |
133 | - const _KERNEL_T_DTQCB_RO *dtqcb_ro; | |
134 | - _KERNEL_DTQ_T_DTQCNT sdtqcnt; | |
135 | - VP_INT *dtq; | |
130 | + _KERNEL_DTQ_T_DTQCNT dtqcnt; | |
131 | + VP_INT *dtq; | |
132 | + _KERNEL_DTQ_T_DTQCNT head; | |
136 | 133 | |
137 | 134 | /* %jp{RO部取得} */ |
138 | 135 | dtqcb_ro = _KERNEL_DTQ_GET_DTQCB_RO(dtqid, dtqcb); |
139 | - | |
140 | - /* %jp{データキュー情報取得} */ | |
141 | - sdtqcnt = _KERNEL_DTQ_GET_SDTQCNT(dtqcb); | |
142 | - dtq = _KERNEL_DTQ_GET_DTQ(dtqcb_ro); | |
143 | - | |
144 | - if ( sdtqcnt > 0 ) /* %jp{キューにデータはあるか?} */ | |
136 | + | |
137 | + /* %jp{データキュー取得} */ | |
138 | + dtq = _KERNEL_DTQ_GET_DTQ(dtqcb_ro); | |
139 | + | |
140 | + /* %jp{キューからデータを取り出し} */ | |
141 | + head = _KERNEL_DTQ_GET_HEAD(dtqcb); | |
142 | + dtqcnt = _KERNEL_DTQ_GET_DTQCNT(dtqcb_ro); | |
143 | + *p_data = dtq[head]; | |
144 | + | |
145 | + /* %jp{送信待ちタスクがあればデータを追加} */ | |
146 | + if ( tskhdl != _KERNEL_TSKHDL_NULL ) | |
147 | + { | |
148 | + /* %jp{送信データ格納} */ | |
149 | + tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */ | |
150 | + dtq[head] = (VP_INT)_KERNEL_TSK_GET_DATA(tcb); | |
151 | + } | |
152 | + else | |
145 | 153 | { |
146 | - _KERNEL_DTQ_T_DTQCNT head; | |
147 | - _KERNEL_DTQ_T_DTQCNT dtqcnt; | |
148 | - | |
149 | - /* %jp{キューからデータを取り出し} */ | |
150 | - head = _KERNEL_DTQ_GET_HEAD(dtqcb); | |
151 | - dtqcnt = _KERNEL_DTQ_GET_DTQCNT(dtqcb_ro); | |
152 | - *p_data = dtq[head]; | |
153 | - | |
154 | - /* %jp{データ個数を減ずる} */ | |
154 | + /* %jp{送信待ちが無ければキューのデータ個数を減ずる} */ | |
155 | 155 | sdtqcnt--; |
156 | 156 | _KERNEL_DTQ_SET_SDTQCNT(dtqcb, sdtqcnt); |
157 | + } | |
158 | + | |
159 | + /* %jp{先頭位置をずらす} */ | |
160 | + if ( head + 1 < dtqcnt ) | |
161 | + { | |
162 | + head++; | |
163 | + } | |
164 | + else | |
165 | + { | |
166 | + head = 0; | |
167 | + } | |
168 | + _KERNEL_DTQ_SET_HEAD(dtqcb, head); | |
157 | 169 | |
158 | - /* %jp{先頭位置をずらす} */ | |
159 | - if ( head + 1 < dtqcnt ) | |
160 | - { | |
161 | - head++; | |
162 | - } | |
163 | - else | |
164 | - { | |
165 | - head = 0; | |
166 | - } | |
167 | - _KERNEL_DTQ_SET_HEAD(dtqcb, head); | |
170 | + if ( tskhdl != _KERNEL_TSKHDL_NULL ) | |
171 | + { | |
172 | + /* %jp{タスクディスパッチの実行} */ | |
173 | + _KERNEL_DSP_TSK(); | |
174 | + } | |
175 | + | |
176 | + ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */ | |
177 | + } | |
178 | + else | |
179 | +#endif | |
180 | + { | |
181 | +#if _KERNEL_SPT_DTQ_DTQCNT_ZERO | |
182 | + if ( tskhdl != _KERNEL_TSKHDL_NULL ) | |
183 | + { | |
184 | + /* %jp{送信データ取得} */ | |
185 | + tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */ | |
186 | + *p_data = (VP_INT)_KERNEL_TSK_GET_DATA(tcb); /* %jp{送信データ格納} */ | |
187 | + | |
188 | + /* %jp{タスクディスパッチの実行} */ | |
189 | + _KERNEL_DSP_TSK(); | |
168 | 190 | |
169 | 191 | ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */ |
170 | 192 | } |
171 | 193 | else |
194 | +#endif | |
172 | 195 | { |
173 | 196 | if ( tmout == TMO_POL ) |
174 | 197 | { |
@@ -176,6 +199,9 @@ ER _kernel_rcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout) | ||
176 | 199 | } |
177 | 200 | else |
178 | 201 | { |
202 | + /* %jp{RO部取得} */ | |
203 | + dtqcb_ro = _KERNEL_DTQ_GET_DTQCB_RO(dtqid, dtqcb); | |
204 | + | |
179 | 205 | /* %jp{実行中タスクを取得} */ |
180 | 206 | tskhdl = _KERNEL_SYS_GET_RUNTSK(); /* %jp{タスクハンドル取得} */ |
181 | 207 | tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */ |
@@ -192,17 +218,17 @@ ER _kernel_rcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout) | ||
192 | 218 | #if _KERNEL_SPT_TRCV_DTQ |
193 | 219 | if ( tmout != TMO_FEVR ) |
194 | 220 | { |
195 | - _KERNEL_DTQ_ADD_TOQ(tskhdl, tmout); /* %jp{タイムアウトキューに追加} */ | |
221 | + _KERNEL_DTQ_ADD_RTOQ(tskhdl, tmout); /* %jp{タイムアウトキューに追加} */ | |
196 | 222 | } |
197 | 223 | #endif |
198 | - | |
224 | + | |
199 | 225 | /* %jp{タスクディスパッチの実行} */ |
200 | 226 | _KERNEL_DSP_TSK(); |
201 | - | |
227 | + | |
202 | 228 | /* %jp{エラーコードの取得} */ |
203 | 229 | ercd = _KERNEL_TSK_GET_ERCD(tcb); |
204 | 230 | } |
205 | - } | |
231 | + } | |
206 | 232 | } |
207 | 233 | |
208 | 234 | _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ |
@@ -211,9 +237,7 @@ ER _kernel_rcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout) | ||
211 | 237 | } |
212 | 238 | |
213 | 239 | |
214 | - | |
215 | 240 | #endif /* _KERNEL_SPT_KRCV_DTQ */ |
216 | 241 | |
217 | 242 | |
218 | - | |
219 | 243 | /* end of file */ |