?? os_q.lst
字號:
217 1 else
218 1 {
219 2 /* 無,返回錯誤碼 */
220 2 #ifdef __C51__
221 2 SP--;
222 2 #endif
223 2
224 2 OS_EXIT_CRITICAL();
225 2 return OS_Q_TMO;
226 2 }
227 1 }
228 #endif
229
230 /*********************************************************************************************************
231 ** 函數名稱: OSQAccept
232 ** 功能描述: 無等待從消息隊列中取得消息
233 ** 輸 入: Ret:返回的消息
234 ** Buf:指向隊列的指針
235 ** 輸 出: NOT_OK:參數錯誤
236 ** OS_Q_OK:收到消息
237 ** OS_Q_TMO:超時到
238 ** OS_Q_NOT_OK:無消息
239 ** 全局變量: 無
240 ** 調用模塊: OS_TaskSuspend,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
C51 COMPILER V8.05a OS_Q 03/10/2007 13:05:45 PAGE 5
241 **
242 ** 作 者: 陳明計
243 ** 日 期: 2002年9月1日
244 **-------------------------------------------------------------------------------------------------------
245 ** 修改人:
246 ** 日 期:
247 **-------------------------------------------------------------------------------------------------------
248 ********************************************************************************************************/
249 #if EN_OS_Q_ACCEPT > 0
uint8 OSQAccept(uint8 data *Ret, uint8 OS_Q_MEM_SEL *Buf)
{
#if EN_OS_Q_CHK > 0
if (Buf == NULL)
{
return NOT_OK;
}
#endif
OS_ENTER_CRITICAL();
/* 判斷消息隊列中是否有消息 */
if (*Buf != 0)
{
/* 有,消息出隊 */
Buf[0]--;
Buf[2]++;
if (Buf[2] >= Buf[1])
{
#if OS_MAX_TASKS < 9
Buf[2] = 4;
#else
Buf[2] = 5;
#endif
}
*Ret = Buf[Buf[2]];
OS_EXIT_CRITICAL();
return OS_Q_OK;
}
else
{
/* 無,返回錯誤碼 */
OS_EXIT_CRITICAL();
return OS_Q_NOT_OK;
}
}
#endif
287
288
289 /*********************************************************************************************************
290 ** 函數名稱: OSQPost
291 ** 功能描述: 中斷中FIFO方式發送消息
292 ** 輸 入: Buf:指向隊列的指針
293 ** Data:消息數據
294 ** 輸 出: OS_Q_FULL:隊列滿
295 ** OS_Q_OK:發送成功
296 ** 全局變量: 無
297 ** 調用模塊: OSTaskResume,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
298 **
299 ** 作 者: 陳明計
300 ** 日 期: 2003年8月3日
301 **-------------------------------------------------------------------------------------------------------
302 ** 修改人: 陳明計
C51 COMPILER V8.05a OS_Q 03/10/2007 13:05:45 PAGE 6
303 ** 日 期: 2004年6月8日
304 **-------------------------------------------------------------------------------------------------------
305 ********************************************************************************************************/
306 #if EN_OS_Q_POST > 0
307 uint8 OSQPost(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
308 {
309 1 uint8 temp,i;
310 1
311 1 #if EN_OS_Q_CHK > 0
if (Buf == NULL)
{
return NOT_OK;
}
#endif
317 1
318 1 OS_ENTER_CRITICAL();
319 1
320 1 /* 隊列是否已滿 */
321 1 #if OS_MAX_TASKS < 9
322 1 if (Buf[0] < (Buf[1]-4))
323 1 #else
if (Buf[0] < (Buf[1]-5))
#endif
326 1 {
327 2 /* 使用堆棧是為了使函數具有重入性 */
328 2 #ifdef __C51__
329 2 SP++;
330 2 *((uint8 data *)SP) = Data;
331 2 #endif
332 2 /* 計算新入隊消息存儲位置 */
333 2 temp = Buf[2] + Buf[0] + 1;
334 2 if (temp <= Buf[0] || temp >= Buf[1])
335 2 {
336 3 #if OS_MAX_TASKS < 9
337 3 temp = temp - Buf[1] + 4;
338 3 #else
temp = temp - Buf[1] + 5;
#endif
341 3 }
342 2 /* 存儲消息 */
343 2 #ifdef __C51__
344 2 Buf[temp] = *((uint8 data *)SP);
345 2 SP--;
346 2 #else
Buf[temp] = Data;
#endif
349 2
350 2 Buf[0]++; /* 消息數目加一 */
351 2 /* 判斷消息入隊前消息隊列是否為空 */
352 2 if (Buf[0] == 1)
353 2 {
354 3 /* 為空,可能有任務等待消息,查找之 */
355 3 temp = Buf[3];
356 3 #if OS_MAX_TASKS < 9
357 3 for (i = 0; i < OS_MAX_TASKS; i++)
358 3 {
359 4 if ((temp & 0x01) != 0)
360 4 {
361 5 break;
362 5 }
363 4 temp = temp >> 1;
364 4 }
C51 COMPILER V8.05a OS_Q 03/10/2007 13:05:45 PAGE 7
365 3 if (i < OS_MAX_TASKS )
366 3 {
367 4 /* 查到,使其中優先級最高的任務進入就緒狀態,并將其從等待隊列中清除 */
368 4 Buf[3] &= ~OSMapTbl[i];
369 4 OSTaskResume(i);
370 4 }
371 3 #else
for (i = 0; i < 8; i++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
if (i >= 8 )
{
temp = Buf[4];
for (; i < OS_MAX_TASKS; i++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
}
if (i < OS_MAX_TASKS )
{
/* 查到,使其中優先級最高的任務進入就緒狀態,并將其從等待隊列中清除 */
if (i < 8)
{
Buf[3] &= ~OSMapTbl[i];
}
else
{
Buf[4] &= ~OSMapTbl[i & 0x07];
}
OSTaskResume(i);
}
#endif
406 3 }
407 2 OS_EXIT_CRITICAL();
408 2 return OS_Q_OK;
409 2 }
410 1 else
411 1 {
412 2 OS_EXIT_CRITICAL();
413 2 return OS_Q_FULL;
414 2 }
415 1 }
416 #endif
417
418 /*********************************************************************************************************
419 ** 函數名稱: OSQPostFront
420 ** 功能描述: 中斷中LIFO方式發送消息
421 ** 輸 入: Buf:指向隊列的指針
422 ** Data:消息數據
423 ** 輸 出: OS_Q_FULL:隊列滿
424 ** OS_Q_OK:發送成功
425 ** 全局變量: 無
426 ** 調用模塊: OSTaskResume,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
C51 COMPILER V8.05a OS_Q 03/10/2007 13:05:45 PAGE 8
427 **
428 ** 作 者: 陳明計
429 ** 日 期: 2003年8月3日
430 **-------------------------------------------------------------------------------------------------------
431 ** 修改人:
432 ** 日 期:
433 **-------------------------------------------------------------------------------------------------------
434 ********************************************************************************************************/
435 #if EN_OS_Q_POST_FRONT > 0
uint8 OSQPostFront(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
{
uint8 temp,i;
#if EN_OS_Q_CHK > 0
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -