分类: 嵌入式
2011-02-20 21:37:43
uC/OSII的任务
从任务存储结构来看,由三部分构成:任务程序代码、任务堆栈和任务控制块。任务控制块用来保存任务属性,任务堆栈用来保存任务工作环境,任务程序代码是任务的执行部分。
系统中把任务链接成任务链表,任务中最主要的是任务控制块,任务控制块中有:
前一个任务控制块的指针 |
后一个任务控制块的指针 |
指向任务的指针 |
指向任务堆栈的指针 |
任务的优先级别
…… |
任务程序代码的结构如下:
void MyTask(void *pdata)
当用户程序调用函数OSTaskCreate()创建一个任务时,这个函数会调用系统函数OSTCBInit()来为任务控制块进行初始化。这个函数首先为被创建任务从空任务控制块链表获取一个任务控制块,然后利用任务的属性对任务控制块各个成员进行赋值,最后再把这个任务控制块链入到任务控制块链表的头部。
设计一个只有一个任务Task1,当程序运行后任务的工作就是每秒在显示器上显示一个字符“M”。代码如下:
#include "includes.h"
#define TASK_STK_SIZE 512
OS_STK MyTaskStk[TASK_STK_SIZE];
INT16S key;
INT8U x=0,y=0;
void MyTask(void *data);
void main (void)
{
char* s_M="M";
OSInit();
PC_DOSSaveReturn(); PC_VectSet(uCOS, OSCtxSw); PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);
OSTaskCreate(MyTask,s_M, &MyTaskStk[TASK_STK_SIZE - 1], 0);
OSStart();
}
void MyTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr;
#endif
pdata = pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR); PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
for (;;)
{
if(x>10)
{
x=0;
y+=2;
}
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x+=1;
if(PC_GetKey(&key) == 1)
{
if(key == 0x1B)
{
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,1,0);
}
}
任务的挂起,原型如下:
任务删除
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(); |
} |
} |
小结: