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