第3章任务管理new(免费阅读).pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第3章 任 务 管 理 3.1 任务的核心函数及形式 3.2 任务的实现 3.3 任务的调度 3.4 系统的初始化与启动 3.5 任务管理的系统服务 习题 3.1任务的核心函数及形式    μC/OS-Ⅱ的核心函数主要有如下9个。 3.1.1 临界区的处理 临界区:就是访问共享资源的那段代码。 μC/OS-Ⅱ内核为了避免在处理临界区的同时有其它任务或中断抢占,所以需要在处理前先关中断,处理完毕后再开中断。 关中断的时间是实时内核最重要的指标之一,它影响系统的实时响应特性。 关中断的时间在很大程度上取决于微处理器的架构以及编译器所生成的代码质量。 开关中断的宏定义 μC/OS-Ⅱ定义了两个宏来关中断和开中断 OS_ENTER_CRITICAL() OS_EXIT_CRITICAL() 这两个宏总是成对出现的,在文件OS_CPU.H中可以找到相应的宏定义。 三种开关中断宏定义的实现方法, 文件OS_CPU.H中定义了常数OS_CRITICAL_METHOD来选择具体使用哪种方法。 具体使用哪一种取决于所用的CPU及C编译器。   置OS_CRITICAL_METHOD = 1  如MCS-51单片机的实用性宏定义程序如下: #define OS_ENTER_CRITICAL() EA = 0 //关中断 #define OS_EXIT_CRITICAL() EA = 1 //开中断 这是一种在所有微处理器上都能实现的方法 优点:简单、直接、通用。 瑕疵:比如处理临界区之前中断本来就是关闭的,在处理完毕后由于调用了开中断宏,系统返回的就不是原本中断关闭的状态了。   置OS_CRITICAL_METHOD = 2 即先利用堆栈保存中断状态,然后再关中断;开中断是将中断开关状态从堆栈中弹出,恢复中断原始状态。 这两个宏定义的示意性程序如下:   #define OS_ENTER_CRITICAL() asm(PUSH PSW) asm(“CLR EA)   #define OS_EXIT_CRITICAL() asm(POP PSW) 优点:保护了中断的原始状态; 缺点:必须使用汇编代码,如果某些编译器对嵌入汇编代码优化得不好,将导致严重错误。   置OS_CRITICAL_METHOD = 3 即用局部变量来保存中断开关状态,示意性程序如下: OS_CPU_SR cpu_sr; //在应用程序中定义局部变量   #define OS_ENTER_CRITICAL() cpu_sr = get_processor_psw(); Disable_interrupt();   #define OS_EXIT_CRITICAL() set_processor_psw(cpu_sr);   普遍适用的规则 调用μC/OS-Ⅱ功能函数时,中断总应该是开放的。 3.1.2 任务的形式   μC/OS-Ⅱ的任务就是一个C函数,它具有如下特征: (1) 具有一个返回类型和一个参数。 (2) 任务的返回类型必须定义成void型。 (3) 任务的结构必须是两种之一:第一种是无限循环结构;第二种是只执行一次就被删除的程序。 (4) 任务永不返回。 程序清单3.1 任务结构一:无限循环结构任务    void MyTask ( void *pdata ){ pdata = pdata; //使用一次形式参量,以避免出现编译错误。 for(; ;) { 用户代码; /**调用μC/OS-Ⅱ系统服务挂起任务**/ OSMboxPend(); OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); 用户代码; } } 程序清单3.2 任务结构二:执行一次就自我删除   void MyTask(void *pdata){ *pdata = *pdata; //使用一次形式参量,以避免出现编译错误 用户代码; OSTaskDel(OS_PRIO_SELF);   } 3.2 任务的实现 任务主函数 空闲任务和统计任务 任务控制块TCB 任务控制块TCB 栈指针 typedef struct os_tcb { OS_STK *OSTCBStkPtr; #if OS_TASK_CREATE_EXT_EN 0 void *OSTCBE

文档评论(0)

liudao + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档