⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 functionforucos.txt

📁 This the brief for the common function in uCOS system. Valid for elementary user.
💻 TXT
📖 第 1 页 / 共 2 页
字号:
第一章:OS的主函数
μC/OS /sherlock_lai 发表于2008-01-04, 19:06 
 //"..." 表示未知内容,根据系统不同的需要而定

#include "..."             //包含一些头文件
#define  TASK_STACK_SIZE ...    //定义堆栈大小
OS_STK Main_Stack[TASK_STACK_SIZE]= {0, };          //定义堆栈
void Main_Task(void *...);                 //定义主任务
#define Main_PRIO       ...
void Main_Task(void *Id)             
{
...
} 

void Main(void)
{
... //系统的一些初始化
 OSInit();  //OS初始化

 //Create the Main Task
 OSTaskCreate(Main_Task, (void *)0, (OS_STK *)&Main_Stack[TASK_STACK_SIZE-1],  Main_PRIO); 

//建立主任务
 
 OSStart();  //任务开始
}                              

第二章:OSInit() (初始化函数)
μC/OS /sherlock_lai 发表于2008-01-04, 19:30 
void OSInit (void)
{
    INT16U i;


    OSTime        = 0L;                                   

    OSIntNesting  = 0;                                     
    OSLockNesting = 0;                                   //系统的一些参数清0
#if OS_TASK_CREATE_EN  || OS_TASK_CREATE_EXT_EN || OS_TASK_DEL_EN
    OSTaskCtr     = 0;                                     //任务记数器清0
#endif
    OSRunning     = FALSE;                              //操作系统未运行

    OSIdleCtr     = 0L;                                    //空闲任务记数清0

#if OS_TASK_STAT_EN && OS_TASK_CREATE_EXT_EN
    OSIdleCtrRun  = 0L;
    OSIdleCtrMax  = 0L;                                     //系统利用率
    OSStatRdy     = FALSE;                                //统计任务未就绪
#endif
    OSCtxSwCtr    = 0;                                     //任务切换次数清0
    OSRdyGrp      = 0;                                     //就绪任务列表
    for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
        OSRdyTbl[i] = 0;
    }
                
    OSPrioCur     = 0;                                           //当前任务优先级
    OSPrioHighRdy = 0;                                           //将要运行任务优先级
    OSTCBHighRdy  = (OS_TCB *)0;                                //将要运行任务的控制块(TCB)
    OSTCBCur      = (OS_TCB *)0;                                  //当前任务控制块
    OSTCBList     = (OS_TCB *)0;                                      
    for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) {             
        OSTCBPrioTbl[i] = (OS_TCB *)0;
    }
    for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) {        

OSTCBTbl[i].OSTCBNext = &OSTCBTbl[i + 1];
    }
    OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0;   
    OSTCBFreeList                                         = &OSTCBTbl[0];

#if OS_MAX_EVENTS >= 2
    for (i = 0; i < (OS_MAX_EVENTS - 1); i++) {           

        OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
    }
    OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
    OSEventFreeList                          = &OSEventTbl[0];    
#endif

#if OS_Q_EN && (OS_MAX_QS >= 2)
    OSQInit();                                             

#endif

#if OS_MEM_EN && OS_MAX_MEM_PART >= 2
    OSMemInit();                                          

#endif    

#if OS_STK_GROWTH == 1
    #if OS_TASK_CREATE_EXT_EN
    OSTaskCreateExt(OSTaskIdle, 
                    (void *)0,                                //建立空闲任务
                    &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], //                 

                    OS_IDLE_PRIO,                              //
                    OS_TASK_IDLE_ID,
                    &OSTaskIdleStk[0],                        //
                    OS_TASK_IDLE_STK_SIZE, 
                    (void *)0,                                 //
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);//
    #else
    OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
    #endif
#else
    #if OS_TASK_CREATE_EXT_EN
    OSTaskCreateExt(OSTaskIdle, 
                    (void *)0,                                 //
                    &OSTaskIdleStk[0],                         //
                    OS_IDLE_PRIO,                              //
                    OS_TASK_IDLE_ID,
                    &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], //                    OS_TASK_IDLE_STK_SIZE, 
                    (void *)0,                                 //
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);//
    #else
    OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[0], OS_IDLE_PRIO);
    #endif
#endif

#if OS_TASK_STAT_EN 
    #if OS_TASK_CREATE_EXT_EN
        #if OS_STK_GROWTH == 1
        OSTaskCreateExt(OSTaskStat, 
                        (void *)0,                                //建立统计任务
                        &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1], //

                        OS_STAT_PRIO,                             //

                        OS_TASK_STAT_ID,
                        &OSTaskStatStk[0],                        //
                        OS_TASK_STAT_STK_SIZE, 
                        (void *)0,                                //

                        OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);  //
        #else
        OSTaskCreateExt(OSTaskStat, 
                        (void *)0,                                //
                        &OSTaskStatStk[0],                        //
                        OS_STAT_PRIO,                             //
                        OS_TASK_STAT_ID,
                        &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],//
                        OS_TASK_STAT_STK_SIZE, 
                        (void *)0,                                //
                        OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);  //
        #endif
    #else
        #if OS_STK_GROWTH == 1
        OSTaskCreate(OSTaskStat, 
                     (void *)0,                                   //
                     &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],   //
                     OS_STAT_PRIO);                               // 

       #else
        OSTaskCreate(OSTaskStat, 
                     (void *)0,                                   //
                     &OSTaskStatStk[0],                           //
                     OS_STAT_PRIO);                               //

        #endif
    #endif
#endif
}

第三章:OSTaskCreate()
μC/OS /sherlock_lai 发表于2008-01-04, 19:43 
这是OS里创建任务的一种函数,另外一种是OSTaskCreateExt,创建扩展的任务.

INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio) //这里有4个参数,第一个:要创建的任务函数,第二个:传递给任务的指针,第三个:任务堆栈的栈顶个只是,第四个:任务的优先级. 这四个参数是创建普通任务所必须的.  
{
    void   *psp;   
    INT8U   err;


    if (prio > OS_LOWEST_PRIO) {           //任务的优先级必须小于最低任务的优先级,因为OS的任务优先级是从低到高的.

        return (OS_PRIO_INVALID);
    }
    OS_ENTER_CRITICAL();
    if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { //

        OSTCBPrioTbl[prio] = (OS_TCB *)1;    //

        OS_EXIT_CRITICAL();
        psp = (void *)OSTaskStkInit(task, pdata, ptos, 0); //堆栈初始化函数,从这里获得任务堆栈的物理栈顶 

       err = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0);    //初始化一个任务控制块     
        if (err == OS_NO_ERR) {
            OS_ENTER_CRITICAL();
            OSTaskCtr++;                                   //

            OSTaskCreateHook(OSTCBPrioTbl[prio]);          //
            OS_EXIT_CRITICAL();
            if (OSRunning) {                 //如果OS已经运行,则进行一次任务调度
                OSSched();
            }
        } else {
            OS_ENTER_CRITICAL();
            OSTCBPrioTbl[prio] = (OS_TCB *)0;//任务创建失败,则列表中重新写为0

            OS_EXIT_CRITICAL();
        }
        return (err);
    } else {
        OS_EXIT_CRITICAL();
        return (OS_PRIO_EXIST);
    }
}

第四章:OSStart()
μC/OS /sherlock_lai 发表于2008-01-04, 20:04 
void OSStart (void)           //任务的开始
{
    INT8U y;
    INT8U x;


    if (OSRunning == FALSE)              //如果操作系统未运行,则进行一次调度,既运行优先级最高的任务
    {
        y             = OSUnMapTbl[OSRdyGrp];        //

        x             = OSUnMapTbl[OSRdyTbl[y]];
        OSPrioHighRdy = (INT8U)((y << 3) + x);
        OSPrioCur     = OSPrioHighRdy;
        OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];//
        OSTCBCur      = OSTCBHighRdy;
        OSStartHighRdy();                            //开始运行优先级最高的任务,这个函数涉及到CPU寄存器的操作,所以针对具体不同环境会有所不同
    }
}

第五章:任务控制块 os_tcb
μC/OS /sherlock_lai 发表于2008-01-06, 22:15 
任务控制块里保存任务的一些参数,只有拥有任务控制块的任务才有运行的可能,当然运行还需要一些其他条件 
typedef struct os_tcb {
    OS_STK        *OSTCBStkPtr;        //任务堆栈栈顶指针

#if OS_TASK_CREATE_EXT_EN    
    void          *OSTCBExtPtr;        //

    OS_STK        *OSTCBStkBottom;     //栈底指针
    INT32U         OSTCBStkSize;       //堆栈单元数量
    INT16U         OSTCBOpt;           //
    INT16U         OSTCBId;            //
#endif

    struct os_tcb *OSTCBNext;          //下一个任务控制块

    struct os_tcb *OSTCBPrev;          //上一个任务控制块,这两个参数将任务控制块连成一个双向链表,在时钟节拍函数OSTimeTick()里会用到

#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
    OS_EVENT      *OSTCBEventPtr;      //

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -