第3章 μCOS-II的中断和时钟

合集下载

ucosii中文书邵贝贝

ucosii中文书邵贝贝

u c o s i i中文书邵贝贝集团标准化工作小组 [Q8QX9QT-X8QQB8Q8-NQ8QJ8-M8QMN]第5章时间管理在节时钟节拍中曾提到,μC/OS-Ⅱ(其它内核也一样)要求用户提供定时中断来实现延时与超时控制等功能。

这个定时中断叫做时钟节拍,它应该每秒发生10至100次。

时钟节拍的实际频率是由用户的应用程序决定的。

时钟节拍的频率越高,系统的负荷就越重。

节讨论了时钟的中断服务子程序和节时钟节函数OSTimeTick——该函数用于通知μC/OS-Ⅱ发生了时钟节拍中断。

本章主要讲述五个与时钟节拍有关的系统服务:OSTimeDly()OSTimeDlyHMSM()OSTimeDlyResume()OSTimeGet()OSTimeSet()本章所提到的函数可以在文件中找到。

5.0任务延时函数,OSTimeDly()μC/OS-Ⅱ提供了这样一个系统服务:申请该服务的任务可以延时一段时间,这段时间的长短是用时钟节拍的数目来确定的。

实现这个系统服务的函数叫做OSTimeDly()。

调用该函数会使μC/OS-Ⅱ进行一次任务调度,并且执行下一个优先级最高的就绪态任务。

任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态。

注意,只有当该任务在所有就绪任务中具有最高的优先级时,它才会立即运行。

程序清单所示的是任务延时函数OSTimeDly()的代码。

用户的应用程序是通过提供延时的时钟节拍数——一个1 到65535之间的数,来调用该函数的。

如果用户指定0值[(1)],则表明用户不想延时任务,函数会立即返回到调用者。

非0值会使得任务延时函数OSTimeDly()将当前任务从就绪表中移除[(2)]。

接着,这个延时节拍数会被保存在当前任务的OS_TCB中[(3)],并且通过OSTimeTick()每隔一个时钟节拍就减少一个延时节拍数。

μCOS-Ⅱ用户指南

μCOS-Ⅱ用户指南

μCOS-Ⅱ用户指南参考手册本章提供了μC/OS-Ⅱ的用户指南。

每一个用户可以调用的内核函数都按字母顺序加以说明,包括:z函数的功能描述z函数原型z函数名称及源代码z函数使用到的常量z函数参数z函数返回值z特殊说明和注意点OSInit()VoidOSInit(void);所属文件调用者开关量OS_CORE.C启动代码无OSinit()初始化μC/OS-Ⅱ,对这个函数的调用必须在调用OSStart()函数之前,而OSStart()函数真正开始运行多任务。

注意/警告必须先于OSStart()函数的调用OSIntEnter()VoidOSIntEnter(void);所属文件调用者开关量OS_CORE.C中断无OSIntEnter()通知μC/OS-Ⅱ一个中断处理函数正在执行,这有助于μC/OS-Ⅱ掌握中断嵌套的情况。

OSIntEnter()函数通常和OSIntE 某it()函数联合使用。

注意/警告在任务级不能调用该函数。

如果系统使用的处理器能够执行自动的独立执行读取-修改-写入的操作,那么就可以直接递增中断嵌套层数(OSIntNeting),这样可以避免调用函数所带来的额外的开销。

OSIntE某it()voidOSIntE某it(void);所属文件调用者开关量OS_CORE.C中断无OSIntE某it()通知μC/OS-Ⅱ一个中断服务已执行完毕,这有助于μC/OS-Ⅱ掌握中断嵌套的情况。

通常OSIntE某it()和OSIntEnter ()联合使用。

当最后一层嵌套的中断执行完毕后,如果有更高优先级的任务准备就绪,μC/OS-Ⅱ会调用任务调度函数,在这种情况下,中断返回到更高优先级的任务而不是被中断了的任务。

注意/警告在任务级不能调用该函数。

并且即使没有调用OSIntEnter()而是使用直接递增OSIntNeting的方法,也必须调用OSIntE某it()函数。

OSMbo某Accept()Void某OSMbo某Accept(OS_EVENT某pevent);所属文件调用者开关量OS_MBO某.C任务或中断OS_MBO某_EN参数返回值注意/警告OSMbo某Create()OS_EVENT某OSMbo某Create(void某mg);所属文件调用者开关量OS_MBO某.C任务或启动代码OS_MBO某_EN务发送消息。

嵌入式实时操作系统μCOS原理与实践3

嵌入式实时操作系统μCOS原理与实践3

作者卢有亮 图书PPT和全部代码下载/15441
《嵌入式实时操作系统原理与实践》
3.1中断管理
3.1.2中断处理的流程
作者卢有亮 图书PPT和全部代码下载/15441
《嵌入式实时操作系统原理与实践》 3.1.3时钟中断服务 μC/OS-II在每个时间片都要进行任务的调度。调度的结果或者是返回原来 的任务继续执行,或者是因为找到了就绪的更高优先级的任务,而让该任 务运行。这个时间片可以是10毫秒或其他值。
《嵌入式实时操作系统原理与实践》
第三章 中断和时间管理
3.1 中断管理 3.1.1中断管理核心思路 3.1.2中断处理的流程 3.1.3时钟中断服务 3.2 时间管理 3.2.1时间管理主要数据结构 3.2.2时间的获取和设置 3.2.3任务延时函数OSTimeDly 3.2.4任务按分秒延迟函数OSTimeDlyHMSM 3.2.5延时恢复函数OSTimeDlyResume 习题
《嵌入式实时操作系统原理与实践》
嵌入式实时操作系统 μC/OS原理与实践
教材 :嵌入式实时操作系统μC/OS原理与实践 电子工业出版社 作者:卢有亮 luyl@ 电子科技大学能源科学与工程学院
作者卢有亮 图书PPT和全部代码下载/15441
作者卢有亮 图书PPT和全部代码下载/15441
《嵌入式实时操作系统原理与实践》 3.2.3任务延时函数OSTimeDly 任务延时函数OSTimeDly用于阻塞任务一定时间,这个时间以参数的形式 给出。如果这个参数的值是N,那么在N个时间片(时钟嘀嗒)之后,任务 才能回到就绪状态获得继续运行的机会。如果参数的值是0,不会阻塞任务。
作者卢有亮 图书PPT和全部代码下载/15441

Ucos-II基础原理讲解,任务创建及中断问题

Ucos-II基础原理讲解,任务创建及中断问题

Ucos-II基础原理讲解,任务创建及中断问题2013-6-26 周三Haibara AI Ucos-II在移植过程中的特性,首先要理解所加入的实时操作系统是一个给予定时器节拍的系统。

怎么理解这个问题呢,由该定时器产生脉冲来驱动不同的任务调度,且由于该系统是基于可剥夺内核类型,任务之间的切换时间间隔也由该定时器完成。

不宜过大,否则会造成CPU利用率不高,不宜过小,否则会造成CPU在执行任务时非常被动,时间特别赶。

就想人的心脏一样,动力是固定的,你非要去跑个100公里,心脏不加速你是会窒息而死的。

我们正常心脏跳动是60次左右,同样,单片机也需要一个这样的相对宽松的节拍驱动。

注:众所周知,脉冲本质上仍由晶振提供(或实时时钟),原理都一样,再次请各位不要较真,就暂时以晶振为例。

大家可以考虑一下,晶振的作用是否特别类似于人体的心脏呢?答案是很显然的。

心脏跳动给人体提供输送血液和养料的压力,晶振的设计原理也正是源于此。

他可以像人体心脏一样提供动力输送各个外设(相当于人体器官)所需要的能量。

说这么多,就是要大家理解,人可以实时做出反应,因为人是有生命的,也就是他有反应、判断和处理能力,可以决定什么时间应该做什么。

但是单片机是没有生命的,换句话说,他所谓的处理能力源于人们的代码和程序。

那么,怎么让单片机像人一样拥有生命呢?答案很简单,给他指令,帮助他决定什么时间该做什么,这也就是所谓的实时操作系统。

不只是ucos,其他实时操作系统也是这个道理。

下面我以代码为例,讲述一下ucos的工作流程,如有错误,还请各位前辈指点。

首先任务是怎么样开始执行的?os_err = OSTaskCreateExt((void (*)(void *)) App_TaskStart, */1 (void * ) 0, 2(OS_STK * )&App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],3(INT8U ) APP_TASK_START_PRIO,4(INT16U ) APP_TASK_START_PRIO,5(OS_STK * )&App_TaskStartStk[0],6(INT32U ) APP_TASK_START_STK_SIZE,7(void * )0,8(INT16U )(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK));9这个东西好像是非常复杂,但是实际上并不需要细究(当然非要细究也是允许的,只不过是C语言而已,看也不是看不懂,对于初学者而言并不推荐而已)。

uUOS教程第3章

uUOS教程第3章

第3章内核结构 (1)3.0 临界段(Critical Sections) (1)3.1 任务 (1)3.2 任务状态 (3)3.3 任务控制块(Task Control Blocks, OS_TCBs) (4)3.4 就绪表(Ready List) (7)3.5 任务调度(Task Scheduling) (10)3.6 给调度器上锁和开锁(Locking and UnLocking the Scheduler) (11)3.7 空闲任务(Idle Task) (12)3.8 统计任务 (13)3.9 μC/OS中的中断处理 (16)3.10 时钟节拍 (20)3.11 μC/OS-Ⅱ初始化 (23)3.12 μC/OS-Ⅱ的启动 (24)3.13 获取当前μC/OS-Ⅱ的版本号 (27)3.14 OSEvent???()函数 (28)I第3章内核结构本章给出μC/OS-Ⅱ的主要结构概貌。

读者将学习以下一些内容;●μC/OS-Ⅱ是怎样处理临界段代码的;●什么是任务,怎样把用户的任务交给μC/OS-Ⅱ;●任务是怎样调度的;●应用程序CPU的利用率是多少,μC/OS-Ⅱ是怎样知道的;●怎样写中断服务子程序;●什么是时钟节拍,μC/OS-Ⅱ是怎样处理时钟节拍的;●μC/OS-Ⅱ是怎样初始化的,以及●怎样启动多任务;本章还描述以下函数,这些服务于应用程序:●OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),●OSInit(),●OSStart(),●OSIntEnter()和OSIntExit(),●OSSchedLock()和OSSchedUnlock(), 以及●OSVersion().3.0临界段(Critical Sections)和其它内核一样,μC/OS-Ⅱ为了处理临界段代码需要关中断,处理完毕后再开中断。

这使得μC/OS-Ⅱ能够避免同时有其它任务或中断服务进入临界段代码。

μCOS-II中断和时钟

μCOS-II中断和时钟
μC/OS-II中断和时钟
中断的概念 2
中断是一种硬件机制,用于通知 CPU 有个异步事件发生了。中断一旦被识别, CPU 保存务子程序(ISR)。中断服务子程序做事件处理,处理完成后,程序根据 进程类型回到相应位置执行。而时钟节拍是特定的周期性中断。这个中断可以 看作是系统心脏的脉动。中断之间的时间间隔取决于不同的应用,一般在 10mS 到 200mS 之间。时钟的节拍式中断使得内核可以将任务延时若干个整 数时钟节拍,以及当任务等待事件发生时,提供等待超时的依据。时钟节拍率 越快,系统的额外开销就越大。
中断响应 6
对于μC/OS-Ⅱ说来,这个函数是 OSIntEnter(),可剥夺型内核的中断响应时 间由表达式如下:
中断响应 = 中断延迟 + 保存 CPU 内部寄存器的时间 + 内复时间 7
在μC/OS-Ⅱ中,这个函数叫做 OSIntExit(),这个函数用于辨定中断是否脱离 了所有的中断嵌套。
μC/OS-II的中断 3
中断是一种硬件机制,用于通知 CPU 有个异步事件发生了。中断一旦被识别, CPU 保存务子程序(ISR)。中断服务子程序做事件处理,处理完成后,程序回到: 1)在前后台系统中,程序回到后台程序 2)对不可剥夺型内核而言,程序回到被中断了的任务 3)对可剥夺型内核而言,让进入就绪态的优先级最高的任务开始运行
中断延迟 4
可能实时内核最重要的指标就是中断关了多长时间。 所有实时系统在进入临界 区代码段之前都要关中断,执行完临界代码之后再开中断。关中断的时间越长, 中断延迟就越长。
中断延迟 = 关中断的最长时间 + 开始执行中断服务子程序的第一条指令的时间
任务控制块功能 5
功能: 记录任务的堆栈指针、任务的当前状态、任务的优先级别等一些与任务管理有 关的属性。同时OS_TCB负责把代码和任务堆栈进行关联,从而使任务控制块、 任务代码和任务堆栈成一个整体。

嵌入式操作系统uCOS2复习指南

嵌入式操作系统uCOS2复习指南

对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力通根保1据过护生管高产线中工敷资艺设料高技试中术卷资0配不料置仅试技可卷术以要是解求指决,机吊对组顶电在层气进配设行置备继不进电规行保范空护高载高中与中资带资料负料试荷试卷下卷问高总题中体2资2配,料置而试时且卷,可调需保控要障试在各验最类;大管对限路设度习备内题进来到行确位调保。整机在使组管其高路在中敷正资设常料过工试程况卷中下安,与全要过,加度并强工且看作尽护下可关都能于可地管以缩路正小高常故中工障资作高料;中试对资卷于料连继试接电卷管保破口护坏处进范理行围高整,中核或资对者料定对试值某卷,些弯审异扁核常度与高固校中定对资盒图料位纸试置,卷.编保工写护况复层进杂防行设腐自备跨动与接处装地理置线,高弯尤中曲其资半要料径避试标免卷高错调等误试,高方要中案求资,技料编术试写5交、卷重底电保要。气护设管设装备线备置4高敷、调动中设电试作资技气高,料术课中并3试、中件资且卷管包中料拒试路含调试绝验敷线试卷动方设槽技作案技、术,以术管来及架避系等免统多不启项必动方要方式高案,中;为资对解料整决试套高卷启中突动语然过文停程电机中气。高课因中件此资中,料管电试壁力卷薄高电、中气接资设口料备不试进严卷行等保调问护试题装工,置作合调并理试且利技进用术行管,过线要关敷求运设电行技力高术保中。护资线装料缆置试敷做卷设到技原准术则确指:灵导在活。分。对线对于盒于调处差试,动过当保程不护中同装高电置中压高资回中料路资试交料卷叉试技时卷术,调问应试题采技,用术作金是为属指调隔发试板电人进机员行一,隔变需开压要处器在理组事;在前同发掌一生握线内图槽部纸内 故资,障料强时、电,设回需备路要制须进造同行厂时外家切部出断电具习源高题高中电中资源资料,料试线试卷缆卷试敷切验设除报完从告毕而与,采相要用关进高技行中术检资资查料料和试,检卷并测主且处要了理保解。护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。

嵌入式实时操作系统μCOSII原理及应用习题答案(第四版)

嵌入式实时操作系统μCOSII原理及应用习题答案(第四版)

第一章1.什么是计算机的操作系统?它应具备什么功能?操作系统:操作系统是控制其他程序运行,管理系统资源并为用户提供操作界面的系统软件的集合。

功能:计算机资源的管理,包括处理器管理、存储器存储空间管理、外部输入输出(/o)设备管理、文件管理、网络和通信管理、提供用户接口。

2.简述嵌入式系统与普通操作系统的区别。

嵌入到对象体系中,为实现对象体系智能化控制的计算机系统,简称嵌入式系统。

嵌入式系统应具有的特点是:高可靠性;在恶劣的环境或突然断电的情况下,系统仍然能够正常工作;许多嵌入式应用要求实时性,这就要求嵌入式操作系统具有实时处理能力;嵌入式系统和具体应用有机地结合在一起,它的升级换代也是具体产品同步进行;嵌入式系统中的软件代码要求高质量、高可靠性,一般都固化在只读存储器中或闪存中,也就是说软件要求固态化存储,而不是存储在磁盘等载体中。

4.什么是实时系统?如果一个系统能及时响应外部事件的请求,并能在规定的时间内完成对事件的处理,这种系统称为实时系统。

第二章1.什么是可剥夺型内核?可剥夺型内核采用与不可剥夺型不同的调度策略,最高优先级的任务一旦就绪,就能获得CPU的控制权而得以运行,不管当前运行的任务处于何种状态。

可剥夺型内核采用的抢占式的调度策略,总是让优先级最高的任务运行,直到其阻塞或任务完成,响应时间因此优化。

2.一个应用程序为什么一定要使用空闲任务?在多任务系统运行时,系统经常会在某个时间内无用户任务运行而处于空闲状态,为了使CPU在此时有事可作,uC/OS-提供了空闲任务OSTaskldle。

空闲任务是不能被软件删除的。

3.统计任务是必须使用的吗?用户应用程序可根据实际需要来选择是否使用统计任务。

其功能是每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUsage中,以便应用程序通过访问它来了解CPU的利用率。

4.什么是任务的优先权?UC/oS-ll是用什么来描述任务的优先权的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

cpu_sr = get_processor_psw();
disable_interrupts(); /* 处理临界代码*/ set_processor_psw(cpu_sr);
}
3.2 uC/OS-II的时钟
• 任何操作系统都要提供一个周期性的信号源,以供系统处理诸如 延时、超时等与时间有关的事件,这个周期性的信号源叫做时钟。 • 与大多数计算机系统一样,用硬件定时器产生一个周期为毫秒级 的周期性中断来实现系统时钟。最小的时钟单位就是两次中断之 间间隔的时间,这个最小时钟单位叫做时钟节拍。 • 硬件定时器以时钟节拍为周期定时的产生中断,该中断的中断服 务程序叫做OSTickISR(),中断服务程序通过调用函数 OSTimeTick()来完成系统在每个时钟节拍时需要做的工作。
为记录中断嵌套的层数 , μ C/OS-II内核定义 了一个全局变量 OSIntNesting。
NO
}
OSIntNesting++; } }
NO
任务是被中断的任务?
返回中断服务程序
if(OSIntNesting > 0){
NO 获得任务TCB的指针
OSIntNesting--;
执行中断级任务切换
这个函数在中断嵌套层数 计数器为0、调度器未被锁 定且从任务就绪表中查找 到的最高级就绪任务又不 是被中断的任务的条件下 将要进行任务切换,否则 就返回被中断的任务程序
C/OS节拍率最好选在10→100次/秒。 必须在多任务系统启动OSStart()以后,再开启时钟节拍器。

13
3.2.1 时钟节拍中断服务子程序
程序清单 : 时钟节拍中断服务子程序的示意代码
void OSTickISR(void) { 保存CPU寄存器; 调用OSIntEnter(); if(OSIntNesting == 1) { OSTCBCur -> OSTCBStkPtr = SP; } 调用OSTimeTick(); 清除中断; 开中断; 调用OSIntExit(); 恢复CPU寄存器; 执行中断返回指令; } // 记录中断嵌套层数
11
3.1.6.3 开关中断的实现方法3

•OS_CRITICAL_METHOD==3 把当前处理器的状态字保存在局部变量中(如OS_CPU_SR),关中断时保存, 开中断时恢复。这样需要在选择用这种方法进入临界代码的应用程序中定义一个 局部变量cpu_sr。
void Some_uCOS_II_Service(arguments) { OS_CPU_SR …… cpu_sr 方法3的示意性代码 #define OS_ENTER_CRITICAL()
三、 uC/OS-II的中断和时钟
1
第三章:uC/OS-II的中断和时钟
目标: 本章旨在向学员介绍uc/osII实时操作系统 的中断概念及时间管理,通过本章的学习, 学员应该掌握如下知识: uC/OSII的中断管理和中断服务程序的 结构 uC/OSII的系统时钟及实现方法 时间管理服务:延时、取消延时
方法2的示意性代码
#define OS_ENTER_CRITICAL()
asm(“PUSH PSW”) asm(“DI”) #define OS_EXIT_CRITICAL() asm(“POP PSW”)
第2种方法可使CPU 中断允许标志的状态 在临界段前和临界段 后不发生改变。
一些编译器对插入的行汇编代码优化得并不好,上述办法未必可行,尤其是堆栈指针相对寻址模式时。
图3-2 函数OSIntExit()的流程图
} OS_EXIT_CRITICAL();
5
3.1.3 中断服务子程序的流程
中断服务子程序入口 CPU寄存器内容进栈 调用OSIntEnter()通知系统:进入中断服务程序 NO 调用OSIntExit()通知系统:退出中断服务程序 恢复CPU寄存器内容 执行中断返回指令
因为使用C语言不便于对CPU 的寄存器进行处理,所以这段 代码使用汇编语言编写。
// 在任务TCB中保存堆栈指针 // 时钟节拍服务处理
15
3.2.2 时钟节拍服务函数
void OSTimeTick (void) { OS_TCB *ptcb; OSTimeTickHook();
#if OS_TIME_GET_SET_EN > 0 OS_ENTER_CRITICAL(); OSTime++; // 记录节拍数 OS_EXIT_CRITICAL(); #endif if (OSRunning == TRUE) { 不会让处于挂起、延 ptcb = OSTCBList; 时双等待态任务因延 while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { 时时间到而就绪。 OS_ENTER_CRITICAL(); if (ptcb->OSTCBDly != 0) { if (- -ptcb->OSTCBDly == 0) { //任务的延时时间减1 if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { OSRdyGrp |= ptcb->OSTCBBitY; OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX; } else { ptcb->OSTCBDly = 1; } } } 简单地说,函数OSTimeTick()的任 ptcb = ptcb->OSTCBNext; 务就是在每个时钟节拍了解每个任 OS_EXIT_CRITICAL(); } 务的延时状态,使其中已经到了延 } }
• • •
9
3.1.6.1开关中断的实现方法1
根据微处理器和C编译器的不同,通过在移植文件OS_CPU.H • OS_CRITICAL_METHOD==1 用处理器指令关中断 中配置OS_CRITICAL_METHOD 来选择开/关中断的方法:
• 执行OS_ENTER_CRITICAL(),关中断 • 执行OS_EXIT_CRITICAL(),开中断;
7
3.1.5 临界段
临界段的概念: 在应用程序中经常有一些代码段必须不受任何干扰地连续运行, 这样的代码叫做临界段。 怎样保证临界段的安全? 系统当有异步事件发生时会引发中断请求,CPU何时响应这个 请求?
宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()实现中断的
cpu_sr = get_processer_psw();
disable_interrrupts(); #define OS_EXIT_CRITICAL() set-processer_psw(cpu_sr); 第3种方法的前提条件:用户使用C编译器具 有扩展功能,用户可获得程序状态字的值,这 样就可以把该值保存在C语言函数的局部变量 中,而不必压到堆栈里。 12
开放和关闭(封装了与系统硬件相关的关中断和开中断指令,增 强了可移植性)。
8
3.1.6 开关中断的宏
当处理临界段代码时,需要关中断,处理完毕后,再开中断; 关中断时间是实时内核重要的指标之一; 在实际应用中,关中断的时间很大程度中取决于微处理器的结构和 编译器生成的代码质量; • C/OS-II定义两个宏开关中断: OS_ENTER_CRITICAL(); OS_EXIT_CRITICAL(); 因为这2个宏的定义取决于所使用的微处理器,因此在OS_CPU.H中 可以找到相应的宏定义。 OS_CPU.H是微处理器相关的。
中断嵌套层OSIntNEsting=1?
YES OSTCBCur->OSTCBStkPtr=SP
清中断源的中断申请标志 重新开放中断 运行中断服务代码
并非为每个任务都定义一个充分大的栈空 间,中断嵌套时单独定义一个中断嵌套栈 ,在发生第1次中断时,中断服务程序将栈 空间切换到中断嵌套栈,这样,以后发生的嵌 套中断就一直使用这个栈空间。 异步事件产生中断后,通常用一个任务来完 成对异步事件的处理工作,而在中断服务程 序中只是采用向任务发送消息的方法去激活 这个任务(将该任务置于就绪态,一般该任 务优先级较高从而发生抢占)。
学时:3.0学时 教学方法:讲授ppt+上机练 习+点评+案例分析
2
3.1 uC/OS-II的中断
中断:任务在运行过程中,应内部或外部异步事件的请求中止当 前任务,而去处理异步事件所要求的任务的过程叫做中断。 中断服务程序:应中断请求而运行的程序叫中断服务子程序(ISR)。
中断向量:中断服务子程序的入口地址叫中断向量。
方法1的示意性代码 #define OS_ENTER_CRITICAL() asm(“DI”) #define OS_EXIT_CRITICAL() asm(“EI”)
以上代码所列假定编译器允许直接在C代码行之间插入行汇编语句。
10
3.1.6.2 开关中断的实现方法2

• OS_CRITICAL_METHOD==2 实现OS_ENTER_CRITICAL()时,先在堆栈中保存中断的开/关状态,然后再关 中断;实现OS_EXIT_CRITICAL()时,从堆栈中弹出原来中断的开/关状态;
图3-3 中断服务子程序的流程图
6
3.1.4 中断级任务切换
与任务级切换函数OSCtxSW()的原因一样,中断级任务切换函数OSIntCtxSw()通常 是用汇编语言来编写的:
OSIntCtxSw() { OSTCBCur = OSTCBHighRdy; OSPrioCur = OSPrioHighRdy; SP = OSPrioHighRdy->OSTCBStkPtr; IRET; } // 使SP指向待运行任务堆栈 // 中断返回,使PC指向待运行任务 用出栈指令把R1、R2……弹入CPU的通用寄存器; // 任务控制块的切换
相关文档
最新文档