您的位置:首页 > 其它

uc/os-ii应用程序中函数的调用关系

2011-03-06 08:11 423 查看
应用程序中函数的调用关系
#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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: