事件驱动的实时嵌入式系统的设计和实现

事件驱动的实时嵌入式系统的设计和实现

ID:9627259

大小:50.50 KB

页数:3页

时间:2018-05-04

事件驱动的实时嵌入式系统的设计和实现_第1页
事件驱动的实时嵌入式系统的设计和实现_第2页
事件驱动的实时嵌入式系统的设计和实现_第3页
资源描述:

《事件驱动的实时嵌入式系统的设计和实现》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、事件驱动的实时嵌入式系统的设计和实现摘要嵌入式实时操作系统具有嵌入式软件共有的可裁剪、低功耗等特点;而实时操作系统,可以满足系统对实时性的要求。但嵌入式实时系统需要增加额外的系统开销,随着系统功能的增加,逐渐增加的开销将不容忽视。对于某些功能简单的嵌入式系统,本文提出了一种实时嵌入式系统的设计方法,采用简单的方法和代码来建立一个快速、有效地系统。该嵌入式软件系统主要包括主控循环系统、事件驱动任务、周期循环任务及软件计数器。在冰箱嵌入式系统中进行了具体实现,满足实时性的同时降低了对系统资源的占用率。关键字主控循环;事件驱动任务;周期任务;软件计时器1引言嵌入式实时系统中采用的操作系统,我们称为

2、嵌入式实时操作系统,它既是嵌入式操作系统,又是实时操作系统。作为一种嵌入式操作系统,它具有嵌入式软件共有的可裁剪、低功耗等特点;而作为一种实时操作系统,可以满足系统对实时性的要求[1]。但是,使用嵌入式实时操作系统还需要额外的ROM/RAM开销,2%~5%的CPU额外负荷以及内核的费用;同时如果任务之间抢占CPU控制权处理不好,会产生系统崩溃、死机等严重后果;而且随着对嵌入式实时操作系统需求的增长,将越来越多的功能添加到系统中,使其变得越来越臃肿。对许多小型或中等嵌入式设备,尤其是对成本敏感的小型设备,使用嵌入式实时操作系统会大大增加设备的成本,因而在本文中提出一种实时嵌入式软件系统的设计方

3、法。本文的设计思想主要包括主控循环系统、事件驱动任务、周期循环任务及软件计时器四部分。2系统设计2.1主控制循环该系统将软件分成独立的任务模块,支持事件驱动任务,将事件驱动任务输入到事件队列,当接收到恰当地触发事件时,才开始执行。否则,使其空闲,只占用极少地处理时间;以预置地速度执行周期任务(即不需要触发就可执行地任务)[3]。根据需要,执行速度有准确计时和相对计时(与每次主控循环的执行速度相关联)两种方式。该系统是非抢占式系统(其他的任务不会无法中断正在运行的任务),不需要使用信号量来保护数据。只有当任务条目函数返回数值时,才会中断所有任务。例如,一个有键盘、LCD、RS-232端口、多个

4、I/O和串行打印机的嵌入式系统。I/O状态的每次改变将导致发送一条RS-232信息、打印输出和LCD更新。RS-232信息的接收将导致打印输出、LCD更新和输出状态更新。程序1主控循环intmain(void){Init_All();for(;;){IO_Scan();IO_ProcessOutputs();KBD_Scan();PRN_Print();LCD_Update();RS232_RecEive();RS232_Send();TMR_Process();}//此处可以添加异常处理代码return(0);}在程序1中,无穷循环中的每个函数调用代表一个独立的任务,无论执行哪个函数,每个

5、任务必须在合理的时间内返回。该系统的主要工作是事件驱动任务。每个任务都有一个输入事件队列。例如,IO_ProcessOutputs是事件驱动任务,负责控制输出状态,当输出没有状态改变时,该任务处于空闲状态。需要启动输出时,则给该任务发送一条事件消息。在该系统中,有三个任务会向IO_ProcessOutputs发送事件消息:●输入扫描器(IO_Scan)任务,当输入状态改变导致输出状态的改变;●RS-232接收任务,当接收到RS-232消息,需要开启或关闭输出;●按键扫描器任务(KBD_Scan),当完成一个条目时,需要开启或关闭输出。其它的任务是周期任务,无需触发器即可运行。有些需要运行地快

6、一些,有些需要慢一点。例如,扫描输入需要比LCD的刷新快。为此需要提供一些任务间通讯的简单方法。当输入状态发生急剧地变化时,RS-232无法发送所有的消息。为此,应该降低从RS-232传送的I/O扫描器任务。这可以使用稳定的执行计数器技术来实现。除上述功能外,还需要另一外些重要功能。如使LCD上的光标按固定的频率刷新。这些功能由TMR_Process间接调用,而不是由主控循环调用。TMR_Process是主控循环中唯一一个非用户定义任务。程序2事件输入结构typedefunsignedintber=1;//开启输出OUTPUT_PutEvent(OutputEvent);//输入一个事件程序

7、4发送事件到任务//从主控制循环中调用事件voidIO_ProcessOutputs(void){.if((ret=OUTPUT_GetEvent(OutputEvent)!=EMPTY){//缓冲区非空//处理OutputEvent,开启/关闭所需输出IO_OutputStateChange(OutputEvent.Number,OutputEvent.Nes(void){//其他任务}对第一个问题,有一种

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。