8嵌入式系统组件-课件

上传人:风*** 文档编号:240743113 上传时间:2024-05-04 格式:PPT 页数:59 大小:821.50KB
返回 下载 相关 举报
8嵌入式系统组件-课件_第1页
第1页 / 共59页
8嵌入式系统组件-课件_第2页
第2页 / 共59页
8嵌入式系统组件-课件_第3页
第3页 / 共59页
点击查看更多>>
资源描述
嵌入式系统原理、设计与应用7 嵌入式操作系统1内容v嵌入式系统模型v键盘vLED显示器vLCD显示器v日历时钟v模拟量输入/输出v开关量输入/输出v异步串行通信v其它2概述-组件技术的优越性1.提高开发的效率提高开发的效率开发嵌入式系统的软件时,通常一些软件模块如开发嵌入式系统的软件时,通常一些软件模块如UART的收发器的收发器模块在大多数的产品中都需要使用,通过把这些模块封装成组模块在大多数的产品中都需要使用,通过把这些模块封装成组件,后续的开发继续使用,显然可以提高开发的效率。件,后续的开发继续使用,显然可以提高开发的效率。2.提高开发的可靠性提高开发的可靠性新开发的软件模块都需要进行测试,包括实验室测试和公开测新开发的软件模块都需要进行测试,包括实验室测试和公开测试,这些测试都需要时间。使用组件化的方法,可以使用以前试,这些测试都需要时间。使用组件化的方法,可以使用以前被测试过的组件代码,可以大大提高软件的可靠性。被测试过的组件代码,可以大大提高软件的可靠性。3.提高软件的可移植性提高软件的可移植性软件组件的设计尽量采用标准的接口,如果没有标准,可以自软件组件的设计尽量采用标准的接口,如果没有标准,可以自己定义完备的接口,便于后续系统的开发时使用。例如液晶显己定义完备的接口,便于后续系统的开发时使用。例如液晶显示模块,设计成彩色的功能接口比设计成黑白的有许多优点,示模块,设计成彩色的功能接口比设计成黑白的有许多优点,彩色可以兼容黑白。彩色可以兼容黑白。4.适合于并行开发适合于并行开发通常一个嵌入式系统的软件由许多模块组成,这些模块包括设通常一个嵌入式系统的软件由许多模块组成,这些模块包括设备驱动模块、算法模块等。良好的组件化设计方法,可以把任备驱动模块、算法模块等。良好的组件化设计方法,可以把任务均分,并行开发,提高开发效率。务均分,并行开发,提高开发效率。31 例:嵌入式系统模型v嵌入式处理器vUART串行通信收发器v键盘v液晶显示器v模拟量输入接口v模拟量输出接口v数字量输入接口v数字量输出接口v数码管显示器v日历时钟4原型系统EMCUmemoryAIAOLCDDI/DOkeyboardUARTOthers5模型系统的软件组成模块化设计原则v主程序vI/O驱动程序-软件组件6内容v嵌入式系统模型v键盘vLED显示器vLCD显示器v日历时钟v模拟量输入/输出v开关量输入/输出v异步串行通信v其它72 键盘82 键盘92 键盘v主要接口函数KeyClear():清除键盘缓冲区KeyGetKeyCode():读取一个键码KeyHitKey():检查一个键是否按下KeyInitKey():初始化键盘模块102 键盘v键盘组件的使用void main(void)OSInit();/*操作系统初始化*/KeyInitKey();/*键盘模块组件初始化*/OSStart();/*开始多任务运行*/112 键盘v任务中使用键盘组件模块void UserTask(void*data)Integer8 keycode;Data=data;while(1)keycode=KeyGetKeyCode(0);/*等待用户键盘输入*/Switch(keycode)/*根据键的扫描码进行相应的处理*/12内容v嵌入式系统模型v键盘vLED显示器vLCD显示器v日历时钟v模拟量输入/输出v开关量输入/输出v异步串行通信v其它133 LED显示器v利用I/O端口控制LED显示器143 LED显示器v多路复用LED显示153 LED显示器v组件内部实现(软件组件的数据结构设计)(1)系统使用7段LED数码管显示器;(2)每个LED数码管有一个编号作为地址,编号从0开始;(3)对应于每一个数码管,使用3个字节作为显示缓冲区,其中第一个存放它的字符代码,为了未来的扩展,字符代码使用ASCII码,虽然目前大多数应用的LED只显示16个16进制字符和部用户定义的图形;第二个存放颜色;第三个存放闪烁属性。(4)需要为LED的显示模块预留一个定时器(硬件定时器或软件定时器),用于显示的刷新。163 LED显示器v组件内部实现API_LED173 LED显示器v接口函数LedInit();初始化内部数据结构LedClear();清除内部缓冲区LedDispChar(Unsigned16 position,Unsigned8 c,Unsigned8 color,Unsigned blink);显示字符LedOff():关闭显示LedOn():打开显示183 LED显示器v组件的实现Leddef.hv定义组件模块的数据结构和配置led.cv实现LED组件的所有函数19内容v嵌入式系统模型v键盘vLED显示器vLCD显示器v日历时钟v模拟量输入/输出v开关量输入/输出v异步串行通信v其它204 LCD显示器1.LCD显示器被广泛地使用于个人设备中,应用范围还在不断扩大。LCD是一种被动显示技术,它本身不发光,利用反射光显示字符和图形。LCD的功耗非常低,于是在低功耗的场合特别是电池供电的嵌入式设备上得到了广泛的应用。2.通常LCD使用自然光,反射自然光进行显示,如果周围的光很少或没有光,那么需要在LCD的后面放置一个光源,这个光源叫做背光。3.背光可以通过场致发光(EL)或LED来实现,EL背光非常微弱,它产生一个非常均匀的光源。用于LED的光源颜色很多,常用白光。EL背光电流很低,但是需要较高的电压,通常在20V以上。EL背光的使用期限有限,通常在20003000小时。LED背光的使用寿命很长,但是耗电较多。通常LED背光嵌在LCD的后面,有很多种颜色可以选择。214 LCD显示器vLCD显示系统分类(3类)v字符LCD显示-与LED基本相同;v图形LCD显示器-点阵;v定制LCD显示器-为用户特殊定制-电子台历 224 LCD显示器vLCD显示系统组件实现LCD控制寄存器LCD显存234 LCD显示器v接口函数的实现点阵显示器的种类v黑白v灰度v彩色 方案v为每一种LCD定义接口函数,优点:裁减性好,缺点:应用软件的开发需要考虑移植v定义一种接口函数,支持三种LCD缺点:裁减性不好 优点:应用软件的开发基本不需要考虑移植性问题244 LCD显示器v接口函数的实现-定义一种接口函数,支持三种LCD1.LCD初始化:Unsigned8 LcdInit(struct*LcInitPara)2.关闭和打开显示void LcdOff(),void LcdOn()3.清除LCD显示屏:void LcdClear()4.显示字符串:void LcdDispStr(Unsigned16 row,Unsigned16 col,Unsigned8*pStr,Unsigned32 color,Unsigned8 font,Unsigned8 size);5.显 示 象 素 点:void LcdPixel(Unsigned16 row,Unsigned16 col,Unsigned32 color);6.画线:void LcdLine(Unsigned16 x1,Unsigned16 y1,Unsigned16 x2,Unsigned16 y2,Unsigned8 Linetype,Unsigned32 color);7.画矩形:LcdRectangle(Unsigned16 x1,Unsigned16 y1,Unsigned16 x2,Unsigned16 y2,Unsigned8 type,Unsigned32 color,Unsigned8 fill,Unsigned32 fillcolor);8.画弧型:LcdArc(Unsigned16 x,Unsigned y,Unsigned16 radium,Unsigned16 angel1,Unsigned16 angel2,Unsigned32 color,Unsigned8 type);25内容v嵌入式系统模型v键盘vLED显示器vLCD显示器v日历时钟v模拟量输入/输出v开关量输入/输出v异步串行通信v其它265 日历时钟v概述v实现方法专用日历时钟芯片v时钟芯片、电池、32768时钟晶体软件实现275 日历时钟v实现原理285 日历时钟v接口函数1.ClockInit(),-时钟组件初始化2.ClockSetDate(),-设置日期3.ClockSetTime(),-设置时间4.ClockSetDateTime(),-设置日期和时间5.ClockGetDate(),-读取日期6.ClockGetTime(),-读取时间7.ClockGetDateTime(),-读取日期时间8.ClockFormatDate()。-格式化日期29内容v嵌入式系统模型v键盘vLED显示器vLCD显示器v日历时钟v模拟量输入/输出v开关量输入/输出v异步串行通信v其它306 模拟量输入v模拟输入硬件结构 316 模拟量输入v读取A/D值的方法1-慢速的A/D转换器件(1)选择需要进行模数转换的通道;(2)触发进行模数转换(3)延迟一段时间,延迟的时间大于或等于模数转换的时间加上信号在模数转换器保持稳定的时间(4)读取模数转换的值(5)把读取的值提交给应用程序326 模拟量输入Unsigned16 AnalogInput(Unsigned8 channel)/*to do:操作模拟多路开关,选择模数转换的通道*/*延时,等待模拟信号在模数转换器的输入端稳定*/*启动模数转换*/*延时,等待模数转换的结束*/*读取模数转换的结果把返回给调用者*/336 模拟量输入v方法2:利用模数转换器的结束信号来通知用户-中断方式 Unsigned16 AnalogInput(Unsigned8 channel)/*选择要读取的输入通道*/*延时,等待模拟多路开关输入信号的稳定*/*启动模数转换*/*等待信号量SemaAD or 超时*/if(超时)/*模数转换出错处理;*/else /*读取转换的结果并返回调用者*/void IsrAD()/*发出SemaAD(模数转换结束信号)*/346 模拟量输入v方法3:A/D转换的速度比较快-直接在程序中读取Unsigned16 AnalogInput(Unsigned8 channel)/*选择模拟输入通道*/*延时,等待模拟信号在模数转换器的输入端稳定*/*启动模数转换工作*/*检测是否转换完成,如果完成则读取转换结果*/*把转换的结果返回给调用程序*/356 模拟量输入v关于移植性的考虑组件化方法把A/D转换的细节隐藏在组件的内部。关于A/D的精度:目前的模拟转换器的精度有8位、10位、14位等,甚至有20位、24位或更高。为了将来技术的发展,可以把转换结果表示成32位,在一定的时期内足够用了,对于小于32位的模数转换器,低位表示转换的结果,高位用0填充,最高位可以作为符号位。367模拟量输出vD/A的环节数模转换器滤波器放大器执行器/驱动器377模拟量输出v主要接口函数void AnalogOutput(Unsigned8 channel,Unsigned32 value);387模拟量输出v使用例子void UserTask()Unsigned32 temp;/*数据来源和处理,得到数据temp*/AnalogOutput(0,temp);/*此时电压表的指针指示相应的模拟量*/39内容v嵌入式系统模型v键盘vLED显示器vLCD显示器v日历时钟v模拟量输入/输出v开关量输入/输出v异步串行通信v其它408 开关量输入/输出418 开关量输入/输出v开关量通常是1位v计算机处理的数据以字节为单位v接口函数的实现方法1.直接以字节为单位处理开关量 vvoid IOWrite(Unsigned address,Unsigned8 value);vUnsigned8 IORead(Unsigned address)2.包装以位为单位处理开关量 vUnsigned8 SwitchRead(Unsigned16 channel);vvoid Unsigned8 SwitchWrite(Unsigned16 channel,Unsigned8 On_Off);428 开关量输入/输出-实现方式比较v方式(1)-字节优点v程序的代码量小,执行的速度快,缺点v程序设计的不直观,程序的移植性不好。v方式(2)-位优点v可移植性好,把开关进行了抽象化,屏蔽了开关量操作的细节;v程序的可读性好缺点v程序的代码量比较大,程序的执行时间稍长。v由于现代处理器的速度提高和存储器的空间比较大,方式(2)带来的问题可以完全克服。438 开关量输入/输出-实现方式比较void UserTask()if(SwitchRead(10)=ON)SwitchWrite(20,ON);else SwitchWrite(20,OFF);44内容v嵌入式系统模型v键盘vLED显示器vLCD显示器v日历时钟v模拟量输入/输出v开关量输入/输出v异步串行通信v其它459 异步串行通信v接收方法1469 异步串行通信-接收ISR IsrUartRx(void)/*接收中断服务例程*/Unsigned8 c;/*保存CPU的寄存器,即把ISR中使用的寄存器压栈*/*从通信控制器中读取收到的字符*/if(接收环形队列不满)把收到的字节放于环形队列/*恢复CPU的寄存器,即把压栈的寄存器弹出*/*to do:中断返回*/Unsigned8 UartGetChar(void)/*从接收环形队列中接收一个字节,返回收到的字节,如果环形队列中没有字节,那么返回空NULL字符*/Unsigned8 c;c=NULL;/*to do:禁止中断*/if(环形队列不空)c=从环形队列中读取的字节;/*to do:使能中断*/return c;479 异步串行通信-接收v问题:应用程序以独占的方式访问环形队列的过程中,中断禁止,如果应用程序不及时地取出环形队列中的字节,环形队列将被填满,使以后接收到的字节丢失。489 异步串行通信-接收v方法21.应用程序等待信号量SemaUartRx;2.ISR收到一个字节后,得到一个信号量,从串行端口读入字节,把它放到环形队列中;3.ISR释放一个信号量;4.任务收到信号量,读取字节;499 异步串行通信-接收v问题每次中断发生,中断服务程序会使用信号量SemaUartRx,该操作是操作系统提供的系统调用,执行此调用会消耗一定的时间,也就是说,每次接收到一个字符,都要执行此调用,系统的开销比较大。v解决方案当收到一定数量的字符或收到特定的字符后,才发出信号量,以减少开销。509 异步串行通信-发送v方法1:缓冲方式发送519 异步串行通信-发送VOid UartPutChar(Unsigned8 c)/*to do:禁止CPU的中断*/if(发送环形队列不满)把要发送的字符放到环形队列尾部 if(此字符是队列中的第一个字符)使能发送中断;使能CPU的中断;ISR UartCharSend(void)/*发送中断服务例程*/Unsigned8 c;保存处理器的寄存器;if(Uart的发送环形队列不空)c=从环形队列头部取一个字符;把字符输出到Uart的发送端口;else 禁止发送中断;恢复处理器的寄存器;中断返回;529 异步串行通信-发送v方法2:利用RTOS内核 539 异步串行通信-发送v接口函数1.初始化vvoid UartInit(Unsigned8 ch,Unsigned8 baud,Unsigned8 Bits,Unsigned8 parity,Unsigned8 stops);2.发送vvoid UartPutChar(Unsigned8 ch,Unsigned8 c);3.接收vUnsigned8 UartGetChar(Unsigned8 ch,Unsigned8*pStr);4.清除发送环形队列vvoid UartFlushSend(Unsigned8 ch);5.清除接收环形队列 vvoid UartFlushReceive(Unsigned8 ch);54内容v嵌入式系统模型v键盘vLED显示器vLCD显示器v日历时钟v模拟量输入/输出v开关量输入/输出v异步串行通信v其它5510 其它组件模块v音频输入输出音调文件波形文件 v手写输入 信号输入信号识别汉王公司提供汉字识别组件模块56小结v嵌入式系统组件模块的概念v常用嵌入式系统组件实现方法主要接口函数使用方法和范例v实际项目设计中,使用的组件很多,如计算(数据处理等)v软件组件的优点57思考题1.理解软件组件/模块设计方法2.其它外部设备接口的软件组件如何定义/设计58
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!