嵌入式系统组件课件_第1页
嵌入式系统组件课件_第2页
嵌入式系统组件课件_第3页
嵌入式系统组件课件_第4页
嵌入式系统组件课件_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统原理、设计与应用7嵌入式操作系统1内容?????????嵌入式系统模型键盘LED显示器LCD显示器日历时钟模拟量输入/输出开关量输入/输出异步串行通信其它2概述-组件技术的优越性1.提高开发的效率?开发嵌入式系统的软件时,通常一些软件模块如UART的收发器模块在大多数的产品中都需要使用,通过把这些模块封装成组件,后续的开发继续使用,显然可以提高开发的效率。新开发的软件模块都需要进行测试,包括实验室测试和公开测试,这些测试都需要时间。使用组件化的方法,可以使用以前被测试过的组件代码,可以大大提高软件的可靠性。软件组件的设计尽量采用标准的接口,如果没有标准,可以自己定义完备的接口,便于后续系统的开发时使用。例如液晶显示模块,设计成彩色的功能接口比设计成黑白的有许多优点,彩色可以兼容黑白。通常一个嵌入式系统的软件由许多模块组成,这些模块包括设备驱动模块、算法模块等。良好的组件化设计方法,可以把任务均分,并行开发,提高开发效率。32.提高开发的可靠性?3.提高软件的可移植性?4.适合于并行开发?1例:嵌入式系统模型??????????嵌入式处理器UART串行通信收发器键盘液晶显示器模拟量输入接口模拟量输出接口数字量输入接口数字量输出接口数码管显示器日历时钟4原型系统memoryAILCDAOEMCUUARTDI/DOkeyboardOthers5模型系统的软件组成模块化设计原则主程序?I/O驱动程序-软件组件?6内容?????????嵌入式系统模型键盘LED显示器LCD显示器日历时钟模拟量输入/输出开关量输入/输出异步串行通信其它72键盘+5V输出端口8输入端口2键盘应用程序接口KeyDownTimerKeyPressKeyTime()KEY_SCAN_DLY键盘矩阵KeyInitKey()KeyScanKey()KeyInitPort()KeySelRow()KeyGetCol()键盘驱动程序硬件提交KeyGetKeyCode()等待信号量超时KeyBuf[]KeyBufOutIxKeyClear()KeyNReadKeyHitKey()KeyBufInIx92键盘?主要接口函数?KeyClear():清除键盘缓冲区?KeyGetKeyCode():读取一个键码?KeyHitKey():检查一个键是否按下?KeyInitKey():初始化键盘模块102键盘?键盘组件的使用voidmain(void){…OSInit();/*操作系统初始化*/…KeyInitKey();/*键盘模块组件初始化*/…OSStart();/*开始多任务运行*/}11?任务中使用键盘组件模块2键盘voidUserTask(void*data){Integer8keycode;Data=data;while(1){keycode=KeyGetKeyCode(0);/*等待用户键盘输入*/Switch(keycode)/*根据键的扫描码进行相应的处理*/{……}}12}内容?????????嵌入式系统模型键盘LED显示器LCD显示器日历时钟模拟量输入/输出开关量输入/输出异步串行通信其它133LED显示器?利用I/O端口控制LED显示器+5V微处理器输出端口B7B6B5B0当输出为低时LED为ON143LED显示器?多路复用LED显示B7B6B5B4B3B2B1B01时此段为ONDigit#1abcdefgd.p.离散LEDDigit#2Digit#3Digit#n-1Digit#n段(输出端口)电阻数字(输出端口)B7B6B5B4B3B2B1B01时此数字为ON153LED显示器?组件内部实现(软件组件的数据结构设计)?(1)系统使用7段LED数码管显示器;?(2)每个LED数码管有一个编号作为地址,编号从0开始;?(3)对应于每一个数码管,使用3个字节作为显示缓冲区,其中第一个存放它的字符代码,为了未来的扩展,字符代码使用ASCII码,虽然目前大多数应用的LED只显示16个16进制字符和部用户定义的图形;第二个存放颜色;第三个存放闪烁属性。?(4)需要为LED的显示模块预留一个定时器(硬件定时器或软件定时器),用于显示的刷新。163LED显示器API_LED?组件内部实现

接口函数

定时器

显示缓冲区

驱动代码

显示字模

173LED显示器?接口函数?LedInit();初始化内部数据结构?LedClear();清除内部缓冲区?LedDispChar(Unsigned16position,Unsigned8c,Unsigned8color,Unsignedblink);显示字符?LedOff():关闭显示?LedOn():打开显示183LED显示器?组件的实现?Leddef.h?定义组件模块的数据结构和配置?led.c?实现LED组件的所有函数19内容?????????嵌入式系统模型键盘LED显示器LCD显示器日历时钟模拟量输入/输出开关量输入/输出异步串行通信其它204LCD显示器1.2.3.LCD显示器被广泛地使用于个人设备中,应用范围还在不断扩大。LCD是一种被动显示技术,它本身不发光,利用反射光显示字符和图形。LCD的功耗非常低,于是在低功耗的场合特别是电池供电的嵌入式设备上得到了广泛的应用。通常LCD使用自然光,反射自然光进行显示,如果周围的光很少或没有光,那么需要在LCD的后面放置一个光源,这个光源叫做背光。背光可以通过场致发光(EL)或LED来实现,EL背光非常微弱,它产生一个非常均匀的光源。用于LED的光源颜色很多,常用白光。EL背光电流很低,但是需要较高的电压,通常在20V以上。EL背光的使用期限有限,通常在2000~3000小时。LED背光的使用寿命很长,但是耗电较多。通常LED背光嵌在LCD的后面,有很多种颜色可以选择。214LCD显示器?LCD显示系统嵌入式处理器LCD控制器LCD驱动器LCD?分类(3类)?字符LCD显示-与LED基本相同;?图形LCD显示器-点阵;?定制LCD显示器-为用户特殊定制-电子台历224LCD显示器?LCD显示系统组件实现显存LCD控制寄存器LCD234LCD显示器?接口函数的实现?点阵显示器的种类?黑白?灰度?彩色?方案?为每一种LCD定义接口函数,?优点:裁减性好,?缺点:应用软件的开发需要考虑移植?定义一种接口函数,支持三种LCD?缺点:裁减性不好?优点:应用软件的开发基本不需要考虑移植性问题244LCD显示器?接口函数的实现-定义一种接口函数,支持三种LCD1.2.3.4.LCD初始化:Unsigned8LcdInit(struct*LcInitPara)关闭和打开显示voidLcdOff(),voidLcdOn()5.6.7.清除LCD显示屏:voidLcdClear()显示字符串:voidLcdDispStr(Unsigned16row,Unsigned16col,Unsigned8*pStr,Unsigned32color,Unsigned8font,Unsigned8size);显示象素点:voidLcdPixel(Unsigned16row,Unsigned16col,Unsigned32color);画线:voidLcdLine(Unsigned16x1,Unsigned16y1,Unsigned16x2,Unsigned16y2,Unsigned8Linetype,Unsigned32color);画矩形:LcdRectangle(Unsigned16x1,Unsigned16y1,Unsigned16x2,Unsigned16y2,Unsigned8type,Unsigned32color,Unsigned8fill,Unsigned32fillcolor);8.画弧型:LcdArc(Unsigned16x,Unsignedy,Unsigned16radium,Unsigned16angel1,Unsigned16Unsigned32color,Unsigned8type);25angel2,内容?????????嵌入式系统模型键盘LED显示器LCD显示器日历时钟模拟量输入/输出开关量输入/输出异步串行通信其它265日历时钟概述?实现方法??专用日历时钟芯片?时钟芯片、电池、32768时钟晶体?软件实现275日历时钟?实现原理285日历时钟?接口函数1.ClockInit(),-时钟组件初始化2.ClockSetDate(),-设置日期3.ClockSetTime(),-设置时间4.ClockSetDateTime(),-设置日期和时间5.ClockGetDate(),-读取日期6.ClockGetTime(),-读取时间7.ClockGetDateTime(),-读取日期时间8.ClockFormatDate()。-格式化日期29内容?????????嵌入式系统模型键盘LED显示器LCD显示器日历时钟模拟量输入/输出开关量输入/输出异步串行通信其它306模拟量输入?模拟输入硬件结构模拟输入信道物理参数传感器放大器滤波器信道选择多路复用器从/到微处理器ADC316模拟量输入?读取A/D值的方法1-慢速的A/D转换器件?(1)选择需要进行模数转模拟换的通道;输入?(2)触发进行模数转换?(3)延迟一段时间,延迟的时间大于或等于模数转换的时间加上信号在模数转换器保持稳定的时间?(4)读取模数转换的值?(5)把读取的值提交给应用程序MUX12ADC4驱动程序5应用程序31234驱动程序选择要读的模拟输入触发ADC进行转换驱动程序延时超过转换时间ADC读5模拟输入的二进制值返回到应用程序326模拟量输入Unsigned16AnalogInput(Unsigned8channel){/*todo:操作模拟多路开关,选择模数转换的通道*/…/*延时,等待模拟信号在模数转换器的输入端稳定*/…/*启动模数转换*/…/*延时,等待模数转换的结束*/…/*读取模数转换的结果把返回给调用者*/…}336模拟量输入?方法2:利用模数转换器的结束信号来通知用户-中断方式voidIsrAD(){/*发出SemaAD(模数转换结束信号)*/}Unsigned16AnalogInput(Unsigned8channel){/*选择要读取的输入通道*//*延时,等待模拟多路开关输入信号的稳定*//*启动模数转换*//*等待信号量SemaADor超时*/if(超时){/*模数转换出错处理;*/}else{/*读取转换的结果并返回调用者*/}}346模拟量输入?方法3:A/D转换的速度比较快-直接在程序中读取Unsigned16AnalogInput(Unsigned8channel){/*选择模拟输入通道*//*延时,等待模拟信号在模数转换器的输入端稳定*//*启动模数转换工作*//*检测是否转换完成,如果完成则读取转换结果*/…/*把转换的结果返回给调用程序*/}356模拟量输入?关于移植性的考虑?组件化方法把A/D转换的细节隐藏在组件的内部。?关于A/D的精度:目前的模拟转换器的精度有8位、10位、14位等,甚至有20位、24位或更高。?为了将来技术的发展,可以把转换结果表示成32位,在一定的时期内足够用了,对于小于32位的模数转换器,低位表示转换的结果,高位用0填充,最高位可以作为符号位。367模拟量输出AnalogOutputChannel?D/A的环节?数模转来自微处理器DAC滤波器放大器传感器物理参数换器?滤波器?放大器?执行器/驱动器来自微处理器DAC滤波器放大器传感器物理参数来自微处理器DAC滤波器放大器传感器37物理参数7模拟量输出?主要接口函数?voidAnalogOutput(Unsigned8channel,Unsigned32value);387模拟量输出?使用例子voidUserTask(){Unsigned32temp;/*数据来源和处理,得到数据temp*/AnalogOutput(0,temp);/*此时电压表的指针指示相应的模拟量*/…}FSV=2.5VVI转换器(42μA/V)0o-50o仪表+300o温度-50oF~300oF换算函数cnts8位DACcnts*FSV2560~100μA39内容?????????嵌入式系统模型键盘LED显示器LCD显示器日历时钟模拟量输入/输出开关量输入/输出异步串行通信其它408开关量输入/输出

压力开关

温度开关

限制开关

继电器触点

邻近探测器

控制

/

监视

系统

418开关量输入/输出???开关量通常是1位计算机处理的数据以字节为单位接口函数的实现方法1.直接以字节为单位处理开关量?voidIOWrite(Unsignedaddress,Unsigned8value);?Unsigned8IORead(Unsignedaddress)2.包装以位为单位处理开关量?Unsigned8SwitchRead(Unsigned16channel);?voidUnsigned8SwitchWrite(Unsigned16channel,42Unsigned8On_Off);8开关量输入/输出-实现方式比较?方式(1)-字节?优点?程序的代码量小,执行的速度快,?缺点?程序设计的不直观,程序的移植性不好。?方式(2)-位?优点?可移植性好,把开关进行了抽象化,屏蔽了开关量操作的细节;?程序的可读性好?缺点?程序的代码量比较大,程序的执行时间稍长。?由于现代处理器的速度提高和存储器的空间比较大,方式(2)带来的问题可以完全克服。438开关量输入/输出-实现方式比较voidUserTask(){…if(SwitchRead(10))==ON)SwitchWrite(20,ON);elseSwitchWrite(20,OFF);…}44内容?????????嵌入式系统模型键盘LED显示器LCD显示器日历时钟模拟量输入/输出开关量输入/输出异步串行通信其它459异步串行通信?接收方法1环形缓冲区RxISR应用程序469异步串行通信-接收ISRIsrUartRx(void)/*接收中断服务例程*/{Unsigned8c;/*保存CPU的寄存器,即把ISR中使用的寄存器压栈*//*从通信控制器中读取收到的字符*/if(接收环形队列不满)把收到的字节放于环形队列/*恢复CPU的寄存器,即把压栈的寄存器弹出*/…/*todo:中断返回*/…}Unsigned8UartGetChar(void)/*从接收环形队列中接收一个字节,返回收到的字节,如果环形队列中没有字节,那么返回空NULL字符*/{Unsigned8c;c=NULL;/*todo:禁止中断*/…if(环形队列不空)c=从环形队列中读取的字节;/*todo:使能中断*/returnc;}479异步串行通信-接收?问题:应用程序以独占的方式访问环形队列的过程中,中断禁止,如果应用程序不及时地取出环形队列中的字节,环形队列将被填满,使以后接收到的字节丢失。RxISR环形缓冲区应用程序489异步串行通信-接收?方法2?1.应用程序等待信号量SemaUartRx;?2.ISR收到一个字节后,得到一个信号量,从串行端口读入字节,把它放到环形队列中;?3.ISR释放一个信号量;?4.任务收到信号量,读取字节;RxISR环形缓冲区应用程序超时SemaUartRx499异步串行通信-接收?问题?每次中断发生,中断服务程序会使用信号量SemaUartRx,该操作是操作系统提供的系统调用,执行此调用会消耗一定的时间,也就是说,每次接收到一个字符,都要执行此调用,系统的开销比较大。?解决方案?当收到一定数量的字符或收到特定的字符后,才发出信号量,以减少开销。509异步串行通信-发送?方法1:缓冲方式发送应用程序环形缓冲区ISRTx519异步串行通信-发送VOidUartPutChar(Unsigned8c){/*todo:禁止CPU的中断*/if(发送环形队列不满){把要发送的字符放到环形队列尾部if(此字符是队列中的第一个字符){使能

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论