📄 os_q.lst
字号:
249 /*********************************************************************************************************
250 ** 函数名称: OSQAccept
251 ** 功能描述: 无等待从消息队列中取得消息
252 ** 输 入: Ret:返回的消息
253 ** Buf:指向队列的指针
254 ** 输 出: NOT_OK:参数错误
255 ** OS_Q_OK:收到消息
256 ** OS_Q_TMO:超时到
257 ** OS_Q_NOT_OK:无消息
258 ** 全局变量: 无
259 ** 调用模块: OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
260 **
261 ** 作 者: 陈明计
262 ** 日 期: 2002年9月1日
263 **-------------------------------------------------------------------------------------------------------
264 ** 修改人:
265 ** 日 期:
266 **-------------------------------------------------------------------------------------------------------
267 ********************************************************************************************************/
268 #if EN_OS_Q_ACCEPT > 0
269 uint8 OSQAccept(uint8 data *Ret, uint8 OS_Q_MEM_SEL *Buf)
270 {
271 1 #if EN_OS_Q_CHK > 0
272 1 if (Buf == NULL)
273 1 {
274 2 return NOT_OK;
275 2 }
276 1 #endif
277 1
278 1 OS_ENTER_CRITICAL();
279 1
280 1 /* 判断消息队列中是否有消息 */
281 1 if (*Buf != 0)
282 1 {
283 2 /* 有,消息出队 */
284 2 Buf[0]--;
285 2 Buf[2]++;
286 2 if (Buf[2] >= Buf[1])
287 2 {
288 3 #if OS_MAX_TASKS < 9
289 3 Buf[2] = 4;
290 3 #else
Buf[2] = 5;
#endif
293 3 }
294 2 *Ret = Buf[Buf[2]];
295 2 OS_EXIT_CRITICAL();
296 2 return OS_Q_OK;
297 2 }
298 1 else
299 1 {
300 2 /* 无,返回错误码 */
301 2 OS_EXIT_CRITICAL();
302 2 return OS_Q_NOT_OK;
C51 COMPILER V7.06 OS_Q 06/06/2005 16:32:36 PAGE 6
303 2 }
304 1 }
305 #endif
306
307
308 /*********************************************************************************************************
309 ** 函数名称: OSQIntPost
310 ** 功能描述: 中断中FIFO方式发送消息
311 ** 输 入: Buf:指向队列的指针
312 ** Data:消息数据
313 ** 输 出: OS_Q_FULL:队列满
314 ** OS_Q_OK:发送成功
315 ** 全局变量: 无
316 ** 调用模块: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
317 **
318 ** 作 者: 陈明计
319 ** 日 期: 2002年9月1日
320 **-------------------------------------------------------------------------------------------------------
321 ** 修改人: 陈明计
322 ** 日 期: 2002年9月9日
323 **------------------------------------------------------------------------------------------------------
324 ** 修改人: 陈明计
325 ** 日 期: 2002年10月26日
326 **------------------------------------------------------------------------------------------------------
327 ** 修改人:
328 ** 日 期:
329 **-------------------------------------------------------------------------------------------------------
330 ********************************************************************************************************/
331 #if EN_OS_Q_INT_POST > 0 || EN_OS_Q_POST > 0
332 uint8 OSQIntPost(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
333 {
334 1 uint8 temp,i;
335 1
336 1 #if EN_OS_Q_CHK > 0
337 1 if (Buf == NULL)
338 1 {
339 2 return NOT_OK;
340 2 }
341 1 #endif
342 1
343 1 OS_ENTER_CRITICAL();
344 1
345 1 /* 队列是否已满 */
346 1 #if OS_MAX_TASKS < 9
347 1 if (Buf[0] < (Buf[1]-4))
348 1 #else
if (Buf[0] < (Buf[1]-5))
#endif
351 1 {
352 2 /* 使用堆栈是为了使函数具有重入性 */
353 2 #ifdef __C51__
354 2 SP++;
355 2 *((uint8 data *)SP) = Data;
356 2 #endif
357 2 /* 计算新入队消息存储位置 */
358 2 temp = Buf[2] + Buf[0] + 1;
359 2 if (temp >= Buf[1])
360 2 {
361 3 #if OS_MAX_TASKS < 9
362 3 temp = temp - Buf[1]+4;
363 3 #else
temp = temp - Buf[1]+5;
C51 COMPILER V7.06 OS_Q 06/06/2005 16:32:36 PAGE 7
#endif
366 3 }
367 2 /* 存储消息 */
368 2 #ifdef __C51__
369 2 Buf[temp] = *((uint8 data *)SP);
370 2 SP--;
371 2 #else
Buf[temp] = Data;
#endif
374 2
375 2 Buf[0]++; /* 消息数目加一 */
376 2 /* 判断消息入队前消息队列是否为空 */
377 2 if (Buf[0] == 1)
378 2 {
379 3 /* 为空,可能有任务等待消息,查找之 */
380 3 temp = Buf[3];
381 3 #if OS_MAX_TASKS < 9
382 3 for (i = 0; i < OS_MAX_TASKS; i++)
383 3 {
384 4 if ((temp & 0x01) != 0)
385 4 {
386 5 break;
387 5 }
388 4 temp = temp >> 1;
389 4 }
390 3 if (i < OS_MAX_TASKS )
391 3 {
392 4 /* 查到,使其中优先级最高的任务进入就绪状态,并将其从等待队列中清除 */
393 4 Buf[3] &= ~OSMapTbl[i];
394 4 OSIntSendSignal(i);
395 4 }
396 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];
C51 COMPILER V7.06 OS_Q 06/06/2005 16:32:36 PAGE 8
}
OSIntSendSignal(i);
}
#endif
431 3 }
432 2 OS_EXIT_CRITICAL();
433 2 return OS_Q_OK;
434 2 }
435 1 else
436 1 {
437 2 OS_EXIT_CRITICAL();
438 2 return OS_Q_FULL;
439 2 }
440 1 }
441 #endif
442
443 /*********************************************************************************************************
444 ** 函数名称: OSQIntPostFront
445 ** 功能描述: 中断中LIFO方式发送消息
446 ** 输 入: Buf:指向队列的指针
447 ** Data:消息数据
448 ** 输 出: OS_Q_FULL:队列满
449 ** OS_Q_OK:发送成功
450 ** 全局变量: 无
451 ** 调用模块: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
452 **
453 ** 作 者: 陈明计
454 ** 日 期: 2002年9月1日
455 **-------------------------------------------------------------------------------------------------------
456 ** 修改人:
457 ** 日 期:
458 **-------------------------------------------------------------------------------------------------------
459 ********************************************************************************************************/
460 #if EN_OS_Q_INT_POST_FRONT > 0 || EN_OS_Q_POST_FRONT > 0
461 uint8 OSQIntPostFront(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
462 {
463 1 uint8 temp,i;
464 1
465 1 #if EN_OS_Q_CHK > 0
466 1 if (Buf == NULL)
467 1 {
468 2 return NOT_OK;
469 2 }
470 1 #endif
471 1
472 1 OS_ENTER_CRITICAL();
473 1
474 1 /* 队列是否已满 */
475 1 #if OS_MAX_TASKS < 9
476 1 if (Buf[0] < (Buf[1]-4))
477 1 #else
if (Buf[0] < (Buf[1]-5))
#endif
480 1 {
481 2 /* 存储消息 */
482 2 Buf[Buf[2]] = Data;
483 2 Buf[0]++; /* 消息数目增加一 */
484 2 /* 指向新的将要出队的消息 */
485 2 Buf[2]--;
486 2 #if OS_MAX_TASKS < 9
487 2 if (Buf[2] < 4)
488 2 #else
C51 COMPILER V7.06 OS_Q 06/06/2005 16:32:36 PAGE 9
if (Buf[2] < 5)
#endif
491 2 {
492 3 Buf[2] = Buf[1]-1;
493 3 }
494 2
495 2 /* 判断消息入队前消息队列是否为空 */
496 2 if (Buf[0] == 1)
497 2 {
498 3 /* 为空,可能有任务等待消息,查找之 */
499 3 temp = Buf[3];
500 3 #if OS_MAX_TASKS < 9
501 3 for (i = 0; i < OS_MAX_TASKS; i++)
502 3 {
503 4 if ((temp & 0x01) != 0)
504 4 {
505 5 break;
506 5 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -