- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
备注页 第六讲 任务管理 时间管理、 内存管理 主要内容 1. 任务管理 2. 时间管理 3. 内存管理 1. 任务管理 建立任务OSTaskCreate() 堆栈检验 OSTaskStkChk() 删除任务OSTaskDel() 请求删除任务OSTaskDelReq() 改变任务的优先级OSTaskChangePrio() 挂起任务OSTaskSuspend() 恢复任务OSTaskResume() 获得有关任务的信息OSTaskQuery() 任务管理机制 任务管理用来实现对任务状态的直接控制和访问。 内核的任务管理是通过系统调用来体现,主要包括任务创建、任务删除、任务挂起、任务唤醒、设置任务属性等内容 。 建立任务OSTaskCreate() OSTaskCreate()需要四个参数: task是指向任务代码的指针; Pdata指向一个数据结构,该结构用来在建立任务时向任务传递参数 ; ptos是分配给任务的堆栈的栈顶指针(任务堆栈); prio是分配给任务的优先级 返回值 OSTaskCreate()的返回值为下述之一: OS_NO_ERR:函数调用成功。 OS_PRIO_EXIST:具有该优先级的任务已经存在。 OS_PRIO_INVALID:参数指定的优先级大于OS_LOWEST_PRIO。 OS_NO_MORE_TCB:系统中没有OS_TCB可以分配给任务了。 OSTaskCreate() OSTaskCreate() 注意/警告 任务堆栈必须声明为OS_STK类型。 在任务中必须调用μC/OS提供的下述过程之一:延时等待、任务挂起、等待事件发生(等待信号量,消息邮箱、消息队列),以使其他任务得到CPU。 用户程序中不能使用优先级0,1,2,3,以及OS_LOWEST_PRIO-3, OS_LOWEST_PRIO-2, OS_LOWEST_PRIO-1, OS_LOWEST_PRIO。这些优先级μC/OS系统保留,其余的56个优先级提供给应用程序。 每个任务都有自己的堆栈空间。堆栈必须声明为OS_STK类型,并且由连续的内存空间组成。 用户可以静态分配堆栈空间(在编译的时候分配) ,静态堆栈声明应放置在函数的外面,方式如下: 用户可以用C编译器提供的malloc()函数来动态地分配堆栈空间,如程序清单 L4.6所示。 在动态分配中,用户要时刻注意内存碎片问题。 堆栈检验 OSTaskStkChk() OSTaskStkChk()检查任务堆栈状态,计算指定任务堆栈中的未用空间和已用空间; 使用OSTaskStkChk()函数要求所检查的任务是被OSTaskCreateExt()函数建立的,且opt参数中OS_TASK_OPT_STK_CHK操作项打开。 参数 prio为指定要获取堆栈信息的任务优先级,也可以指定参数OS_PRIO_SELF,获取调用任务本身的信息。 pdata指向一个类型为OS_STK_DATA的数据结构 删除任务OSTaskDel() OSTaskDel()函数删除一个指定优先级的任务; 任务可以传递自己的优先级给OSTaskDel(),从而删除自身 如果任务不知道自己的优先级,还可以传递参数OS_PRIO_SELF 被删除的任务将回到休眠状态。任务被删除后可以用函数OSTaskCreate()或OSTaskCreateExt()重新建立 参数 prio为指定要删除任务的优先级,也可以用参数OS_PRIO_SELF代替,此时,下一个优先级最高的就绪任务将开始运行。 范例 请求删除任务OSTaskDelReq() 如果任务A拥有内存缓冲区或信号量之类的资源,而任务B想删除该任务,这些资源就可能由于没被释放而丢失。在这种情况下,用户可以让拥有这些资源的任务在使用完资源后,先释放资源,再删除自己。用户可以通过OSTaskDelReq()函数来完成该功能。 发出删除任务请求的任务(任务B)和要删除的任务(任务A)都需要调用OSTaskDelReq()函数。 例如,假设任务5要删除任务10,而任务10占有系统资源,此时任务5不能直接调用OSTaskDel(10)删除任务10,而应该调用OSTaskDelReq(10)向任务10发送删除请求。 在任务10中调用OSTaskDelReq(OS_PRIO_SELF),并检测返回值。如果返回OS_TASK_DEL_REQ,则表明有来自其他任务的删除请求,此时任务10应该先释放资源,然后调用OSTaskDel(OS_PRIO_SELF)删除自己。 参数 prio为要求删除任务的优先级。如果参数为OS_PRIO_SELF,则表示调用函数的任务正在查询是否有来自其他任务的删除请求。 返回值 OST
文档评论(0)