📄 os_core.lst
字号:
275 ** 修改人:
276 ** 日 期:
277 **------------------------------------------------------------------------------------------------------
278 ********************************************************************************************************/
279 void OSIntExit(void)
280
281 {
282 1 uint8 temp;
283 1
284 1 OS_ENTER_CRITICAL();
285 1 /* 中断嵌套处理 */
286 1 #if EN_OS_INT_ENTER > 0
287 1 if (OSIntNesting > 0)
288 1 {
289 2 OSIntNesting--;
290 2 }
291 1 if (OSIntNesting == 0)
292 1 {
293 2 #endif
294 2
295 2 Os_Enter_Sum = 0; /* 因为在中断中,所以关中断计数器为0 */
296 2 #if OS_MAX_TASKS < 9
297 2 /* 查找处于就绪状态的任务中优先级最高的任务 */
298 2 temp = OSTaskRuning;
299 2 for (OSNextTaskID = 0; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
300 2 {
301 3 if ((temp & 0x01) != 0)
302 3 {
C51 COMPILER V8.08 OS_CORE 10/17/2008 09:11:32 PAGE 6
303 4 break;
304 4 }
305 3 temp = temp >> 1;
306 3 }
307 2 OSIntCtxSw(); /* 进行任务调度 */
308 2 #else
/* 查找处于就绪状态的任务中优先级最高的任务 */
temp = OSTaskRuning % 256;
for (OSNextTaskID = 0; OSNextTaskID < 8; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
goto TaskSw;
}
temp = temp >> 1;
}
temp = OSTaskRuning / 256;
for (; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
TaskSw:
OSIntCtxSw(); /* 进行任务调度 */
#endif
332 2
333 2 #if EN_OS_INT_ENTER >0
334 2 }
335 1 #endif
336 1 OS_EXIT_CRITICAL();
337 1 }
338
339 /*********************************************************************************************************
340 ** 函数名称: OSSched
341 ** 功能描述: 非中断的任务切换函数
342 ** 输 入: 无
343 ** 输 出: 无
344 ** 全局变量: OSIntNesting,OSNextTaskID
345 ** 调用模块: OS_TASK_SW
346 **
347 ** 作 者: 陈明计
348 ** 日 期: 2002年6月20日
349 **-------------------------------------------------------------------------------------------------------
350 ** 修改人: 陈明计
351 ** 日 期: 2002年9月1日
352 **-------------------------------------------------------------------------------------------------------
353 ** 修改人: 陈明计
354 ** 日 期: 2002年9月4日
355 **------------------------------------------------------------------------------------------------------
356 ** 修改人: 陈明计
357 ** 日 期: 2002年10月19日
358 **------------------------------------------------------------------------------------------------------
359 ** 修改人: 陈明计
360 ** 日 期: 2002年12月2日
361 **------------------------------------------------------------------------------------------------------
362 ** 修改人: 陈明计
363 ** 日 期: 2002年12月30日
364 **------------------------------------------------------------------------------------------------------
C51 COMPILER V8.08 OS_CORE 10/17/2008 09:11:32 PAGE 7
365 ** 修改人:
366 ** 日 期:
367 **-------------------------------------------------------------------------------------------------------
368 ********************************************************************************************************/
369 void OSSched(void)
370
371 {
372 1 uint8 temp;
373 1
374 1 OS_ENTER_CRITICAL();
375 1 #if EN_OS_INT_ENTER > 0
376 1 if (OSIntNesting == 0) /* 是否是中断中调用 */
377 1 {
378 2 #endif
379 2
380 2 #if OS_MAX_TASKS < 9
381 2 /* 查找处于就绪状态的任务中优先级最高的任务 */
382 2 temp = OSTaskRuning;
383 2 for (OSNextTaskID = 0; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
384 2 {
385 3 if ((temp & 0x01) != 0)
386 3 {
387 4 break;
388 4 }
389 3 temp = temp >> 1;
390 3 }
391 2 OS_TASK_SW(); /* 进行任务调度 */
392 2 #else
/* 查找处于就绪状态的任务中优先级最高的任务 */
temp = OSTaskRuning % 256;
for (OSNextTaskID = 0; OSNextTaskID < 8; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
goto TaskSw;
}
temp = temp >> 1;
}
temp = OSTaskRuning / 256 ;
for (; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
TaskSw:
OS_TASK_SW(); /* 进行任务调度 */
#endif
416 2
417 2 #if EN_OS_INT_ENTER > 0
418 2 }
419 1 #endif
420 1 OS_EXIT_CRITICAL();
421 1 }
422
423 /*********************************************************************************************************
424 ** 函数名称: OSTimeTick
425 ** 功能描述: 系统时钟处理函数,处理各个任务的延时
426 ** 输 入: 无
C51 COMPILER V8.08 OS_CORE 10/17/2008 09:11:32 PAGE 8
427 ** 输 出: 无
428 ** 全局变量: OSWaitTick
429 ** 调用模块: OSIntSendSignal
430 **
431 ** 作 者: 陈明计
432 ** 日 期: 2002年6月20日
433 **-------------------------------------------------------------------------------------------------------
434 ** 修改人: 陈明计
435 ** 日 期: 2002年9月1日
436 **-------------------------------------------------------------------------------------------------------
437 ** 修改人: 陈明计
438 ** 日 期: 2002年9月4日
439 **------------------------------------------------------------------------------------------------------
440 ** 修改人: 陈明计
441 ** 日 期: 2002年12月30日
442 **------------------------------------------------------------------------------------------------------
443 ** 修改人:
444 ** 日 期:
445 **-------------------------------------------------------------------------------------------------------
446 ********************************************************************************************************/
447 void OSTimeTick(void)
448 {
449 1 uint8 i;
450 1
451 1 for (i = 0; i < OS_MAX_TASKS; i++)
452 1 {
453 2 if (OSWaitTick[i] != 0 )
454 2 {
455 3 OSWaitTick[i]--;
456 3 if (OSWaitTick[i] == 0)
457 3 {
458 4 OSIntSendSignal(i);
459 4 }
460 3 }
461 2 }
462 1 }
463
464 /*********************************************************************************************************
465 ** 函数名称: OSWait
466 ** 功能描述: 系统等待函数,任务调用此函数可以等待一定时间或信号
467 ** 输 入: typ: 等待事件类型,目前可以取以下值,或是其中任意个值的按位或
468 ** K_SIG: 等待信号
469 ** K_TMO: 等待超时
470 ** ticks : 等待超时时的系统嘀嗒数
471 ** 输 出 : NOT_OK : 参数错误
472 ** TMO_EVENT : 超时到
473 ** SIG_EVENT : 有信号
474 ** 全局变量: OSWaitTick
475 ** 调用模块: OSClearSignal
476 **
477 ** 作 者: 陈明计
478 ** 日 期: 2002年6月20日
479 **-------------------------------------------------------------------------------------------------------
480 ** 修改人: 陈明计
481 ** 日 期: 2002年9月1日
482 **-------------------------------------------------------------------------------------------------------
483 ** 修改人: 陈明计
484 ** 日 期: 2002年9月4日
485 **------------------------------------------------------------------------------------------------------
486 ** 修改人: 陈明计
487 ** 日 期: 2002年9月9日
488 **------------------------------------------------------------------------------------------------------
C51 COMPILER V8.08 OS_CORE 10/17/2008 09:11:32 PAGE 9
489 ** 修改人: 陈明计
490 ** 日 期: 2002年10月9日
491 **------------------------------------------------------------------------------------------------------
492 ** 修改人: 陈明计
493 ** 日 期: 2002年12月2日
494 **------------------------------------------------------------------------------------------------------
495 ** 修改人:
496 ** 日 期:
497 **-------------------------------------------------------------------------------------------------------
498 ********************************************************************************************************/
499 uint8 OSWait(uint8 typ, uint8 ticks)
500
501 {
502 1 OSWaitTick[OSTaskID] = ticks; /* 设置超时时间 */
503 1 /* 可以优化寄存器的使用 */
504 1 switch(typ)
505 1 {
506 2 case K_SIG: /* 等待信号,即挂起自己 */
507 2 OSWaitTick[OSTaskID] = 0; /* 没有超时处理 */
508 2 OSClearSignal(OSTaskID); /* 任务进入等待状态 */
509 2 OSSched(); /* 运行下一个任务 */
510 2 return SIG_EVENT;
511 2 case K_TMO: /* 等待超时,即延时一段时间 */
512 2 OS_ENTER_CRITICAL();
513 2 while (OSWaitTick[OSTaskID] != 0) /* 判断超时时间是否到 */
514 2 {
515 3 OSClearSignal(OSTaskID); /* 任务进入等待状态 */
516 3 OSSched(); /* 运行下一个任务 */
517 3 }
518 2 OS_EXIT_CRITICAL();
519 2 return TMO_EVENT;
520 2 case (K_TMO | K_SIG): /* 等待信号(挂起自己)直到超时 */
521 2 /* 别的任务或中断可以恢复它 */
522 2 OS_ENTER_CRITICAL();
523 2 if (OSWaitTick[OSTaskID] == 0) /* 判断超时时间是否到 */
524 2 {
525 3 return TMO_EVENT;
526 3 }
527 2 OSClearSignal(OSTaskID); /* 任务进入等待状态 */
528 2 OS_EXIT_CRITICAL();
529 2 OSSched(); /* 运行下一个任务 */
530 2 if (OSWaitTick[OSTaskID] != 0)
531 2 {
532 3 OSWaitTick[OSTaskID] = 0;
533 3 return SIG_EVENT;
534 3 }
535 2 return TMO_EVENT;
536 2 default:
537 2 OSWaitTick[OSTaskID] = 0;
538 2 return NOT_OK;
539 2 }
540 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 284 ----
CONSTANT SIZE = 9 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
C51 COMPILER V8.08 OS_CORE 10/17/2008 09:11:32 PAGE 10
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -