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中。
还有些东西如就绪表,任务调度,任务切换等等自己看吧。
一个简单的任务创建的例子
首先要明白,在嵌入式系统中只有一个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); } }运行结果
相关文章推荐
- uCosII任务就绪表的管理
- 【UCOSII】任务管理原理
- ucosii任务切换OS_TASK_SW()
- 第16回 为了管理任务的等待状态而存在的数据结构
- ucosii之事件标志组管理
- 工作感言:任务分配及管理
- ucosii任务三要素---执行代码 堆栈 任务控制块
- Spring+Quartz 整合二:调度管理与定时任务分离
- Eclipse之"任务"管理
- 任务管理之就绪表与就绪租
- Spring 动态管理定时任务(使用quartz) 只是管理启动时间 不能做启动和暂停
- NuttX 任务管理
- 工作流学习——Activiti流程实例、任务管理四步曲
- UCOSii任务就绪表之OSUnMapTbl[16*16]的数组是如何得到的
- 软件开发管理十大工作任务
- 在Ubuntu 11.04环境下管理联系人、日历和任务
- 【Linux】计划任务管理crontab、at
- 软件开发管理十大工作任务
- 项目管理其实可以简单一点——任务分工
- 工作流管理系统开发之十七 任务管理