ucosii启动说明

main(){

    OSInit();   ------初始化系统的一些变量
     ......
    OSTaskCreate(MainTask,(void *)0, &MainTaskStk[MainTaskStkLengh - 1], MainTaskPrio);  //建立任务
    ...... 
    OSStart();  //开始启动任务

}

1、系统的初始化

void  OSInit (void)

{
#if OS_VERSION >= 204
    OSInitHookBegin();                                           /* Call port specific initialization code   */
#endif
    // 混杂项初始化      
    OS_InitMisc();                                               /* Initialize miscellaneous variables         */
    // 初始化就绪表    
    OS_InitRdyList();                                            /* Initialize the Ready List                 */
    // 初始化TCB链表 
    OS_InitTCBList();                                            /* Initialize the free list of OS_TCBs      */
    // 初始化event链表
    OS_InitEventList();                                          /* Initialize the free list of OS_EVENTs    */

#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
    OS_FlagInit();                                               /* Initialize the event flag structures     */
#endif

#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
    OS_MemInit();                                                /* Initialize the memory manager            */
#endif

#if (OS_Q_EN > 0) && (OS_MAX_QS > 0)
    OS_QInit();                                                  /* Initialize the message queue structures  */
#endif

    // 创建空闲任务TaskIdle
    OS_InitTaskIdle();                                           /* Create the Idle Task                      */
#if OS_TASK_STAT_EN > 0
    // 创建统计任务TaskStat 
    OS_InitTaskStat();                                           /* Create the Statistic Task                */
#endif

#if OS_TMR_EN > 0
    OSTmr_Init();                                                /* Initialize the Timer Manager             */
#endif

#if OS_VERSION >= 204
    OSInitHookEnd();                                             /* Call port specific init. code            */
#endif

#if OS_VERSION >= 270 && OS_DEBUG_EN > 0
    OSDebugInit();
#endif
}

-----------------------------------------------------------------------------------------------------------------------------------------------

2、任务的建立

INT8U  OSTaskCreate (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT8U prio)

{
    OS_STK    *psp;
    INT8U      err;
#if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
    OS_CPU_SR  cpu_sr = 0;
#endif

#if OS_ARG_CHK_EN > 0
    // 检查优先级是否有效
    if (prio > OS_LOWEST_PRIO)                 /* Make sure priority is within allowable range           */
    {             
        return (OS_PRIO_INVALID);
    }
#endif
    // 关闭中断
    OS_ENTER_CRITICAL();
    if (OSIntNesting > 0)                      /* Make sure we don't create the task from within an ISR  */
    {                  
        OS_EXIT_CRITICAL();
        return (OS_ERR_TASK_CREATE_ISR);
    }
    // 检查优先级是否被占用
    if (OSTCBPrioTbl[prio] == (OS_TCB *)0)      /* Make sure task doesn't already exist at this priority  */
    { 
        // 赶紧占用TCB,先置1表示占用了,下面会有函数进行真正的初始化
        OSTCBPrioTbl[prio] = (OS_TCB *)1;    /* Reserve the priority to prevent others from doing ...  */
                                             /* ... the same thing until task is created.              */
        // 打开中断
        OS_EXIT_CRITICAL();
        // 初始化任务堆栈           
        psp = OSTaskStkInit(task, p_arg, ptos, 0);              /* Initialize the task's stack         */
        // 初始化TCB
        err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);        
        if (err == OS_NO_ERR) 
        {
            if (OSRunning == OS_TRUE)          /* Find highest priority task if multitasking has started */
            {      
                // 找出优先级最高的任务并进行任务切换
                OS_Sched();
            }
        } 
        else 
        {
            OS_ENTER_CRITICAL();
            // 出错则释放掉被抢占的TCB
            OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others                 */
            OS_EXIT_CRITICAL();
        }
        return (err);
    }
    OS_EXIT_CRITICAL();
    return (OS_PRIO_EXIST);
}

--------------------------------------------------------------------------------------------------------------------------------------------------------------

3、开始启动任务

void  OSStart (void)
{
    if (OSRunning == OS_FALSE)
    {
        // 计算出就绪任务中优先级最高的任务的优先级,将其保存在OSPrioHighRdy
        OS_SchedNew();                               /* Find highest priority's task priority number   */
        // 更新
        OSPrioCur     = OSPrioHighRdy;
        OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
        OSTCBCur      = OSTCBHighRdy;
        // 切换到最高级的任务
        OSStartHighRdy();                            /* Execute target specific code to start task     */
    }
}

 

 

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读