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