第3章 μCOS-II的中断和时钟
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-Ⅱ用户指南参考手册本章提供了μ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
作者卢有亮 图书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基础原理讲解,任务创建及中断问题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章
第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中断和时钟
中断的概念 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复习指南
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力通根保1据过护生管高产线中工敷资艺设料高技试中术卷资0配不料置仅试技可卷术以要是解求指决,机吊对组顶电在层气进配设行置备继不进电规行保范空护高载高中与中资带资料负料试荷试卷下卷问高总题中体2资2配,料置而试时且卷,可调需保控要障试在各验最类;大管对限路设度习备内题进来到行确位调保。整机在使组管其高路在中敷正资设常料过工试程况卷中下安,与全要过,加度并强工且看作尽护下可关都能于可地管以缩路正小高常故中工障资作高料;中试对资卷于料连继试接电卷管保破口护坏处进范理行围高整,中核或资对者料定对试值某卷,些弯审异扁核常度与高固校中定对资盒图料位纸试置,卷.编保工写护况复层进杂防行设腐自备跨动与接处装地理置线,高弯尤中曲其资半要料径避试标免卷高错调等误试,高方要中案求资,技料编术试写5交、卷重底电保要。气护设管设装备线备置4高敷、调动中设电试作资技气高,料术课中并3试、中件资且卷管包中料拒试路含调试绝验敷线试卷动方设槽技作案技、术,以术管来及架避系等免统多不启项必动方要方式高案,中;为资对解料整决试套高卷启中突动语然过文停程电机中气。高课因中件此资中,料管电试壁力卷薄高电、中气接资设口料备不试进严卷行等保调问护试题装工,置作合调并理试且利技进用术行管,过线要关敷求运设电行技力高术保中。护资线装料缆置试敷做卷设到技原准术则确指:灵导在活。分。对线对于盒于调处差试,动过当保程不护中同装高电置中压高资回中料路资试交料卷叉试技时卷术,调问应试题采技,用术作金是为属指调隔发试板电人进机员行一,隔变需开压要处器在理组事;在前同发掌一生握线内图槽部纸内 故资,障料强时、电,设回需备路要制须进造同行厂时外家切部出断电具习源高题高中电中资源资料,料试线试卷缆卷试敷切验设除报完从告毕而与,采相要用关进高技行中术检资资查料料和试,检卷并测主且处要了理保解。护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
嵌入式实时操作系统μCOSII原理及应用习题答案(第四版)
第一章1.什么是计算机的操作系统?它应具备什么功能?操作系统:操作系统是控制其他程序运行,管理系统资源并为用户提供操作界面的系统软件的集合。
功能:计算机资源的管理,包括处理器管理、存储器存储空间管理、外部输入输出(/o)设备管理、文件管理、网络和通信管理、提供用户接口。
2.简述嵌入式系统与普通操作系统的区别。
嵌入到对象体系中,为实现对象体系智能化控制的计算机系统,简称嵌入式系统。
嵌入式系统应具有的特点是:高可靠性;在恶劣的环境或突然断电的情况下,系统仍然能够正常工作;许多嵌入式应用要求实时性,这就要求嵌入式操作系统具有实时处理能力;嵌入式系统和具体应用有机地结合在一起,它的升级换代也是具体产品同步进行;嵌入式系统中的软件代码要求高质量、高可靠性,一般都固化在只读存储器中或闪存中,也就是说软件要求固态化存储,而不是存储在磁盘等载体中。
4.什么是实时系统?如果一个系统能及时响应外部事件的请求,并能在规定的时间内完成对事件的处理,这种系统称为实时系统。
第二章1.什么是可剥夺型内核?可剥夺型内核采用与不可剥夺型不同的调度策略,最高优先级的任务一旦就绪,就能获得CPU的控制权而得以运行,不管当前运行的任务处于何种状态。
可剥夺型内核采用的抢占式的调度策略,总是让优先级最高的任务运行,直到其阻塞或任务完成,响应时间因此优化。
2.一个应用程序为什么一定要使用空闲任务?在多任务系统运行时,系统经常会在某个时间内无用户任务运行而处于空闲状态,为了使CPU在此时有事可作,uC/OS-提供了空闲任务OSTaskldle。
空闲任务是不能被软件删除的。
3.统计任务是必须使用的吗?用户应用程序可根据实际需要来选择是否使用统计任务。
其功能是每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUsage中,以便应用程序通过访问它来了解CPU的利用率。
4.什么是任务的优先权?UC/oS-ll是用什么来描述任务的优先权的。
嵌入式实时操作系统μCOSII原理及应用习题答案(第四版)
嵌入式实时操作系统μCOSII原理及应用习题答案(第四版)嵌入式实时操作系统μCOSII原理及应用习题答案(第四版)嵌入式操作系统是一种特殊的操作系统,用于控制和管理嵌入式系统。
实时操作系统(RTOS)是一种在给定的时间约束下,能够及时响应外部事件的操作系统。
μC/OS-II是一种广泛应用于嵌入式系统的实时操作系统。
本文将介绍μC/OS-II的原理及应用,并提供第四版的习题答案。
一、μC/OS-II原理1. 任务(Task)管理:μC/OS-II采用优先级抢占式调度算法,支持多任务。
每个任务具有自己的任务控制块(TCB),用于记录任务的状态、优先级、堆栈等信息。
任务之间可以通过任务切换进行调度,具有不同的优先级来确保系统的实时性。
2. 信号量(Semaphore)机制:信号量用于任务之间的同步和互斥操作。
μC/OS-II提供了两种信号量机制:二值信号量和计数信号量。
二值信号量用于任务之间的互斥操作,而计数信号量用于任务之间的同步操作。
3. 事件标志组(Event Flag Group)机制:事件标志组用于任务之间的同步和通信操作。
一个事件标志组中可以包含多个事件标志位,每个标志位都可以独立设置或清除。
任务可以等待一个或多个事件标志位的发生,并在发生时得到通知。
4. 消息邮箱(Mailbox)机制:消息邮箱用于任务之间的通信。
每个消息邮箱中可以存放一个或多个消息,任务可以通过发送和接收消息来进行通信。
消息邮箱还支持阻塞和非阻塞两种方式。
5. 定时器(Timer)管理:μC/OS-II提供了软件定时器的功能,可以设置定时器来触发任务或其他操作。
定时器可以基于时间片、滴答定时器或硬件定时器实现。
二、μC/OS-II应用1. 实时任务调度:μC/OS-II可以在多个任务之间进行优先级调度,保证任务的及时执行。
通过设置任务的优先级和时间片,可以确保高优先级任务优先执行,从而满足实时性要求。
同时,μC/OS-II还提供了任务切换和上下文切换机制,确保任务之间的切换及时有效。
uCOSii中断处理过程详解(一)
一. UCOSII的中断过程简介系统接收到中断请求后,如果CPU处于开中断状态,系统就会中止正在运行的当前任务,而按中断向量的指向去运行中断服务子程序,当中断服务子程序运行完成后,系统会根据具体情况返回到被中止的任务继续运行,或转向另一个中断优先级别更高的就绪任务。
由于UCOSII是可剥夺型的内核,所以中断服务程序结束后,系统会根据实际情况进行一次任务调度,如果有优先级更高的任务,就去执行优先级更高的任务,而不一定要返回被中断了的任务。
二.UCOSII的中断过程的示意图三.具体中断过程1.中断到来,如果被CPU识别,CPU将查中断向量表,根据中断向量表,获得中断服务子程序的入口地址。
2.将CPU寄存器的内容压入当前任务的任务堆栈中(依处理器的而定,也可能压入被压入被中断了的任务堆栈中。
3.通知操作系统将进入中断服务子程序。
即:调用OSInt Enter()或OSIntN esting直接加1。
4.If(OSIntNe sting==1) {OSTCBCu r->OSTCBSt rPtr=SP;} //如果是第一层中断,则将堆栈指针保存到被中断任务的任务控制块中5.清中断源,否则在开中断后,这类中断将反复的打入,导致系统崩贵6.执行用户ISR7.中断服务完成后,调用OSInt Exit().如果没有高优先级的任务被中断服务子程序激活而进入就绪态,那么就执行被中断了的任务,且只占用很短的时间.8.恢复所有CPU寄存器的值.9.执行中断返回指令.四.相关代码与编译器相关的数据类型:typedef unsigne d char BOOLEAN;typedef unsigne d char INT8U;typedef unsigne d int OS_STK; //堆栈入口宽度为16 位(一) void OSIntEn ter (void)的理解uCOS_II.H中定义:#ifdef OS_GLOB ALS#define OS_EXT#else#define OS_EXT extern#endif //定义全局宏OS_EXT#ifndefTRUE#defineTRUE 1#endifOS_EXT BOOLEAN OSRunni ng; //定义外部BOO LEAN类型全局变量,用来指示//核是否在运行OS_EXT INT8U OSIntNe sting;//定义外部8位无符号整型数全局变量,用来表//示中断嵌套层数OS_CORE.C中的OSIn tEnter()函数原型:void OSIntEn ter (void){if (OSRunni ng == TRUE) //如果内核正在运行则进入if{if (OSIntNe sting< 255) //如果嵌套层数小于255,则可以继//续{OSIntNe sting++; //嵌套层数加1}}}(二)在中断服务子程序中加if( OSIntNe sting==1){…}的原因uCOS_II.H中定义:typedef structos_tcb{OS_STK *OSTCBSt kPtr;//声明指向任务堆栈栈顶的16位指针………………} OS_TCB;//定义名为OS_TCB的结构体数据类型,即任务控制块的数据结构OS_EXT OS_TCB *OSTCBCu r;//声明一个指向任务控制块的全局指针变量//用于指向当前任务的任务控制块中断服务程序中添加的代码:if ( OSIntNe sting== 1){OSTCBCu r->OSTCBSt kPtr = SP; // 如果是第一层中断,则将被中断任务//的堆栈指针保存在被中断任务的任务//任务控制块中}关于uCOS-II的中断服务程序(ISR)中必须加“OSIntNe sting==1”的原因==避免调整堆栈指针.出现这个问题的根源是当低优先级的任务被中断,当中断完成后由于有高优先级的任务就绪,则必须调度高优先级的任务,原来的低优先级任务继续被中断着,但是此时的低优先级任务的堆栈已经被破坏,已不能被调度程序直接调度了,要想被调度而必须调整堆栈指针。
ucosii中的中断
UC/OS-II中断相关的问题要弄清楚以下函数的意义:OSTimeTick()在OS_CORE.C中,为时钟管理函数。
OSTickISR( )在OS_CPU_A.S中以汇编的形式编写。
任何计算机系统都应该有一系统时钟,UCOS系统的系统时钟是通过硬件定时器产生中断来实现的,这个中断会产生一个时钟中断服务程序,时钟中断服务程序也叫做节拍服务。
各个任务运行都需要一个周期性的信号指示,即每一个任务允许运行的时间片是多少,必须规定好。
这个时间片就是系统时钟节拍UCOS系统响应中断的过程:系统正在运行任务,此时有中断发生,且系统收到了中断请求(系统如何收到中断请求,中断以何种方式告知操作系统?)。
如果处理器处于中断允许状态,系统就中止当前任务的运行,而按照中断向量去执行相应的中断服务程序;中断服务自程序结束前,会进行一次任务调度。
这样中断结束后,系统将会根据情况返回到被中止的任务继续运行,或者转到另外一个具有更高优先级的就绪任务上运行。
全局变量OSIntNesting有两个用途:第一是用来记录中断嵌套的层数,中断嵌套也就是说当第一个中断发生而没有结束的时候,又发生了第二个更重要的中断,依次类推,此时OSIntNesting就用来表示嵌套的层数,也就是有多少个中断在发生或者等待处理,也就是说每当有中断发生时,就将OSIntNesting加1,有中断结束的时候,就将OSIntNesting减1;第二是作为调度器是否可进行调度的标志,以保证调度器不会在中断服务程序中进行任务调度,也就是当OSIntNesting大于0的时候,将调度器加锁,OSIntNesting等于0的时候,调度器解锁。
(这样理解调度器的加锁和解锁,是否正确?中断服务自程序结束前,会进行一次任务调度。
这个时候调度器不是锁上的吗?如何调度呢?)UCOS用两个函数OSIntEnter (void)和OSIntExit (void)来处理变量SIntNesting。
第3章 μCOS-II操作系统任务调度
2011-3-30
6
µC/OS-II 操作系统标准教程 如果一个优先级为44(二进制码为101 100)的任务处于就绪状态 ptcb->OSTCBY ptcb->OSTCBBitY ptcb->OSTCBX ptcb->OSTCBBitX 将该任务添加到就绪表中 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX; OSRdyGrp |= ptcb->OSTCBBitY; 即 OSRdyTbl[5] = OSRdyTbl[5] | (00010000)B //将OSRdyTbl[5]的Bit4位置位,标识优先级44任务就绪 OSRdyGrp = OSRdyGrp | (00100000)B //将OSRdyGrp的Bit5位置位,标识OSRdyTbl[5]组有一个及以上任务就绪 = (INT8U)(prio >> 3) = 1 << ptcb->OSTCBY = (INT8U)(prio & 0x07) = 1 << ptcb->OSTCBX =(5)d =(00100000)B =(4)d =(00010000)B
14
µC/OS-II 操作系统标准教程
任务级任务切换基本过程
• (1)将当前任务的PC位置、通用寄存器数据、CPU的状态入栈; • (2)修改全局变量OSPrioCur(当前任务优先级变量)的值为全局 变量OSPrioHighRdy(最高优先级任务优先级)的值,即把最高就 绪任务优先级设置为新的当前任务优先级; • (3)修改原任务TCB的第1个成员(指向栈顶的指针*OSTCBStkPtr) 的值为当前SP寄存,以便再次返回; • (4)获取最高优先级的任务控制块中第1个成员(指向堆栈栈顶指 针*OSTCBStkPtr)的值到sp寄存器; • (5)修改OSTCBCur的值为新就绪最高优先级任务的任务控制块地 址; • (6)将新任务的PC位置、通用寄存器数据、CPU的状态出栈,开 始执行新的任务。
μC/OS-Ⅱ的中断系统设计
引言嵌入式实时系统要求系统有很好的实时性,能够及时处理各种异常事件,因此中断系统是嵌入式实时系统的重要组成部分,其时间和空间性能对嵌入式实时系统性能的影响至关重要。
要想缩短嵌入式实时系统的中断响应时间并提高系统中断处理效率,合理地设计中断系统非常关键。
S3C44BOX是三星公司基于ARM7TDMI内核的微处理器,支持IRQ和FIQ中断请求,同时还支持向量中断,以缩短中断响应时间。
嵌入式实时操作系统μC/OS-II提供了简单的中断管理机制对系统中断进行统一管理,但是对于不同的微处理器没有给出具体的中断处理方法。
本文在深入分析S3C448OX中断控制系统和μC/OS-II中断管理机制的基础上,进行中断系统设计,使之能更好地满足实际应用的需求。
1 S3C4480X中断系统图1所示为S3C44BOX的中断系统结构框图。
中断控制器的任务是在片内外围和片外中断源组成的多重中断发生时,经过优先级判断、选择其中一个中断;通过IRQ或FIQ向ARM7内核发出IRQ或FIQ中断请求,ARM7内核从中断控制器中获取中断信息,然后对中断进行处理,控制中断设备的操作过程。
当ARM7内核接收到中断控制器的中断请求时会自动执行以下几步操作,以实现中断环境保护和程序跳转:①将程序状态寄存器CPSR的内容保存到将要执行的中断模式的程序状态保存寄存器SPSR中,以实现对处理器当前状态、中断屏蔽位和各条件标志位的保存。
②设置当前CPSR中的相应位,屏蔽相应中断并切换处理器模式。
③将引起中断指令的下一条指令的地址(断点地址)保存到中断模式的子程序链接寄存器LR中,使中断服务程序执行完后能正确返回原程序。
④给程序计数器PC强制赋值,使程序从相应的向量地址开始执行中断服务程序。
当中断服务程序执行完后,需要执行以下几步操作从中断服务程序中返回:①从中断模式堆栈中恢复所有修改过的通用寄存器(RO~R12)。
②将中断模式SPSR寄存器的内容复制到CPSR中,恢复被中断模式程序的工作状态。
嵌入式实时操作系统uCOS-II原理(课件PPT) μCOS-II中的任务管理
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 3
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 4
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
5 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
或
prio=29 0 0 0 1 1 1 0 1
y = OSUnM图5a-6p在T就bl绪[O表S中R查d找yG最高rp优];先级别任务的过程 prio = (INT8U)((y << 3)
任当务控应制用块结程构序的主调要用成员函数OSTaskCreate( )
任务及控任制务块控(O制S_块TC链B)表 t…y创统进任务控这表…pOssIII数具链的表…ettNNNrrd…S建函行务控制个的TTTuue任_会有接任。fcc188Stts任 任 制 认6UU务T一数初从制块任头μ栈务理控tooUr当由按相为务即Kuss控__c个始空块各务部O务务块和ttt制*C指有的制cc进于用应一,相oSObbOOOs/块任化任,个控T_S**SSS控的的管行这户数个故当tT优针关O块OOC链TTTcbCSS务。务然成制BCCCS表系 些提量链这于BTT{BBBI制 身 任理先、 的-SCCDSP时这控后员块ntIBBtr统任供的表个是kliayi块 份 务的NPPot级任 属I;,个制用进链t;r;te初务的任。链一re用x///;vt///就 证 是这函块任行入(任任任/;;别务 性//始控任务表些指///指务务务来指个数链务赋到)向相 , 不等的 的向化制务控叫空等的的向来任记函首表的值任后待当优前时块数制做白当 没 能务为一当 表一的前先一空数先获属,务堆录个,还为块空的时状级个任任于 有 被栈些前 就会为取性最控任限态别任务初没系并任身任栈务务标(务是 任 系控与状 叫调 被 一 对后 制顶控始有统 把务份志节控控制务的用创个任再块制拍一务统制任态做块化对创它块证指制块数块的链系建任务把链针个控承的函应建们链。)务任、的块表指堆指管任务针针
μC/OS—Ⅱ中缩短中断关闭时间的方法
能引 起 两 种 对 临界 区操 作 的 冲 突 :① 在 中断 服 务 程 序 中
要 操 作 同一 临 界 区 ; 因为 中 断 的 产 生 而 引 起 任 务 的 转 ② 换 , 新 的任 务 中要 操 作 同一 临界 区 。所 以 . / 在 c OS—I I中
断 。而 最 大 关 中断 时 间是 衡 量 一 个 实 时 操 作 系 统 性 能 的 重要 指 标 , 因为 外 部 的输 入 一 般 都 是 通 过 中断 方 式 来 通 知
费 的时 间更 长 , 对 地 延 长 了关 中断 时 间 , 时 尽 量 从 软 相 这
此 可在 函数 操 作 临界 区 时直 接 将 系统 状 态 标 志置 位 , 示 表 系统 进 入 临界 操 作 状 态 , 后 即 可 进行 临 界 区 的操 作 。 然 系 统状 态标 志 的 复 位 在 任 务 调 度 函 数 中 执 行 。 当 然 对 系统 状 态 标 志 的设 置 是 要 在关 中 断 的条 件 下 执 行 的 , 这 应 该 算 是 系统 新 的一 个 临界 区 。
标 志 ” 。 界 区操 作 的 函数 , 以 在 进 入 临 界 区 之 前 先 查 询 系 统 状 可
态 标 志 。 如果 目前 系 统 没 有 进 入 临 界 操 作 状 态 , 首 先 则 将 该 标 志 置 位 , 示 系 统 进 入 临 界 操 作 状 态 , 后 该 函 数 表 然 就 可 以操 作 临 界 区 ; 如 果 发 现 系 统 已进 入 临 界 操 作 状 而 态 , 将 该 函 数 对 临界 区 操 作 的部 分 单 独 形 成 一 个 函数 , 则 放 到 一 个 系 统 循 环 函 数 数 组 里 , 待 系 统 任 务 调 度 时 等
UCOSII与中断(按键)
CPU 处注于意中!断中允断许服状务态 子( 即程中序断运是行结束
开 的μ放当C的前之次/)任O后任S,务-,务系 ,I调系I统 而系度统就 按统去将会 照运会中 中行根止 断正 向优据在 量先情运 的级况行指别进最行高一
向转而的去就运绪行任中务断响,服而应务并子中程不断序是的;一当过定程要接
任务切换过程 其实,调度 根据就绪表获得
器在进行调 获 待得 运待 行运 任行 务任 的务任 度时,在这 的 务任 控务 制控 块制 指块 针
个位置还要
进行一下判 断:究竟是 待运行任务
处理器的SP=任 务块中保存的SP
是否为当前 任务,如果 是,则不切
恢复待运行任务 的运行环境
换;如果不
是才切换, 处理器的PC=任
UCOSII与中断(按键) 控制LED
毛德明 142460389
任务运行时与 处理器之间的关系
运行环境包括了两部分: 处理器中的运行环境和
内存中的处运理行器环境
PC
寄存器组
内存 任务代码
SP 处理器通过两个指针寄存
任务堆栈
器(PC和SP)来与任务 程序运行环境 代码和任务堆栈建立联系
并运行它
多任务时任务与处理器
任务控制块或被剥 夺了任务控制块时
。 一个正在运行的
而使任务进入任等务待一状旦态响应中
的状态叫做任务的
断申请就会中止
任务的状态及其转换 睡眠状态
运行而去执行中 断服务程序,这 时任务的状态叫
做中断服务状态
系统为任务配备 了任务控制块且 在任务就绪表中 进行了就绪登记, 这时任务的状态 叫做就绪状态。
起始任务TaskStart的代码
μCOS-ii 介绍
第三章内核结构3.00 临界段,OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL()3种方法实现上边两个函数:(1) OS_CRITICAL_METHOD==1,用关中断实现OS_ENTER_CRITICAL,用开中断实现OS_EXIT_CRITLCAL();此方法的缺点是如果进入该函数前系统的中断状态是关中断,调用函数后则会改变其中断状态。
(2)OS_CRITICAL_METHOD==2, 用在堆栈中保存现在的中断开关状态,然后关中断来实现OS_ENTER_CRITICAL,用从堆栈中弹出原来的中断状态来实现OS_EXIT_CRITICAL();此方法存在的问题是:有些编译器不够灵敏,不能正确进行出入栈操作而引起严重错误。
(3)OS_CRITICAL_METHOD==3,用户可以得到当前处理器的状态字值,并保存在一个C函数的局部变量里,这个变量可以用于恢复PSW。
3.01 任务Ucosii 最多管理64个任务,但有些被系统保留,所以推荐使用其中的56个,不用前4个和后4个;为了使ucosii管理用户任务,必须在建立任务时,将任务的起始地址与其他参数传递给OSTaskCreate()或OSTaskCreateExt()中的一个。
3.02任务状态(睡眠态、就绪态、运行态、中断服务态、等待态)当所有任务都在等待事件的发生或等待延迟时间的结束时,ucosii执行空闲任务OSTaskIdle().3.03任务控制块(OS_TCB)一旦任务建立,一个任务控制块OS_TCB就被赋值,任务控制块是一个数据结构,当任务的CPU使用权被剥夺时,任务控制块用来保存该任务的状态,当任务重新得到CPU的使用权时,任务控制块能确保任务从当时被中断的那一点继续执行。
OS_TCB全部驻留在RAM中。
3.04就绪表每个就绪的任务都放在就绪表(ready list)中,就绪表中有两个变量:OSRdyGrp 和OSRdyTbl[]. 找出进入就绪态的优先级最高的任务的办法(ucosii提供了一个表OSUnMapTbl[]): y = OSUnMapTbl[OSRdyGrp]; x =OSUnMapTbl[OSRdyTbl[y]]; prio = (y<<3) + x ;附:若从就绪表的两个变量,通过查找法或直观地看,也可以找到处于就绪态的优先级最高的任务,但是比较麻烦,ucosii加入了算法,通过查表的办法可以直接得到处于就绪态的优先级最高的任务,比较方便。
ucos ii时钟中断技术介绍
ucos ii时钟中断技术介绍一、ucos ii时钟管理系统ucos ii原有的时钟管理系统类似于Linux,但是比Linux简单得多。
它仅向用户提供一个周期性的信号OSTime,时钟频率可以设置在10~100 Hz,时钟硬件周期性地向CPU发出时钟中断,系统周期性响应时钟中断,每次时钟中断到来时,中断处理程序更新一个全局变量OSTime。
ucos ii时钟中断服务程序的核心是调用OSTimeTick ()函数。
OSTimeTick ()函数用来判断延时任务是否延时结束从而将其置于就绪态。
其程序伪代码如下:void OSTimeTick(void) {OSTimeTickHook();// 调用用户定义的时钟节拍外连函数while { (除空闲任务外的所有任务)OS_ENTER_CRITICAL();//关中断对所有任务的延时时间递减;扫描时间到期的任务,并且唤醒该任务;OS_EXIT_CRITICAL();//开中断指针指向下一个任务;}OSTime++;//累计从开机以来的时间}在ucos ii的时钟节拍函数中,需要执行用户定义的时钟节拍外连函数OSTimeTickHook (),以及对任务链表进行扫描并且递减任务的延时。
这样就造成了时钟节拍函数OSTimeTick ()有两点不足:1、在时钟中断中处理额外的任务OSTimeIickHook (),这样增加了中断处理的负担,影响了定时服务的准确性;2、在关中断情况下扫描任务链表,任务越多所需要时间越长,而长时间关中断对中断响应有不利影响,是中断处理应当避免的。
二、改进的时钟管理系统针对上述OSTimeTick ()的不足之处,需加以改进来优化时钟节拍函数。
在Linux中一般对中断的响应分为两部分:立即中断服务和底半中断处理(bottom half)。
立即中断服务仅仅做重要的并且能快速完成的工作,而把不太重要的需要较长时间完成的工作放在底半处理部分来完成,这样就可以提高中断响应速度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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的通用寄存器; // 任务控制块的切换