嵌入式技术执行专用功能并被内部计算机控制的设备或者系统。嵌入式系统不能使用通用型计算机,而且运行的是固化的软件,用术语表示就是固件(firmware),终端用户很难或者不可能改变固件。尽管绝大多数嵌入式系统是用户针对特定任务而定制的,但它们一般都是由下面几个模块组成的: 一台计算机或者微控制器,字长可能是可怜的4位或者8位、16位、32位甚至是64位。 用以保存固件的ROM(非挥发性只读存储器)。 用以存程序数据的RAM(挥发性的随机访问存储器)。 连接微控制器和开关、按钮、传感器、模数转化器、控制器、LED(发光二极管)和显示器的I/O端口。 一个轻量级的嵌入式操作系统,一般是自行编写的。 专门的单片微控制器是大多数嵌入式系统的。通过把若干个关键的系统组成部分集成到单个芯片上,系统设计者就可以得到小而便宜、可以操作较少外围电子设备的计算机。
随着嵌入式技术的发展,实时操作系统RTOS(Real Time Operating System)被越来越多地应用在嵌入式系统中,RTOS,即:实时系统(Real-time operating system),实时系统能够在指定或者确定的时间内完成系统功能和外部或内部、同步或异步时间做出响应的系统。它的正确性不仅依赖系统计算的逻辑结果,还依赖于产生这个结果的时间。因此实时系统应该在事先先定义的时间范围内识别和处理离散事件的能力;系统能够处理和储存控制系统所需要的大量数据。 为了便于理解,机场的售票系统就是一个典型的实时系统。目前,软件硬化常用的有两种方法:(1)微程序方式,特点是成本较低,方便灵活;(2)组合逻辑方式,特点是速度快、可靠性高,随着大规模集成电路的发展,这种方式逐渐显示出优越性。信号量管理是RTOS中频繁运行的程序段之一,如果将这一部分用硬件实现,对提高机器的速度将有很明显的效果。
1 信号量管理的工作原理
μC /OS-II是一个完整的、可移植、可固化、可裁剪的占先式实时多任务内核。μC/OS-II绝大部分的代码是用ANSI的C语言编写的,包含一小部分汇编代码,使之可供不同架构的微处理器使用。至今,从8位到64位,μC/OS-II已在超过40种不同架构上的微处理器上运行。μC/OS-II已经在世界范围内得到广泛应用,包括很多领域, 如手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制上。实际上,μC/OS-II已经通过了非常严格的测试,并且得到了美国航空管 理局(Federal Aviation Administration)的,可以用在飞行器上。这说明μC/OS-II是稳定可靠的,可用于与人性命攸关的安全紧要(safety critical)系统。除此以外,μC/OS-II 的鲜明特点就是源码公开,便于移植和维护。
μC/OS-II中信号量主要数据结构由两部分组成:(1)信号量的计数值Cnt。当数值为正时用于记录可使用的资源数,当数值为负,其表示等待当前信号量的任务个数;(2)等待该信号量的任务列表。信号量的基本数据结构需要申请一个ECB来存储。一个任务或ISR可以通过ECB向另外的任务发信号,一个任务可以等待另一个任务或中断服务子程序给它发送信号,多个任务可同时等待同一个事件的发生。
信号量管理的工作原理框。信号量管理模块以及事件控制块管理都是独立于CPU的逻辑结构,都可以直接从数据总线上获得数据信息进行处理,在信号量管理模块与ECB的存储模块间建立一条数据通路,在不增加总线负担的情况下加快二者间的通信。
2 信号量管理的硬件设计与实现
2.1 ECB的设计与实现
ECB是实现信号量管理的基本数据结构,因此在设计实现信号量管理之前,要先完成ECB管理的设计与实现。本系统中ECB的结构参照μC/OS-II中ECB的结构设计。每个ECB存储单元包含一个EventType(事件类型),用于标记当前ECB被分配给信号量、互斥型信号量、邮箱还是消息队列;当一个ECB被分配给信号量时,Cnt做为信号量的计数器;ECB中的等待表lut用于存储等待当前信号量任务的优先级。
ECB中等待表硬件实现的结构示意。等待表的结构类似一个8行8列的矩阵,存储单元编号从00~77。当一个任务在申请当前信号量而没有获得时,应将当前任务设置为等待状态,令Wr有效,以申请该信号量任务的优先级为地址,进行译码,选通相应单元后再进行写1操作。例如,申请该信号量的任务优先级Sid为111111时,对其进行译码,高三位行地址译码为10000000,低三位列地址译码为10000000,选中77单元向其写入1,则优先级为111111的任务进入等待状态。若要将一个处于等待表中的任务删除,令De有效,同样,根据地址线选通某一存储单元,向单元内写0,从而删除某一处于等待状态的任务。在控制电路中设置EventGrp 8位寄存器,用于记录当前各行中是否有等待任务;第i行中某一位置为1,EventGrp(i)=1,状态EventGrp(7)=1、EventGrp(6)=1、EventGrp(0)=0。Rd有效时,控制电路根据EventGrp采用一定算法生成优先级的高三位;根据EventGrp读出某行后生成优先级低三位;下一时钟送出优先级。以上为对等待表进行基本读写操作的过程。
该硬件系统中ECB基本存储单元通过调用系统的IP核来实现,根据存储数据的不同,采用不同的IP核;多个基本单元通过一个上层文件生成一个ECB单元,每个单元再作为一个基本器件用于实现整个ECB的存储体。通过地址的译码选通ECB单元,根据控制信号对数据做读写操作。
2.2 创建/删除一个信号量
ECB是公共数据结构,在传统的操作系统中创建一个信号量时,首先需要申请一个ECB,初始化后才可以对这个信号量进行P/V等操作;在删除一个信号量后,要对信号量占用的ECB进行释放。创建信号量时,信号量管理模块首先要申请一个空ECB,查找ECB的整个存储体判断是否有空余的ECB。如果没有空余ECB,则信号量管理模块将获得一个申请失败信号;否则将获得一个空ECB的地址,并将其返回给创建该信号量的任务;再根据地址初始化ECB。如果用硬件实现信号量管理后,按照以上过程进行操作会浪费很多时钟,数据在模块间来回传送增加通信次数,必然降低系统的执行速度。为方便讨论,假设系统中ECB有64个(可以根据系统中ECB的个数来改变表的大小),表的每个位置对应一个ECB,当某一位置为0时表示该位置对应的ECB空闲,为1时表示该位置对应的ECB被占用。第1行、第8列为1,表示偏移地址为000111的ECB被占用;第2行、第2 列为1,偏移地址为010010的ECB被占用。
在创建一个信号量时,查找ECB映射表,判断是否有为0的位置。如果没有则返回申请失败;否则寻找一个为0的位置,生成ECB的地址,返回给创建该信号量的任务。在映射表中相应位置写1表明该ECB已经被占用,下一时钟对申请到的ECB进行初始化,写入信号量初始值。在删除一个信号量时,首先根据信号量的ECB地址查询映射表中对应位置是否为0,如果为0,则表示该信号量已经被其他任务删除,返回删除错误;否则清除该信号量在映射表中的记录,通知ECB管理模块将等待该信号的所有任务置为就绪态,触发任务调度,清除ECB中的该信号量的所有信息。
2.3 申请/释放一个信号量(P/V操作)
信号量管理中的主要操作就是P/V操作,P/V操作实现的RTL。
(1)P操。令pend_sem有效,首先应判断申请信号量的任务是否为中断服务程序(在μC/OS-II中,中断服务程序不允许申请一个信号量),如果是则返回申请错误信息,否则进行以下操作:令read_cnt有效去ECB管理模块读Cnt值;读回后判断Cnt的值。如果Cnt>0,当前申请任务获得该信号量,任务继续执行,返回申请成功信号pend_err为低;否则pend_err为高阻,根据申请类型Pend_type来决定是否修改Cnt值,是否将申请信号量的任务置为等待态。
(2)V操作。令post_sem有效,通过硬件电路使read_cnt有效,同时给出信号量的ECB地址,下一时钟读出Cnt值,并判断;如果Cnt>0则表示没有任务等待当前信号量,修改Cnt值;如果Cnt<0则表示当前有任务等待该信号量,修改Cnt值,令select_h有效,从ECB任务等待表中找出优先级的任务,通知任务管理器将该任务置为就绪态,触发任务调度。
3 功能仿真
为验证设计对系统性能的影响,采用ISE 8.2软件对各个模块进行时序仿真。P/V操作仿真结果。P/V操作需要在两个模块之间进行读写数据,操作过程中,P/V信号始终有效。
(1)pend_sem有效(P操作)。申请信号量任务的优先级为01,申请信号量的地址为05。pend_sem有效,令read_cnt为高,根据地址pend_addr读当前信号量的值Cnt,下一个时钟返回数值Cnt_in为0002,大于0;任务获得信号量继续执行,wr_cnt为高,Cnt值进行减1操作后送Cnt_out写回ECB。
(2)post_sem有效(V操作)。根据地址读Cnt值,Cnt值为FFFE<0(Cnt值以补码形式存储)。下一个时钟Cnt进行加1操作后写回ECB,同时Select_h为高,从等待该信号量的任务列表中选择出优先级的任务设置为就绪态,触发任务调度。
(3)申请一个信号量。申请信号量任务的优先级为03,申请的信号量的地址为09。如果下一个时钟读回的Cnt值为FFFD<0,并且申请类型为高(有等待申请),则修改Cnt值写回,令wr_sid为高,将当前申请任务的优先级送pend_prio_out写入等待该信号的任务列表中。
(4)申请一个信号量,读回的Cnt值为FFFA<0,但当前申请类型为低(无等待申请),不进行任何操作,返回申请失败,通知任务管理器将当前任务阻塞。
用户程序在创建、删除一个信号量以及申请某类共享资源进行P/V操作时,用软件实现信号量管理中,一般先从用户态转到系统态,然后进行基本数据的查询、读出、比较、判断等,再转相应的程序入口,还要从系统态转回用户态。而用硬件实现信号量管理后进行以上操作只需一条读或写指令,并且这条指令在用软件实现的信号量管理中也是必须的,其他操作都由硬件逻辑来实现,简化了操作过程。因此,硬化信号量管理后对整个机器速度的提高是非常明显的,特别是对资源种类多、数量大的计算机系统,速度的提高就会更加明显。另一方面,由于硬件的可靠性远超过软件的可靠性,所以硬化后可提高RTOS的可靠性。
单片机处理器能力的提高和应用程序功能的复杂化、化,迫使应用程序划分为多个重要性不同的任务,在各任务间优化地分配CPU时间和系统资源,同时还要保证实时性。靠用户自己编写一个实现上述功能的内核一般是不现实的,而这种需求又是普遍的。在这种形势之下,由人员编写的、满足大多数用户需要的高性能RTOS内核就是一种必然结果了。对程序实时性和可靠性要求的提高也是RTOS发展的一个原因。此外,单片机系统软件开发日趋工程化,产品进入市场时间不断缩短,也迫使管理人员寻找一种有利于程序继承性、标准化、多人并行开发的管理方式。从长远的意义上来讲,RTOS的推广能够带来嵌入式软件工业更有效、更化的分工,减少社会重复劳动、提高劳动生产率。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。