ucos-ii应用程序中函数的调用关系

    技术2022-05-19  22

    应用程序中函数的调用关系

    #include  “includes.h”

    #define  TASK_STK_SIZE  512                     // 定义堆栈长度(1024字节)

    OS_STK TaskStk[TASK_STK_SIZE];          // 定义一个数组来作为任务堆栈

     

     void main()

    {

           …… 

               OSInit(); // 初始化uC/OS-IIi

                ……

               OSTaskCreate(MyTask1,……); // 创建用户任务1

              OSTaskCreate(MyTask2,……); // 创建用户任务2

                ……

               OSStart(); // 启动任务

           …… 

    }void MyTask(void *pdata)

    {

           for (;;)

          {

    可以被中断的任务代码

    OS_ENTER_CRITICAL(); //进入临阶段关中断

    不可以被中断的任务代码;

    OS_EXIT_CRITICAL(); //退出临阶段 (开中断)

    可以被中断的任务代码;

           }

     }

     

     

     

    1  OS_CORE.C文件中的OSInit()函数

     

    2  全局变量的说明

    uC/OS-II初始化了5个空的数据结构缓冲区,每个缓冲区都是单向链表,允许uC/OS-II从缓冲区中迅速取得或释放一个缓冲区中的元素。

     

    3   五个空的数据结构缓冲区

     

     

    4  OS_TASK.C中的OSTaskCreate ()函数

     

    任务堆栈初始化就是对栈顶指针和寄存器进行初始化,OSTaskStkInit()函数的定义在OS_CPU_C.C文件中

    OS_TCBInit( )就是对结构体

    typedef struct os_tcb {

        OS_STK        *OSTCBStkPtr;                                         

    #if OS_TASK_CREATE_EXT_EN > 0     

        void          *OSTCBExtPtr;   

        OS_STK        *OSTCBStkBottom;

        INT32U         OSTCBStkSize;  

        INT16U         OSTCBOpt;      

        INT16U         OSTCBId;       

    #endif

                   …………                                

    struct os_tcb *OSTCBNext;   

    struct os_tcb *OSTCBPrev;                                  

        INT16U         OSTCBDly;    

        INT8U          OSTCBStat;   

    INT8U          OSTCBPrio; 

    INT8U          OSTCBX;   

    INT8U          OSTCBY;   

    INT8U          OSTCBBitX;

    INT8U          OSTCBBitY;                                     

    } OS_TCB; 

    进行初始化。

                                    

     

     

    5   OS_TASK.C中的OSTaskCreateExt()函数

     

    任务的调度函数OS_Sched()如下:

    void  OS_Sched (void)

    {

    #if OS_CRITICAL_METHOD == 3                            

        OS_CPU_SR  cpu_sr;

    #endif   

        INT8U      y;

        OS_ENTER_CRITICAL();

    if ((OSIntNesting == 0) && (OSLockNesting == 0)) {

        y             = OSUnMapTbl[OSRdyGrp];         

        OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);

            if (OSPrioHighRdy != OSPrioCur) {            

                OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];

                OSCtxSwCtr++;                            

                OS_TASK_SW();                             

            }

        }

        OS_EXIT_CRITICAL();

    }

     

    OS_CPU.H中找到:

    #define  OS_TASK_SW()         asm  INT   uCOS

    但没找到具体代码。

    OS_TASK_SW()的主要工作:

    把被中止任务的断点指针保存到任务堆栈中; CPU通用寄存器的内容保存到任务堆栈中; 把被中止任务的任务堆栈指针保存到该任务的任务控制块的OSTCBStkPtr中; 获得待运行任务的任务控制块; 使CPU通过任务控制块获得待运行任务的任务堆栈指针; 把待运行任务堆栈中通用寄存器的内容恢复到CPU的通用寄存器中; 使CPU获得待运行任务的断点指针(该指针是待运行任务在上一次被调度器中止运行时保留在任务堆栈中的)。

     

     

    6  OS_CORE.C文件中的OSStart()函数

    OS_CORE.C文件中有OSStart ()的定义。 

    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();                           

        }                                              

    }  

                                                   

    OS_CPU_A.ASM中找到了OSStartHighRdy()的汇编代码,求解释?

    _OSStartHighRdy  PROC FAR                       

                                                    

                MOV    AX, SEG _OSTCBHighRdy        

                MOV    DS, AX                 

                CALL   FAR PTR _OSTaskSwHook   

                MOV    AL, 1                        

                MOV    BYTE PTR DS:_OSRunning, AL  

                LES    BX, DWORD PTR DS:_OSTCBHighRdy

                MOV    SS, ES:[BX+2]                

                MOV    SP, ES:[BX+0]                

                POP    DS                           

                POP    ES                           

                POPA                                

                IRET                                                                                 

    _OSStartHighRdy  ENDP    

     


    最新回复(0)