网站大量收购闲置独家精品文档,联系QQ:2885784924

(嵌入式实时操作系统uC OS-2教程)第3章任务管理.ppt

(嵌入式实时操作系统uC OS-2教程)第3章任务管理.ppt

  1. 1、本文档共237页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第3章 任 务 管 理 3.1 核 心 函 数   μC/OS-Ⅱ的核心函数主要有如下9个(见表3.1),除了两个与中断有关的函数OSIntEnter()和OSIntExit()在第4章介绍外,其余都将在本节介绍。 3.1.1 临界区的处理   临界区就是访问共享资源的那段代码。μC/OS-Ⅱ内核为了避免在处理临界区的同时有其它任务或中断抢占,所以需要在处理前先关中断,处理完毕后再开中断。关中断的时间是实时内核最重要的指标之一,它影响系统的实时响应特性。关中断的时间在很大程度上取决于微处理器的架构以及编译器所生成的代码质量。   一般情况下,微处理器都有自己的关中断/开中断指令,但是为了便于调用、移植以及避免不同C编译器厂商选择不同的方法来处理开关中断,μC/OS-Ⅱ定义了两个宏来关中断和开中断,分别是OS_ENTER_CRITICAL()和OS_ EXIT_CRITICAL()。这两个宏总是成对出现的,在文件OS_CPU.H中可以找到相应的宏定义。   μC/OS-Ⅱ提供了三种开关中断宏定义的实现方法,具体使用哪一种取决于所用的CPU及C编译器。文件OS_ CPU.H中定义了常数OS_CRITICAL_METHOD来选择具体使用哪种方法。   置OS_CRITICAL_METHOD = 1是第1种开关中断宏定义的实现方法,即直接用微处理器指令开关中断,如MCS-51单片机的实用性宏定义程序如下:   #define OS_ENTER_CRITICAL() EA = 0 //关中断   #define OS_EXIT_CRITICAL() EA = 1 //开中断   这是一种在所有微处理器上都能实现的方法,优点是简单、直接、通用。然而这种方法存在一些瑕疵,比如处理临界区之前中断本来就是关闭的,在处理完毕后由于调用了开中断宏,系统返回的就不是原本中断关闭的状态了。在这种情况下,这种实现方法显然不妥,但对于某些特定的微处理器或编译器,这是唯一的选择。    置OS_CRITICAL_METHOD = 2是第2种开关中断宏定义的实现方法,即先利用堆栈保存中断状态,然后再关中断;开中断是将中断开关状态从堆栈中弹出,恢复中断原始状态。这两个宏定义的示意性程序如下:   #define OS_ENTER_CRITICAL() asm(PUSH PSW) asm(DI)   #define OS_EXIT_CRITICAL() asm(POP PSW)   PUSH PSW指令将程序状态字推入堆栈,保存中断状态,DI指令表示关中断;POP PSW指令将程序状态字从堆栈中弹出,恢复中断状态。   这种方法的优点是保护了中断的原始状态;缺点是必须使用汇编代码,如果某些编译器对嵌入汇编代码优化得不好,将导致严重错误。   置OS_CRITICAL_METHOD = 3是第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);   get_processor_psw()是一个示意性功能函数,能取得程序状态字PSW,将PSW保存在局部变量cpu_sr中,其类型在应用程序中定义。Disable_interrupt()表示禁止中断;set_ processor_psw(cpu_sr)表示将程序中断开关状态返回给PSW。   在调用开关中断函数前,需要特别小心,如果在调用OSTimeDly()之类函数之前关中断,应用程序将会崩溃。因为执行该函数后,任务将被挂起一段时间,但由于中断被关闭了,时钟中断得不到服务,任务就会永久性地等待下去,进而开中断函数永久性地得不到执行。所有挂起函数都有这样的问题,作为一个普遍适用的规则:调用μC/OS-Ⅱ功能函数时,中断总应该是开放的。 3.1.2 任务的形式   μC/OS-Ⅱ的任务就是一个C函数,它具有如下特征:   (1) 具有一个返回类型和一个参数。   (2) 任务的返回类型必须定义成void型。   (3) 任务的结构必须是两种之一:第一种是无限循环结构,其示意性代码如程序清单3.1所示;第二种是只执行一次就被删除的程序,其示意性代码如程序清单3.2所示。任务删除后,其代码依然驻留在RAM中,只是μC/OS-Ⅱ将任务转入休眠状态,不再管理该段代

文档评论(0)

autohhh + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档