📄 os_core.lst
字号:
290 ********************************************************************************************************/
291 void OSTaskSuspend(uint8 TaskID) small
292 {
293 1 OSWaitTick[TaskID] = 0; /* 没有超时处理 */
294 1
295 1 OS_TaskSuspend(TaskID);
296 1 OSSched(); /* 开始任务切换 */
297 1 }
298
299 /*********************************************************************************************************
300 ** 函数名称: OSFindNextRunningTask
301 ** 功能描述: 查找下一个优先级最高的就绪任务
302 ** 输 入: 无
C51 COMPILER V8.05a OS_CORE 03/10/2007 13:05:45 PAGE 6
303 ** 输 出: OSNextTaskID:存储查找结果
304 ** 全局变量: OSTaskRuning,OSTaskCreated
305 ** 调用模块: 无
306 **
307 ** 作 者: 陈明计
308 ** 日 期: 2003年8月3日
309 **-------------------------------------------------------------------------------------------------------
310 ** 修改人:
311 ** 日 期:
312 **-------------------------------------------------------------------------------------------------------
313 ********************************************************************************************************/
314 void OSFindNextRunningTask(void) small
315 {
316 1 uint8 temp;
317 1
318 1 temp = OSTaskRuning[0] & OSTaskCreated[0];
319 1 #if OS_MAX_TASKS < 9
320 1 /* 查找处于就绪状态的任务中优先级最高的任务 */
321 1 for (OSNextTaskID = 0; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
322 1 {
323 2 if ((temp & 0x01) != 0)
324 2 {
325 3 break;
326 3 }
327 2 temp = temp >> 1;
328 2 }
329 1 return;
330 1 #else
/* 查找处于就绪状态的任务中优先级最高的任务 */
for (OSNextTaskID = 0; OSNextTaskID < 8; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
return;
}
temp = temp >> 1;
}
temp = OSTaskRuning[1] & OSTaskCreated[1];
for (; OSNextTaskID < OS_MAX_TASKS; OSNextTaskID++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
return;
#endif
351 1 }
352
353 /*********************************************************************************************************
354 ** 函数名称: OSIntExit
355 ** 功能描述: 中断退出处理函数,在此进行中断后的任务切换
356 ** 输 入: 无
357 ** 输 出: 无
358 ** 全局变量: OSIntNesting,OSNextTaskID
359 ** 调用模块: OSIntCtxSw
360 **
361 ** 作 者: 陈明计
362 ** 日 期: 2003年8月3日
363 **-------------------------------------------------------------------------------------------------------
364 ** 修改人:
C51 COMPILER V8.05a OS_CORE 03/10/2007 13:05:45 PAGE 7
365 ** 日 期:
366 **------------------------------------------------------------------------------------------------------
367 ********************************************************************************************************/
368 uint8 OSIntExit(void) small
369
370 {
371 1 OS_ENTER_CRITICAL();
372 1 /* 中断嵌套处理 */
373 1 if (OSIntNesting > 0)
374 1 {
375 2 OSIntNesting--;
376 2 }
377 1 if (OSIntNesting == 0)
378 1 {
379 2 Os_Enter_Sum = 0; /* 因为在中断中,所以关中断计数器为0 */
380 2 OSFindNextRunningTask();
381 2 OSIntCtxSw(); /* 进行任务调度 */
382 2 return TRUE;
383 2 }
384 1 OS_EXIT_CRITICAL();
385 1 return FALSE;
386 1 }
387
388 /*********************************************************************************************************
389 ** 函数名称: OSSched
390 ** 功能描述: 非中断的任务切换函数
391 ** 输 入: 无
392 ** 输 出: 无
393 ** 全局变量: OSIntNesting,OSNextTaskID
394 ** 调用模块: OS_TASK_SW
395 **
396 ** 作 者: 陈明计
397 ** 日 期: 2003年8月3日
398 **------------------------------------------------------------------------------------------------------
399 ** 修改人:
400 ** 日 期:
401 **-------------------------------------------------------------------------------------------------------
402 ********************************************************************************************************/
403 void OSSched(void) small
404
405 {
406 1 OS_ENTER_CRITICAL();
407 1 if (OSIntNesting == 0) /* 是否是中断中调用 */
408 1 {
409 2 OSFindNextRunningTask();
410 2 OS_TASK_SW(); /* 进行任务调度 */
411 2 }
412 1 OS_EXIT_CRITICAL();
413 1 }
414
415 /*********************************************************************************************************
416 ** 函数名称: OSTimeTick
417 ** 功能描述: 系统时钟处理函数,处理各个任务的延时
418 ** 输 入: 无
419 ** 输 出: 无
420 ** 全局变量: OSWaitTick
421 ** 调用模块: OSIntSendSignal
422 **
423 ** 作 者: 陈明计
424 ** 日 期: 2003年8月3日
425 **------------------------------------------------------------------------------------------------------
426 ** 修改人:
C51 COMPILER V8.05a OS_CORE 03/10/2007 13:05:45 PAGE 8
427 ** 日 期:
428 **-------------------------------------------------------------------------------------------------------
429 ********************************************************************************************************/
430 void OSTimeTick(void) small
431 {
432 1 uint8 i;
433 1
434 1 for (i = 0; i < OS_MAX_TASKS; i++)
435 1 {
436 2 if (OSWaitTick[i] != 0 )
437 2 {
438 3 OSWaitTick[i]--;
439 3 if (OSWaitTick[i] == 0)
440 3 {
441 4 #if OS_MAX_TASKS < 9
442 4 OSTaskRuning[0] |= OSMapTbl[i];
443 4 #else
if (i < 8)
{
OSTaskRuning[0] |= OSMapTbl[i];
}
else
{
OSTaskRuning[1] |= OSMapTbl[i & 0x07];
}
#endif
453 4 }
454 3 }
455 2 }
456 1 OSSched();
457 1 }
458
459 /*********************************************************************************************************
460 ** 函数名称: OSTimeDly
461 ** 功能描述: 系统等待函数,任务调用此函数可以等待一定时间
462 ** 输 入: ticks : 等待超时时的系统嘀嗒数
463 ** 输 出 : 无
464 **
465 ** 全局变量: OSWaitTick
466 ** 调用模块: OS_TaskSuspend,OSSched
467 **
468 ** 作 者: 陈明计
469 ** 日 期: 2003年8月3日
470 **-------------------------------------------------------------------------------------------------------
471 ** 修改人:
472 ** 日 期:
473 **-------------------------------------------------------------------------------------------------------
474 ********************************************************************************************************/
475 void OSTimeDly(uint8 ticks) small
476 {
477 1 OSWaitTick[OSTaskID] = ticks; /* 设置超时时间 */
478 1 OS_ENTER_CRITICAL();
479 1 while (OSWaitTick[OSTaskID] != 0) /* 判断超时时间是否到 */
480 1 {
481 2 OS_TaskSuspend(OSTaskID); /* 任务进入等待状态 */
482 2 OSSched(); /* 开始任务切换 */
483 2 }
484 1 OS_EXIT_CRITICAL();
485 1 }
486
487 /*********************************************************************************************************
488 ** 函数名称: OSTimeDlyResume
C51 COMPILER V8.05a OS_CORE 03/10/2007 13:05:45 PAGE 9
489 ** 功能描述: 让处在延时期的任务结束延时
490 ** 输 入: TaskID : 任务ID
491 ** 输 出 : 无
492 ** 全局变量: OSWaitTick
493 ** 调用模块: OSTaskResume
494 **
495 ** 作 者: 陈明计
496 ** 日 期: 2003年8月3日
497 **-------------------------------------------------------------------------------------------------------
498 ** 修改人:
499 ** 日 期:
500 **-------------------------------------------------------------------------------------------------------
501 ********************************************************************************************************/
502 void OSTimeDlyResume(uint8 TaskID) small
503 {
504 1 OSWaitTick[TaskID] = 0;
505 1 OSTaskResume(TaskID);
506 1 }
507
508
509 /*********************************************************************************************************
510 ** 函数名称: OSWait
511 ** 功能描述: 系统等待函数,任务调用此函数可以等待一定时间或信号
512 ** 输 入: typ: 等待事件类型,目前可以取以下值,或是其中任意个值的按位或
513 ** K_SIG: 等待信号
514 ** K_TMO: 等待超时
515 ** ticks : 等待超时时的系统嘀嗒数
516 ** 输 出 : NOT_OK : 参数错误
517 ** TMO_EVENT : 超时到
518 ** SIG_EVENT : 有信号
519 ** 全局变量: OSWaitTick
520 ** 调用模块: OSTaskSuspend,OSTimeDly,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
521 **
522 ** 作 者: 陈明计
523 ** 日 期: 2003年8月3日
524 **------------------------------------------------------------------------------------------------------
525 ** 修改人: 陈明计
526 ** 日 期: 2004年2月4日
527 **-------------------------------------------------------------------------------------------------------
528 ********************************************************************************************************/
529 #ifndef OSWait_EN
#define OSWait_EN 0
#endif
532
533 #if OSWait_EN > 0
uint8 OSWait(uint8 typ, uint8 ticks) small
{
OSWaitTick[OSTaskID] = ticks; /* 设置超时时间 */
/* 可以优化寄存器的使用 */
switch(typ)
{
case K_SIG: /* 等待信号,即挂起自己 */
OSTaskSuspend(OSTaskID);
return SIG_EVENT;
case K_TMO: /* 等待超时,即延时一段时间 */
OSTimeDly(OSWaitTick[OSTaskID]);
return TMO_EVENT;
case (K_TMO | K_SIG): /* 等待信号(挂起自己)直到超时 */
/* 别的任务或中断可以恢复它 */
OS_ENTER_CRITICAL();
if (OSWaitTick[OSTaskID] == 0) /* 判断超时时间是否到 */
{
C51 COMPILER V8.05a OS_CORE 03/10/2007 13:05:45 PAGE 10
return TMO_EVENT;
}
OS_TaskSuspend(OSTaskID); /* 任务进入等待状态 */
OSSched();
OS_EXIT_CRITICAL();
if (OSWaitTick[OSTaskID] != 0)
{
OSWaitTick[OSTaskID] = 0;
return SIG_EVENT;
}
return TMO_EVENT;
default:
OSWaitTick[OSTaskID] = 0;
return NOT_OK;
}
}
#endif
568 /*********************************************************************************************************
569 ** End Of File
570 ********************************************************************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 312 ----
CONSTANT SIZE = 9 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 9 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -