您的位置:首页 > 其它

ucosii之任务管理

2012-05-04 08:25 197 查看
ucosii可以管理的任务有64个,包括系统的两个任务:空闲任务和统计任务;

首先要明白,在嵌入式系统中只有一个CPU,任何某一个具体的时刻只能允许一个任务占用CPU。

任务的5种状态



睡眠态:任务代码驻留在程序空间,没有交给UcosII来管理,这是的任务没有配置任务控制块或者
被剥夺了任务控制块(OS_TCB)。
就绪态:任务配置了任务控制块(OS_TCB)并在任务就绪表中有登记。
运行态:得到了CPU使用的任务。
等待态:正在运行的任务在调用延迟函数OSTimeDly()或OSTimeDlyHMSM(),这是任务进入等待
态。
中断态:任务响应中断去执行中断服务程序。

ucosii是通过任务控制块(OS_TCB)来管理任务的,创建任务的实质是创建了一个任务控制块,
通过任务控制块把任务代码和任务堆栈关联起来。
任务堆栈:用了保存任务CPU寄存器的内容和任务的私有数据的连续的存储空间。
任务控制块(OS_TCB):用了记录任务的堆栈指针、任务的当前状态、任务优先级等一些与任务
属性的一个数据结构,OS_TCB全部驻留在RAM中。
还有些东西如就绪表,任务调度,任务切换等等自己看吧。

一个简单的任务创建的例子

#include "includes.h"

#define TASK_STK_SIZE  512
OS_STK   MyTaskStk[TASK_STK_SIZE];
OS_STK	 YouTaskStk[TASK_STK_SIZE];
INT16S  key;
INT8U   x=0,y=0;

void MyTask(void *data);
void YouTask(void *data);
/***************************************************/
void main(void)
{
char *s_M="M";

OSInit();

PC_DOSSaveReturn();

PC_VectSet(uCOS,OSCtxSw);

OSTaskCreate(MyTask, s_M, &MyTaskStk[TASK_STK_SIZE-1], 0);

OSStart();
}

/**********************************************************/
void  MyTask(void *pdata)
{
char*s_Y="Y";

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

OSTaskCreate(YouTask, s_Y, &YouTaskStk[TASK_STK_SIZE-1], 1);

for(;;)
{
if(x>50)
{
x=0;
y+=2;
}
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x+=1;

if(PC_GetKey(&key)==TRUE)
{
if(key==0x1B)
{
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,1,0);
}
}

/********************************************************/
void  YouTask(void *pdata)
{
#if OS_CRITICAL_METHOD==3
OS_CPU_SR  cpu_sr;
#endif

pdata=pdata;

for(;;)
{
if(x>50)
{
x=0;
y+=2;
}
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x+=1;
OSTimeDlyHMSM(0,0,1,0);
}
}
运行结果

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