操作系统之进程和线程--uC/os-II实例--建立任务

来源:互联网 发布:瓷砖专用进销存软件 编辑:程序博客网 时间:2024/05/17 09:22

1.建立任务,OSTaskCreate()  /  OSTaskCreateExt()

Code:
  1. INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)  
  2. {  
  3.     void   *psp;  
  4.     INT8U   err;  
  5.   
  6.     if (prio > OS_LOWEST_PRIO) {                                              (1)  
  7.         return (OS_PRIO_INVALID);  
  8.     }  
  9.     OS_ENTER_CRITICAL();  
  10.     if (OSTCBPrioTbl[prio] == (OS_TCB *)0) {                                  (2)  
  11.         OSTCBPrioTbl[prio] = (OS_TCB *)1;                                     (3)  
  12.         OS_EXIT_CRITICAL();                                                   (4)  
  13.         psp = (void *)OSTaskStkInit(task, pdata, ptos, 0);                    (5)  
  14.         err = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0);            (6)  
  15.         if (err == OS_NO_ERR) {                                               (7)  
  16.             OS_ENTER_CRITICAL();  
  17.             OSTaskCtr++;                                                      (8)  
  18.             OSTaskCreateHook(OSTCBPrioTbl[prio]);                             (9)  
  19.             OS_EXIT_CRITICAL();  
  20.             if (OSRunning) {                                                  (10)  
  21.                 OSSched();                                                    (11)  
  22.             }  
  23.         } else {  
  24.             OS_ENTER_CRITICAL();  
  25.             OSTCBPrioTbl[prio] = (OS_TCB *)0;                                 (12)  
  26.             OS_EXIT_CRITICAL();  
  27.         }  
  28.         return (err);  
  29.     } else {  
  30.         OS_EXIT_CRITICAL();  
  31.         return (OS_PRIO_EXIST);  
  32.     }  
  33. }  

(5)  OSTaskCreate()调用OSTaskStkInit(),它负责建立任务的堆栈。OSTaskStkInit()函数返回新的堆栈栈顶(psp),并被保存在任务的0S_TCB中。


(6)  一旦OSTaskStkInit()函数完成了建立堆栈的任务,OSTaskCreate()就调用OSTCBInit(),从空闲的OS_TCB池中获得并初始化一个OS_TCB。


(9)  OSTaskCreate()调用OSTaskCreateHook(),OSTaskCreateHook()是用户自己定义的函数,用来扩展OSTaskCreate()的功能。注意,OSTaskCreate()在调用OSTaskCreateHook()时,中断是关掉的,所以用户应该使OSTaskCreateHook()函数中的代码尽量简化,因为这将直接影响中断的响应时间。OSTaskCreateHook()在被调用时会收到指向任务被建立时的OS_TCB的指针。这意味着该函数可以访问OS_TCB数据结构中的所有成员。


(10)(11)  如果OSTaskCreate()函数是在某个任务的执行过程中被调用(即OSRunning置为True),则任务调度函数会被调用来判断是否新建立的任务比原来的任务有更高的优先级。如果新任务的优先级更高,内核会进行一次从旧任务到新任务的任务切换。如果在多任务调度开始之前(即用户还没有调用OSStart()),新任务就已经建立了,则任务调度函数不会被调用。

用OSTaskCreateExt()函数来建立任务会更加灵活,但会增加一些额外的开销。

Code:
  1. INT8U OSTaskCreateExt (void   (*task)(void *pd),  
  2.                        void    *pdata,  
  3.                        OS_STK  *ptos,  
  4.                        INT8U    prio,  
  5.                        INT16U   id,  
  6.                        OS_STK  *pbos,  
  7.                        INT32U   stk_size,  
  8.                        void    *pext,  
  9.                        INT16U   opt)  
  10. {  ...  }