μC-OS-II-实验一任务基本管理精品文档21页
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
任务创建
➢ 用户定义了任务函数,但μC/OS_II不会理会这些代 码,这些代码也不会运行。
➢ 任务创建的工作就是给任务分配一个任务控制块, 并通过任务控制块把任务代码、任务堆栈关联起来 形成一个完整的任务。
➢ 任务创建后,它就可以接受μC/OS_II的管理和调度。
➢ 创建任务OSTaskCreate( )函数的原型如下: INT8U OSTaskCreate (
}
int main(void) {
OSInit(); OSTaskCreate(MyTask, 0,
&MyTaskStk[TaskStkSize-1], 5); OSStart(); return 0; }
任务的挂起和恢复
➢ 所谓挂起一个任务,就是由这个任务自身或其他任 务暂时中止这个该任务的运行,并进入等待状态。 μC/OS_II提供的系统函数OSTaskSuspend()用与挂 起一个任务。
}
void YourTask(void *pdata) { while(1) { printf("This is YourTask!\n"); Beep(4000, 20); m++; //通过空循环进行延时 if(m>=10) { printf("MyTask Resumed!\n"); m = 0; OSTaskResume(5); } }
➢ 所谓任务恢复一个任务,就是将一个挂起的任务恢 复进入就绪状态。 μC/OS_II提供的系统函数 OSTaskResume()用于恢复一个挂起的任务。
等待状态
OSTaskResume()
OSTaskSupend()
OS_TASK_SW() 就绪状态
运行状态
任务CPU使用权被剥夺
➢ 挂起任务函数原型 INT8U OSTaskSuspend (INT8U prio); 如果参数prio为常数OS_PRIO_SELF,则表示挂起 当前任务自身。
void MyTask(void *pdata) { while(1) { printf("This is MyTask!\n"); Beep(1950, 20); n++; //通过空循环进行延时 if(n>=10) { printf("MyTask Suspended!\n"); n = 0; OSTaskSuspend(OS_PRIO_SELF); } }
}
任务删除
➢ 所谓删除一个任务,就是把任务置于休眠状态,具 体的做法就是,把当初分配给该任务的任务控制块 从任务控制块链表中删除,并归还给空任务控制块 链表,然后就绪任务表中把该任务的就绪状态位置 0.
➢ 删除一个任务,并不是说任务的代码被删除了,只 是任务的代码不能被μC/OS_II的内核管理和调用。
μC/OS-II的应用程序结构
➢ 基于DevCpp的μC/OS-II应用程序结构 基于ADS的μC/OS-II应用程序结构
μC/OS-II的任务代码结构
➢ μC/OS-II下的任务代码一般定义为一个任务函数, 函数的主体通常是一个无限的循环
void MyTask(void *pdata) { for (;;) { 用户代码; }
做中断服务状态
系统为任务配备 了任务控制块且 在任务就绪表中 进行了就绪登记, 这时任务的状态 叫做就绪状态。
处于就绪状态的 任务如果经调度 器判断获得了 CPU的使用权, 则任务就进入运
行状态
任务的优先级
➢μC/OS_II 把任务的优先权分为64个优先级别, 每一个级别都用一个数字来表示。数字0表示 任务的优先级别最高,数字越大则表示任务 的优先级别越低
➢ 恢复任务函数原型: INT8U OSTaskResume (INT8U prio)
任务挂起和恢复示例
//创建两个任务,优先级分别为5和6 OSTaskCreate(MyTask, 0, &MyTaskStk[TaskStkSize-1], 5); OSTaskCreate(YourTask, 0, &YourTaskStk[TaskStkSize-1], 6);
}
正在运行的任务,需要
等待一段时间或需要等
待一个事件发生再运行
时,该任务就会把CPU
任务在没有被配备
的使用权让给别的任务
任务控制块或被剥 夺了任务控制块时
。 一个正在运行的
而使任务进入任等务待一状旦态响应中
的状态叫做任务的
断申请就会中止
任务的状态及其转换 睡眠状态
运行而去执行中 断服务程序,这 时任务的状态叫
void MyTask(void *pdata) {
while(1) { printf("This is MyTask!\n"); Beep(1950, 20); n++; if(n==10) {
printf("MyTask任务删除YourTask任务!\n"); OSTaskDel(6); } OSTimeDly(OS_TICKS_PER_SEC); } }
OSTaskCreate() 休眠状态
OSTaskDelete()
就绪状态
➢ 删除任务函数原型 INT8U OSTaskDelelte (INT8U prio); 如果参数prio为常数OS_PRIO_SELF,则表示删除 当前任务自身。
任务删除示例
//创建两个任务,优先级分别为5和6 OSTaskCreate(MyTask, 0, &MyTaskStk[TaskStkSize-1], 5); OSTaskCreate(YourTask, 0, &YourTaskStk[TaskStkSize-1], 6);
void (*task)(void *pd),//指向任务的指针 void *pdata, //传递给任务的参数 OS_STK *ptos, //指向任务堆栈栈顶的指针 INT8U prio //任务的优先级 )
Hale Waihona Puke Baidu
创建任务示例示例
void MyTask(void *pdata) { pdata = pdata; while(1) { printf("M"); Beep(1950, 20); n++; if(n>=CharPerLine) { printf("\n"); n = 0; } OSTimeDly(OS_TICKS_PER_SEC); }