Chinaunix首页 | 论坛 | 博客
  • 博客访问: 82945
  • 博文数量: 24
  • 博客积分: 375
  • 博客等级: 一等列兵
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-13 22:14
文章分类

全部博文(24)

文章存档

2014年(6)

2011年(18)

我的朋友

分类: LINUX

2011-03-05 13:12:16

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

#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()的主要工作:

  1. 把被中止任务的断点指针保存到任务堆栈中;
  2. CPU通用寄存器的内容保存到任务堆栈中;
  3. 把被中止任务的任务堆栈指针保存到该任务的任务控制块的OSTCBStkPtr中;
  4. 获得待运行任务的任务控制块;
  5. 使CPU通过任务控制块获得待运行任务的任务堆栈指针;
  6. 把待运行任务堆栈中通用寄存器的内容恢复到CPU的通用寄存器中;
  7. 使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    

 

阅读(1284) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~