基于ucos-ⅱ的ic卡门禁系统设计和实现内容摘要:

内核的功能,而这是 90 年代的嵌入式操作系统内核, 如 VxWorks 和 VRTXsa 才有的技术口 1。 2. 3 uC/ OSIl 的任务 IlC/ OSII 内核提供的基本服务是任务切换。 内核负责为每个任务分配 CPU 时问,并且负责各任务之间的通讯。 一个任务,就是一个简单的程序,该程序可以独享 CPU 控制权。 在实时 应用的过程中,设计者把问题分割成多个任务,并动态的为每个任务赋予一定 的优先级,使每个任务至少能解决一个问题阳 1。 从实现角度来看, uC/ OSII 是一组 C 函数库,应用程序代码与内核函数库 连接在一起,生成一个目标代码。 任务通常是一个无限的循环。 它拥有自己的代 码和堆栈空间 保存该任务的寄存器、返回地址和 I 临时参数 ,一般都是空函数, 不会返回任何值。 任务执行一次后,设置延时参数 OSTimeDLY。 表明在经过 OSTimeDLY 个时钟周期后再次运行,然后任务进行切换,使其他任务运行。 例如: void Task void 参数定义; for ;; 任务执行代码; 第二章嵌入式实时操作系统Ⅱ C/ OS― II OSTimeDLY ;//延时函数:清除任务就绪标志,设置延时的时钟周期。 OSSched ://调用 OSSched 进行任务调度。 2. 4 uC/ OSII 任务的状态与转换 通常情况下,每个任务都处在以下这五种状态之一曲 1。 ●休眠态 休眠态表示该任务驻留在内存中,但并不被多任务内核所调度。 ●就绪态 就绪表示该任务已经准备好,可以运行了,但由于该任务的优先级比 正在运行的任务的优先级低,所以暂时还不能运行。 ??运行态 . 运行态的任务是指该任务掌握了 CPU 的控制权,正在运行中。 . ?? 挂起态 . . 挂起状态也可以叫做等待事件态 WAITING,指该任务在等待某一事件 的发生 ??被中断状态 发生中断时, CPU 提供相应的中断服务, 原来正在运行的任务就进入 了被中断状态。 图 2― 1 表示 pc/ os― II 中一些函数提供的服务,这些函数使任务从一种状 态变到另一种状态。 图 2― 1 任务状态转换 第二章嵌入式实时操作系统 uC/ OSII uc/ os 提供了以下原型函数,对任务进行管理。 建立任务: OSTaskCreate 删除任务: OSTaskDel 请求删除任务: OSTaskDelReq 挂 起任务: OSTaskSuspend 恢复任务: OSTaskResume 堆栈检验: OSTaskStkChk 获得有关任务的信息: OSTaskOuery 2. 5 u Ier C/ OSII 的任务调度 Schedu 任务调度主要是协调任务对计算机系统内资源 如内存、 I/ 0 设备、 CPU 的 争夺使用。 任务调度又称为 CPU 调度,其基本原理是按照某种原则为处于就绪 状态的进程分配 CPU。 由于嵌入式系统中内存和 I/ O 设备一般都和 CPU 同时归 属于某任务,任务调度可分为”剥夺型调度”和”非剥夺型调度”两种基本方式。 所谓”非剥夺型调度”是指:一旦某个进程被调度执行,则该进程一直执行 下去直至该进程结束,或由于某种原因自行放弃 CPU 进入等待状态,才将CPU 重新分配给其他任务。 所谓”剥夺型调度”是指:一 旦就绪状态中出现优先权更高的进程,或者运 行的任务已用满了规定的时间片时,便立即剥夺当前任务的运行 将其放回就绪 状态 ,把 CPU 分配给其他任务口训。 作为实时操作系统, Ilc/ os― II 是采用的可剥夺型实时多任务内核。 可剥 夺型的实时内核在任何时候都运行就绪了的最高优先级的任务。 如果是中断服 务子程序使一个高优先级的任务进入就绪态,到中断服务完成时,内核让此时 优先级最高的任务运行 不一定是那个被中断了的任务 ,如图 22。 任务级系 统响应时间得到了最优化,且是可知的。 Low T 镐 lc Priodty / 鬣溺 i makes the hig TaskT 量 TI 二 prIo 啊蜮删 y“蘸溺 ―ISR 图 22 可剥夺内核 第二章嵌入式实时操作系统 uC/ OS― II IJC/ OSII 调度工作的内容可以分为两部分:最高优先级任务的寻找和任务 切换„ 1。 其最高优先级任务的寻找是通过建立就绪任务表来实现的。 内核将系 统中处于就绪态的任务在就绪表 ReadyList 进行标注,通过就绪表中的两个 个任务 有唯一的优先级,因此任务的优先级也是任务的唯一编号 ID ,可以作 为任务的唯一标识。 |lc/ os― II 中的每一个任务都有独立的堆栈空问,并有一 control 个称为任务控制块 TCB task block 的数据结构,记录任务执行的环 境,包括任务的优先级、任务的堆栈指针、任务的相关事件控制块指针等,其 中第一个成员变量就是保存的任务堆栈指针。 内核可用控制块优先级表 用任务控制快 OS― TCB、就绪表 Ready List 中找 来进行任务调度的。 任务调度程序 OSSched 首先由就绪表 Ready 到当前系统中处于就绪态的优先级最高的任务,然后根据其优先级由控制块优 TASK 先级表 OSTCBPrioTbl 口取得相应任务控制块的地址,由 OSSW 程序进 行运行环境的切换。 将当前运行环境切 换成该任务的运行环境,则该任务由就 绪态转为运行态。 当这个任务运行完毕或因其它原因挂起时,仟务调度程序 OSSched 再次到就绪表 ReadyList 中寻找当前系统中处于就绪态中优先级 最高的任务,转而执行该任务,如此完成任务调度。 若在任务运行时发生中断, 则转向执行中断程序,执行完毕后不是简单的返回中断调用处,而是由 OSIntExit 程序进行任务调度,执行当前系统中优先级最高的就绪态任务。 当系统中所有任务都执行完毕时,任务调度程序 OSSched 就不断执行优先级 、 最低的空闲任务 OSTaskIdle ,等待用户程序的运行。 Task 任务调度器 the Scheduler 实现函数: void OSSched void INT8U Y: 0S― ENTER_CRITICAL : I if OSLockNestingOSIntNesting : 0 胁调度锁,或者处于中断状态禁止调度木/ y: OSUnMapTbl[OSRdyGrp]; /; l:获取准备就绪组里最高优先级的任务木/ if OSPrioHighRdy! OSPrioCur 第二章嵌入式实时操作系统 uC/ OSII /木设置运行任务为最高优先级任务木/ OSCtxSwCtr++: /木执行运行环境切换木/ OS― TASK_SW : OS― EXIT― CRITICAL : 为缩短切换时问, OSSched 全部代码都可以用汇编语言写。 IJC/ OSII任 务调度所花的时间是常数,与应用程序中建立的任务数量无关。 2. 6 uC/ OSII 的时钟中断 2. 6. 1 系统中断 中断是一种硬件机制,用于通知 CPU 有个异步事件发生了。 中断一旦被系 统识别, CPU 则保护现场 CONTEXT ,即部分 或全部 寄存器的值,跳转到专门 的子程序,称为中断服务子程序 ISR。 中断服务子程序对事件进行处理,处理 完成后执行任务调度,开始运行优先级最高的任务Ⅱ刳。 中断使得 CPU 可以在事件发生时再予以处理,而不必让微处理器连续不断 地查询 POLLING 是否有事件发生。 通过两条特殊宏指令:关中断 DisableInterrupt 和开中断 EnableInterrupt ,可以让微处理器不响应 或响应中断。 在门禁系统的设计中,关中断的时间和中断服务的处理时间都设 计的尽可能的短,以避免引起中断丢失。 2. 6. 2 系统时钟节拍 时钟节拍中断是一个非常重要的、特定的周期性中断 时钟中断 ,因为整 个操作系统的活动都受到它的激励。 这个中断可以看作是系统心脏的脉动。 操 作系统通过时钟中断来确定时 间间隔,实现时问的延时及确定任务超时。 中断 之间的时问问隔取决于不同的应用,一般在 10,200Ills 之间。 时钟的节拍式中 断使得内核可以将任务延时若干个整数时钟节拍,以及当任务等待事件发生时 提供等待超时的依据168。 3I。 时钟节拍频率越快,门禁系统的额外开销就越大。 因 此系统定义了 32 位无符号整数 OSTime 来记录系统启动后时钟滴答的数目。 在 多任务系统启动以后再开启时钟节拍器,也就是在调用 OSStart 之后。 u 实现的。 时钟节拍中断服务子程序的伪代码如下: I 第二章嵌入式实时操作系统 uC/ OS― I void OSTickISR v。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。