• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

HOS-V4 Advance の開発リポジトリ


Commit MetaInfo

Revision85b0e77d02b663c84a72ffa35384f41843fcc205 (tree)
Time2009-08-16 10:40:47
Authorryuz <ryuz>
Commiterryuz

Log Message

(none)

Change Summary

Incremental Difference

--- a/kernel/include/config/cfgknl.h
+++ b/kernel/include/config/cfgknl.h
@@ -228,6 +228,10 @@ C言語構文(例えばtypedefなど)はこの中には記載せず、マクロ
228228 /* Data queues */
229229 /* ---------------------------------------------- */
230230
231+/* Configuration */
232+#define _KERNEL_CFG_DTQ_DTQCNT_ZERO TRUE /**< %jp{キューサイズ0に対応する} */
233+#define _KERNEL_CFG_DTQ_DTQCNT_NONZERO TRUE /**< %jp{キューサイズ非0に対応する} */
234+
231235 /* Attribute */
232236 #define _KERNEL_CFG_DTQ_TA_TFIFO TRUE /**< %jp{TA_TFIFO属性に対応する} */
233237 #define _KERNEL_CFG_DTQ_TA_TPRI TRUE /**< %jp{TA_TPRI属性に対応する} */
--- a/kernel/include/kernel.h
+++ b/kernel/include/kernel.h
@@ -181,9 +181,9 @@ typedef struct t_cdtq
181181 /** %jp{データキュー状態}%en{Data queue state packet} */
182182 typedef struct t_rdtq
183183 {
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} */
187187 } T_RDTQ;
188188
189189
--- a/kernel/include/parser/parsknl.h
+++ b/kernel/include/parser/parsknl.h
@@ -182,6 +182,12 @@
182182 #define _KERNEL_SPT_KSND_DTQ FALSE
183183 #endif
184184
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+
185191
186192 /* Mailboxes */
187193 #define _KERNEL_SPT_CRE_MBX _KERNEL_CFG_CRE_MBX /* cre_mbx */
@@ -985,6 +991,12 @@
985991 #define _KERNEL_DTQCB_SPLIT_RO _KERNEL_CFG_DTQCB_SPLIT_RO
986992 #endif
987993
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
9881000
9891001 /* Attribute */
9901002 #define _KERNEL_SPT_DTQ_TA_TFIFO _KERNEL_CFG_DTQ_TA_TFIFO /**< %jp{TA_TFIFO属性に対応する} */
--- a/kernel/source/object/dtq/prcv_dtq.c
+++ b/kernel/source/object/dtq/prcv_dtq.c
@@ -21,10 +21,13 @@
2121 /** %jp{データキューへの送信(ポーリング)}%en{Send to Data Queue(Polling)} */
2222 ER prcv_dtq(ID dtqid, VP_INT *p_data)
2323 {
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+
2831
2932 /* %jp{コンテキストチェック} */
3033 #if _KERNEL_SPT_PRCV_DTQ_E_CTX
@@ -63,65 +66,87 @@ ER prcv_dtq(ID dtqid, VP_INT *p_data)
6366 /* %jp{待ちタスクがあれば待ち解除} */
6467 tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */
6568
66- /* %jp{送信データ取得} */
67- *p_data = (VP_INT)_KERNEL_TSK_GET_DATA(tcb);
68-
6969 /* %jp{タスクを起す} */
7070 _KERNEL_TSK_SET_ERCD(tcb, E_OK); /* %jp{エラーコード設定} */
7171 _KERNEL_DSP_WUP_TSK(tskhdl); /* %jp{タスクの待ち解除} */
7272 _KERNEL_DTQ_RMV_STOQ(tskhdl); /* %jp{タイムアウトキューからはずす} */
73-
74- /* %jp{タスクディスパッチの実行} */
75- _KERNEL_DSP_TSK();
76-
77- ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */
7873 }
79- else
74+
75+
76+#if _KERNEL_SPT_DTQ_DTQCNT_NONZERO /* %jp{データキュー情報取得} */
77+ sdtqcnt = _KERNEL_DTQ_GET_SDTQCNT(dtqcb);
78+ if ( sdtqcnt > 0 ) /* %jp{キューにデータはあるか?} */
8079 {
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;
8483
8584 /* %jp{RO部取得} */
8685 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 )
9397 {
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{送信待ちが無ければキューのデータ個数を減ずる} */
103105 sdtqcnt--;
104106 _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{送信データ格納} */
105137
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} */
118142 }
119143 else
144+#endif
120145 {
121- ercd = E_TMOUT; /* %jp{タイムアウト}%en{Normal completion} */
146+ ercd = E_TMOUT; /* %jp{タイムアウト} */
122147 }
123148 }
124-
149+
125150 _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */
126151
127152 return ercd;
--- a/kernel/source/object/dtq/rcv_dtq.c
+++ b/kernel/source/object/dtq/rcv_dtq.c
@@ -21,11 +21,13 @@
2121 /** %jp{データキューからの受信} */
2222 ER rcv_dtq(ID dtqid, VP_INT *p_data)
2323 {
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+
2931 /* %jp{コンテキストチェック} */
3032 #if _KERNEL_SPT_RCV_DTQ_E_CTX
3133 if ( _KERNEL_SYS_SNS_DPN() )
@@ -63,61 +65,86 @@ ER rcv_dtq(ID dtqid, VP_INT *p_data)
6365 /* %jp{待ちタスクがあれば待ち解除} */
6466 tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */
6567
66- /* %jp{送信データ取得} */
67- *p_data = (VP_INT)_KERNEL_TSK_GET_DATA(tcb);
68-
6968 /* %jp{タスクを起す} */
7069 _KERNEL_TSK_SET_ERCD(tcb, E_OK); /* %jp{エラーコード設定} */
7170 _KERNEL_DSP_WUP_TSK(tskhdl); /* %jp{タスクの待ち解除} */
7271 _KERNEL_DTQ_RMV_STOQ(tskhdl); /* %jp{タイムアウトキューからはずす} */
73-
74- /* %jp{タスクディスパッチの実行} */
75- _KERNEL_DSP_TSK();
76-
77- ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */
7872 }
79- else
73+
74+
75+#if _KERNEL_SPT_DTQ_DTQCNT_NONZERO /* %jp{データキュー情報取得} */
76+ sdtqcnt = _KERNEL_DTQ_GET_SDTQCNT(dtqcb);
77+ if ( sdtqcnt > 0 ) /* %jp{キューにデータはあるか?} */
8078 {
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;
8482
8583 /* %jp{RO部取得} */
8684 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 )
9396 {
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{送信待ちが無ければキューのデータ個数を減ずる} */
103104 sdtqcnt--;
104105 _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);
105118
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();
116139
117140 ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */
118141 }
119142 else
143+#endif
120144 {
145+ /* %jp{RO部取得} */
146+ dtqcb_ro = _KERNEL_DTQ_GET_DTQCB_RO(dtqid, dtqcb);
147+
121148 /* %jp{実行中タスクを取得} */
122149 tskhdl = _KERNEL_SYS_GET_RUNTSK(); /* %jp{タスクハンドル取得} */
123150 tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */
@@ -130,10 +157,10 @@ ER rcv_dtq(ID dtqid, VP_INT *p_data)
130157 _KERNEL_TSK_SET_WOBJID(tcb, dtqid); /* %jp{待ちオブジェクトID設定} */
131158 _KERNEL_DSP_WAI_TSK(tskhdl); /* %jp{待ち状態に設定} */
132159 _KERNEL_DTQ_ADD_RQUE(dtqcb, dtqcb_ro, tskhdl); /* %jp{待ち行列に追加} */
133-
160+
134161 /* %jp{タスクディスパッチの実行} */
135162 _KERNEL_DSP_TSK();
136-
163+
137164 /* %jp{エラーコードの取得} */
138165 ercd = _KERNEL_TSK_GET_ERCD(tcb);
139166 }
--- a/kernel/source/object/dtq/snd_dtq.c
+++ b/kernel/source/object/dtq/snd_dtq.c
@@ -129,11 +129,10 @@ ER snd_dtq(ID dtqid, VP_INT data)
129129 _KERNEL_TSK_SET_DATA(tcb, data);
130130 _KERNEL_DSP_WAI_TSK(tskhdl);
131131 _KERNEL_DTQ_ADD_SQUE(dtqcb, dtqcb_ro, tskhdl); /* %jp{待ち行列に追加} */
132-
133-
132+
134133 /* %jp{タスクディスパッチの実行} */
135134 _KERNEL_DSP_TSK();
136-
135+
137136 /* %jp{エラーコードの取得} */
138137 ercd = _KERNEL_TSK_GET_ERCD(tcb);
139138 }
--- a/kernel/source/object/dtq/trcv_dtq.c
+++ b/kernel/source/object/dtq/trcv_dtq.c
@@ -72,12 +72,13 @@ ER trcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout)
7272 */
7373 ER _kernel_rcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout)
7474 {
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+
8182 /* %jp{コンテキストチェック} */
8283 #if _KERNEL_SPT_KRCV_DTQ_E_CTX
8384 if ( tmout != TMO_POL && _KERNEL_SYS_SNS_DPN() )
@@ -104,8 +105,8 @@ ER _kernel_rcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout)
104105 return E_NOEXS; /* %jp{オブジェクト未生成}%en{Non-existant object} */
105106 }
106107 #endif
107-
108- /* %jp{コントロールブロック取得} */
108+
109+ /* %jp{データキューコントロールブロック取得} */
109110 dtqcb = _KERNEL_DTQ_ID2DTQCB(dtqid);
110111
111112 /* %jp{送信待ち行列先頭からタスク取り出し} */
@@ -115,60 +116,82 @@ ER _kernel_rcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout)
115116 /* %jp{待ちタスクがあれば待ち解除} */
116117 tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */
117118
118- /* %jp{送信データ取得} */
119- *p_data = (VP_INT)_KERNEL_TSK_GET_DATA(tcb);
120-
121119 /* %jp{タスクを起す} */
122120 _KERNEL_TSK_SET_ERCD(tcb, E_OK); /* %jp{エラーコード設定} */
123121 _KERNEL_DSP_WUP_TSK(tskhdl); /* %jp{タスクの待ち解除} */
124122 _KERNEL_DTQ_RMV_STOQ(tskhdl); /* %jp{タイムアウトキューからはずす} */
125-
126- /* %jp{タスクディスパッチの実行} */
127- _KERNEL_DSP_TSK();
128-
129- ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */
130123 }
131- else
124+
125+
126+#if _KERNEL_SPT_DTQ_DTQCNT_NONZERO /* %jp{データキュー情報取得} */
127+ sdtqcnt = _KERNEL_DTQ_GET_SDTQCNT(dtqcb);
128+ if ( sdtqcnt > 0 ) /* %jp{キューにデータはあるか?} */
132129 {
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;
136133
137134 /* %jp{RO部取得} */
138135 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
145153 {
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{送信待ちが無ければキューのデータ個数を減ずる} */
155155 sdtqcnt--;
156156 _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);
157169
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();
168190
169191 ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */
170192 }
171193 else
194+#endif
172195 {
173196 if ( tmout == TMO_POL )
174197 {
@@ -176,6 +199,9 @@ ER _kernel_rcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout)
176199 }
177200 else
178201 {
202+ /* %jp{RO部取得} */
203+ dtqcb_ro = _KERNEL_DTQ_GET_DTQCB_RO(dtqid, dtqcb);
204+
179205 /* %jp{実行中タスクを取得} */
180206 tskhdl = _KERNEL_SYS_GET_RUNTSK(); /* %jp{タスクハンドル取得} */
181207 tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */
@@ -192,17 +218,17 @@ ER _kernel_rcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout)
192218 #if _KERNEL_SPT_TRCV_DTQ
193219 if ( tmout != TMO_FEVR )
194220 {
195- _KERNEL_DTQ_ADD_TOQ(tskhdl, tmout); /* %jp{タイムアウトキューに追加} */
221+ _KERNEL_DTQ_ADD_RTOQ(tskhdl, tmout); /* %jp{タイムアウトキューに追加} */
196222 }
197223 #endif
198-
224+
199225 /* %jp{タスクディスパッチの実行} */
200226 _KERNEL_DSP_TSK();
201-
227+
202228 /* %jp{エラーコードの取得} */
203229 ercd = _KERNEL_TSK_GET_ERCD(tcb);
204230 }
205- }
231+ }
206232 }
207233
208234 _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */
@@ -211,9 +237,7 @@ ER _kernel_rcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout)
211237 }
212238
213239
214-
215240 #endif /* _KERNEL_SPT_KRCV_DTQ */
216241
217242
218-
219243 /* end of file */