语言嵌入式开发

上传人:新** 文档编号:568590111 上传时间:2024-07-25 格式:PPT 页数:34 大小:106KB
返回 下载 相关 举报
语言嵌入式开发_第1页
第1页 / 共34页
语言嵌入式开发_第2页
第2页 / 共34页
语言嵌入式开发_第3页
第3页 / 共34页
语言嵌入式开发_第4页
第4页 / 共34页
语言嵌入式开发_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《语言嵌入式开发》由会员分享,可在线阅读,更多相关《语言嵌入式开发(34页珍藏版)》请在金锄头文库上搜索。

1、且纶隙针伯羞搔纯躇刑镭锻俱芋款列系劣恰椎端有归呀锋较琅誉君酣溅慷语言嵌入式开发语言嵌入式开发C语言嵌入式开发碳疑勺桐重畸剔棺邑剔铭称缴顿王荧厕续匀寿锥蓬橱汇袜哥炬顽竿炒蜡涧语言嵌入式开发语言嵌入式开发纲要嵌入式C开发背景介绍硬件平台和交叉编译环境软件结构设计内存操作屏幕操作键盘操作性能优化据罚近魏睬轰岛棚磨芥算韧龙溺享名绑秀附贮够桥湖丫膜装萄愚般悄拢梅语言嵌入式开发语言嵌入式开发背景不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力。无疑,汇编语言具备这样的特质。但是,由于汇编语言开发的复杂性,它并不是嵌入式系统开发的一般选择。而与之相

2、比,C语言-一种高级的低级语言,则成为嵌入式系统开发的最佳选择。滩驭医耸元使拦记堤咬十慰豫躺教佛酝戴岸沂祖迅惩晋夺铲缓空镭奠欠此语言嵌入式开发语言嵌入式开发硬件平台 (1) 以通用处理器为中心的协议处理模块,用于网络控制协议的处理;(2) 以数字信号处理器(DSP)为中心的信号处理模块,用于调制、解调和数/模信号转换 灶均蹬亏惹掺佳顾涕狠栏跑痴蒙肠溢逝焦雌须画紧沸滚结稠姿鞭讳抑欲言语言嵌入式开发语言嵌入式开发硬件说明CPU:80186字长是16位,可以寻址到的内存空间为1MBFLASH和RAM几乎是每个嵌入式系统的必备设备,前者用于存储程序,后者则是程序运行时指令及数据的存放位置。系统所选择的

3、FLASH和RAM的位宽都为16位,与CPU一致实时钟芯片可以为系统定时,给出当前的年、月、日及具体时间(小时、分、秒及毫秒),主要作用是提供中断裁决NVRAM(非易失去性RAM)具有掉电不丢失数据的特性,可以用于保存系统的设置信息 UART则完成CPU并行数据传输与RS-232串行数据传输的转换键盘控制器和显示控制器则完成系统人机界面的控制 凭给洱骄胀胶赞磷甲城芝纬结啄欧涌检襟豢吐疥倚甸污换航忧切泞俏傍香语言嵌入式开发语言嵌入式开发交叉编译环境嵌入式系统需要良好的软件开发环境的支持,由于嵌入式系统的目标机资源受限,不可能在其上建立庞大、复杂的开发环境,因而其开发环境和目标运行环境相互分离。嵌

4、入式应用软件的开发方式一般是1.在宿主机(Host)上建立开发环境,2.进行应用程序编码和交叉编译,然后宿主机同目标机(Target)建立连接,3.将应用程序下载到目标机上进行交叉调试,经过调试和优化,4.将应用程序固化到目标机中实际运行 牵知颊箕唁膊饭沧章蹈渍刘癸胶透救鞍摘修间赘掳九蓟铡戚幸听铅椅梗贺语言嵌入式开发语言嵌入式开发软件结构设计模块划分模块划分 多任务还是单任务多任务还是单任务 单任务程序典型架构中断服务程序硬件驱动模块 C的面向对象化 占坦嘛却绰那炊甘创规呀盒桩诵讨拇下曼蛔燕篱沉巴烹卯焊乡扣背豢东靡语言嵌入式开发语言嵌入式开发模块划分硬件驱动模块,一种特定硬件对应一个模块;软件

5、功能模块,其模块的划分应满足低偶合、高内聚的要求 鸭辱戏狄驹鸡棍眯弱白己坤诛摘家慕辉匿谊肮足臃晾揩涕坦歹怪邑嚣互葛语言嵌入式开发语言嵌入式开发硬件驱动模块硬件驱动模块1.中断服务程序ISR2.硬件初始化a.修改寄存器,设置硬件参数(如UART应设置其波特率,AD/DA设备应设置其采样速率等);b.将中断服务程序入口地址写入中断向量表:3.设置CPU针对该硬件的控制线 a.如果控制线可作PIO(可编程I/O)和控制信号用,则设置CPU内部对应寄存器使其作为控制信号; b.设置CPU内部的针对该设备的中断屏蔽位,设置中断方式(电平触发还是边缘触发)。4.提供一系列针对该设备的操作接口函数。例如,对

6、于LCD,其驱动模块应提供绘制像素、画线、绘制矩阵、显示字符点阵等函数;而对于实时钟,其驱动模块则需提供获取时间、设置时间等函数。慌玲箕桅眨凿樱求耽荧挤劫迟拼泥纬勘件八百神镑肄肌井萤山鹰诧青琳苹语言嵌入式开发语言嵌入式开发多任务还是单任务多任务还是单任务 所谓单任务系统是指该系统不能支持多任务并发操作,宏观串行地执行一个任务。而多任务系统则可以宏观并行(微观上可能串行)地同时执行多个任务 单任务用于简单的低端硬件平台,比如哑终端之类的,使用死循环处理任务流程多任务用于较高端的平台,如uclinux,Win ce,Vxworks,使用中断调用处理任务流程雹吾篱曙隅钦勘熔令坑泻概践押拽柱钮盖沏贴大

7、玖监封装耐枢辫心就耘翼语言嵌入式开发语言嵌入式开发单任务程序典型架构单任务程序典型架构1.从CPU复位时的指定地址开始执行;2.跳转至汇编代码startup处执行;3.跳转至用户主程序main执行,在main中完成:a.初试化各硬件设备; b.初始化各软件模块;c.进入死循环(无限循环),调用各模块的处理函数陷傲植辨词砾羽齿萎混葡获八浅蕉版罢七娠碗佃降憨饮讳涕肠辜颈叫丘眶语言嵌入式开发语言嵌入式开发中断服务程序中断服务程序中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序(ISR),类似于_interrup

8、t、#program interrupt等。当一个函数被定义为ISR的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码。 中断服务程序需要满足如下要求:(1)不能返回值;(2)不能向ISR传递参数;(3) ISR应该尽可能的短小精悍;(4) printf(char * lpFormatString,)函数会带来重入和性能问题,不能在ISR中采用。 拎岳磺镑老熟掸区擒咱姆甥己纪亩富咎县兑梭屉沮渴导瞧喳臻静柄啊匆啦语言嵌入式开发语言嵌入式开发C的面向对象化的面向对象化 #ifndef C_Class#define C_Class struct#endifC_Class A

9、C_Class A *A_this; /* this指针 */void (*Foo)(C_Class A *A_this); /* 行为:函数指针 */int a; /* 数据 */int b; 我们可以利用我们可以利用C语言模拟出面向对象的三个特性:封装、继承和多态,语言模拟出面向对象的三个特性:封装、继承和多态,但是更多的时候,我们只是需要将数据与行为封装以解决软件结构混乱但是更多的时候,我们只是需要将数据与行为封装以解决软件结构混乱的问题。的问题。C模拟面向对象思想的目的不在于模拟行为本身,而在于解决模拟面向对象思想的目的不在于模拟行为本身,而在于解决某些情况下使用某些情况下使用C语言编

10、程时程序整体框架结构分散、数据和函数脱节语言编程时程序整体框架结构分散、数据和函数脱节的问题的问题恒姐特亦盎檬溉褪荚崖厢屁缓毡伊定兼石钾魂怀沉惺衍嘲爵坛米豆朗舍修语言嵌入式开发语言嵌入式开发内存操作篇 数据指针函数指针数组vs.动态申请关键字const关键字volatileCPU字长与存储器位宽不一致处理 雌滴巫点攻迟谴吼两斥只粳憨抓恶地可股剂友边蛇大柞白袄痊孙雹灌千排语言嵌入式开发语言嵌入式开发数据指针数据指针 嵌入式编程中需要指针直接操作内存1.某I/O芯片被定位在CPU的存储空间而非I/O空间,而且寄存器对应于某特定地址;2. 两个CPU之间以双端口RAM通信,CPU需要在双端口RAM的

11、特定单元(称为mail box)书写内容以在对方CPU产生中断3.读取在ROM或FLASH的特定单元所烧录的汉字和英文字模。unsigned char *p = (unsigned char *)0xF000FF00;*p=11; 典钡盲等赊茨噪袭乱啪傲硬床岸抄经卷搬劈喘整图却禁氛湘沦孰疡醇宾窖语言嵌入式开发语言嵌入式开发函数指针1.C语言中函数名直接对应于函数生成的指令代码在内存中的地址,因此函数名可以直接赋给指向函数的指针;2.调用函数实际上等同于“调转指令参数传递处理回归位置入栈”,本质上最核心的操作是将函数生成的目标代码的首地址赋给CPU的PC寄存器;3.因为函数调用的本质是跳转到某一

12、个地址单元的code去执行,所以可以调用一个根本就不存在的函数实体 typedef void (*lpFunction) ( ); /* 定义一个无参数、无返回类型的 */* 函数指针类型 */lpFunction lpReset = (lpFunction)0xF000FFF0; /* 定义一个函数指针,指向*/* CPU启动后所执行第一条指令的位置 */lpReset(); /* 调用函数 */积癌溪刃狼喀蓉酋窑庇杰疏洞燕异矗啥佰贩珐占姬纲犯旱窿译份礁罩瑚邵语言嵌入式开发语言嵌入式开发数组数组vs.动态申请动态申请 在嵌入式系统中动态内存申请存在比一般系统编程时更严格的要求,这是因为嵌入式

13、系统的内存空间往往是十分有限的,不经意的内存泄露会很快导致系统的崩溃 所以一定要保证你的malloc和free成对出现 1.尽可能的选用数组,数组不能越界访问;2.如果使用动态申请,则申请后一定要判断是否申请成功了,并且malloc和free应成对出现 抵寇嗅慷诈翟指肾痹郭帛能琳寿律涉孽陷歪寓捉腿鱼国丈番拿伏茶饭标蜗语言嵌入式开发语言嵌入式开发关键字关键字const 1. 关键字const的作用是为给读你代码的人传达非常有用的信息。例如,在函数的形参前添加const关键字意味着这个参数在函数体内不会被修改,属于“输入参数”。在有多个形参的时候,函数的调用者可以凭借参数前是否有const关键字,

14、清晰的辨别哪些是输入参数,哪些是可能的输出参数。2.合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改,这样可以减少bug的出现。僚抱漫堵鹊宙括捂笺胜阂腐天屈眠撞品滋吮鸣猴媒朗泣八湛翠滚扼具莱饮语言嵌入式开发语言嵌入式开发关键字关键字volatilevolatile变量可能用于如下几种情况1.并行设备的硬件寄存器(如:状态寄存器);2.一个中断服务子程序中会访问到的非自动变量(也就是全局变量);3.多线程应用中被几个任务共享的变量。int a,b,c;a = inWord(0x100); /*读取I/O空间0x100端口的内容存入a变量*/b =

15、a;a = inWord (0x100); /*再次读取I/O空间0x100端口的内容存入a变量*/c = a; int a,b,c;a = inWord(0x100); /*读取I/O空间0x100端口的内容存入a变量*/b = a;c = a; 硅凡澈帛稿先摈凸嘿芝瓦筹拽柬蓄摩钟草好渔筷磁疹痈穿理鬼拐死罚崭脚语言嵌入式开发语言嵌入式开发CPU字长与存储器位宽不一致处理字长与存储器位宽不一致处理 ,解决CPU字长与存储器位宽不一致的情况。80186的字长为16,而NVRAM的位宽为8,在这种情况下,我们需要为NVRAM提供读写字节、字的接口 稿料要罪投戍漆颖阀隋楞寻夹著佛席裸返颗竣逞场都座立

16、洋瀑中踊妨掸腆语言嵌入式开发语言嵌入式开发屏幕操作篇 汉字处理系统时间显示动画显示菜单操作晕赴诸弄琳式赦澳搐必翼追团拷创整捣污薯装蝉驭屡防榜圃谤农柠磷炼状语言嵌入式开发语言嵌入式开发汉字处理现在要解决的问题是,嵌入式系统中经常要使用的并非是完整的汉字库,往往只是需要提供数量有限的汉字供必要的显示功能。 不知道日文是否有此情况要显示特定汉字的时候,只需要从数组中查找内码与要求汉字内码相同的即可获得字模。如果前面的汉字在数组中以内码大小顺序排列,那么可以以二分查找法更高效的查找到汉字的字模 列民尼想蔬甚阮埃狞冒镑邱袜吉弗英写妻檄描弗铬支缨喊寻怯友攒搭踞芹语言嵌入式开发语言嵌入式开发定义宏:# de

17、fine EX_FONT_CHAR(value) # define EX_FONT_UNICODE_VAL(value) (value),# define EX_FONT_ANSI_VAL(value) (value),定义结构体:typedef struct _wide_unicode_font16x16 WORD value; /* 内码 */BYTE data32; /* 字模点阵 */Unicode;#define CHINESE_CHAR_NUM /* 汉字数量 */字模的存储用数组:Unicode chineseCHINESE_CHAR_NUM =EX_FONT_CHAR(业)EX

18、_FONT_UNICODE_VAL(0x4e1a)0x04, 0x40, 0x04, 0x40, 0x04, 0x40, 0x04, 0x44, 0x44, 0x46, 0x24, 0x4c, 0x24, 0x48, 0x14, 0x50, 0x1c, 0x50, 0x14, 0x60, 0x04, 0x40, 0x04, 0x40, 0x04, 0x44, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00,EX_FONT_CHAR(中)EX_FONT_UNICODE_VAL(0x4e2d)0x01, 0x00, 0x01, 0x00, 0x21, 0x08, 0x3f,

19、0xfc, 0x21, 0x08, 0x21, 0x08, 0x21, 0x08, 0x21, 0x08, 0x21, 0x08, 0x3f, 0xf8, 0x21, 0x08, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,EX_FONT_CHAR(云)EX_FONT_UNICODE_VAL(0x4e91)0x00, 0x00, 0x00, 0x30, 0x3f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xfe, 0x03, 0x00, 0x07, 0x00, 0

20、x06, 0x40, 0x0c, 0x20, 0x18, 0x10, 0x31, 0xf8, 0x7f, 0x0c, 0x20, 0x08, 0x00, 0x00,EX_FONT_CHAR(件)EX_FONT_UNICODE_VAL(0x4ef6)0x10, 0x40, 0x1a, 0x40, 0x13, 0x40, 0x32, 0x40, 0x23, 0xfc, 0x64, 0x40, 0xa4, 0x40, 0x28, 0x40, 0x2f, 0xfe, 0x20, 0x40, 0x20, 0x40, 0x20, 0x40, 0x20, 0x40, 0x20, 0x40, 0x20, 0x

21、40, 0x20, 0x40羡称毫改缅怔提余细靴镐粱渐桶斑坑伦戳滋续仗蜀趋械退爆矣捆缝驳圈绢语言嵌入式开发语言嵌入式开发系统时间显示系统时间显示注意刷新问题,没有必要每秒刷新一次分钟和小时的显示角铆圃私刘寸沧饲挂勒珊树鼎侗镭襟绸谋吝食五墅赁摆催拽伸阀椭盅啃玉语言嵌入式开发语言嵌入式开发动画显示动画显示 充分利用定时器注意刷新问题欠食惭种业霄倾眯苍茬雀讣仕硫水懈秧坎阻咆饲干盎拢蔡吗镰嚎奥袍勃益语言嵌入式开发语言嵌入式开发菜单操作菜单操作 * 将菜单的属性和操作封装在一起 */typedef struct tagSysMenuchar *text; /* 菜单的文本 */BYTE xPos; /*

22、 菜单在LCD上的x坐标 */BYTE yPos; /* 菜单在LCD上的y坐标 */void (*onOkFun)(); /* 在该菜单上按下ok键的处理函数指针 */void (*onCancelFun)(); /* 在该菜单上按下cancel键的处理函数指针 */SysMenu, *LPSysMenu; 利用了面向对象中的封装思想,就让程序结构清晰,其结果是几乎可以在无需修改程序的情况下在系统中添加更多的菜单,而系统的按键处理函数保持不变。涝碴浇母拔渤彪慌灼蟹他秀痞份瑚呢磐八羔髓执漾拨坏帛赊卉菜吐负凋吱语言嵌入式开发语言嵌入式开发键盘操作篇 处理功能键处理数字键处理用户输入 处理触摸屏赦

23、肚漳碳搀批憎下弗还膳詹踢粹科皖葬凌戈儡岛卯乐坟锭颗斟欠锡撕孩赃语言嵌入式开发语言嵌入式开发性能优化篇 使用宏定义使用寄存器变量内嵌汇编利用硬件特性活用位操作 悸琅曲腾寅扦截耪必垒惊娥甭基稼校赦务缝示念钓腑肩堂胚摹撼缸蕉疏几语言嵌入式开发语言嵌入式开发使用宏定义使用宏定义在C语言中,宏是产生内嵌代码的唯一方法。对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。 1.宏定义“像”函数;2.宏定义不是函数,因而需要括上所有“参数”;3.宏定义可能产生副作用。因而不要给宏定义传入有副作用的参数。 滞首物都胎煌打尚销片或祸乐万氯扫硅字楞露卓崭阶今啼帽火汐锋冻唇呀语言嵌入式开发语言嵌入

24、式开发使用寄存器变量使用寄存器变量 当对一个变量频繁被读写时,需要反复访问内存,从而花费大量的存取时间。为此,C语言提供了一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,从而提高效率。寄存器变量的说明符是register。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量,而循环计数是应用寄存器变量的最好候选者。(1) 只有局部自动变量和形参才可以定义为寄存器变量。因为寄存器变量属于动态存储方式,凡需要采用静态存储方式的量都不能定义为寄存器变量,包括:模块间全局变量、模块内全局变量、局部static变量;(2) re

25、gister是一个建议型关键字,意指程序建议该变量放在寄存器中,但最终该变量可能因为条件不满足并未成为寄存器变量,而是被放在了存储器中,但编译器中并不报错(在C+语言中有另一个建议型关键字:inline)。来姑婴厂牧爹栅骑跪电账吓煮肋殴瘁能循近邹热塌恬懂犊指订军琉馈热欧语言嵌入式开发语言嵌入式开发内嵌汇编内嵌汇编 程序中对时间要求苛刻的部分可以用内嵌汇编来重写,以带来速度上的显著提高。但是,开发和测试汇编代码是一件辛苦的工作,它将花费更长的时间,因而要慎重选择要用汇编的部分。在程序中,存在一个80-20原则,即20%的程序消耗了80%的运行时间,因而我们要改进效率,最主要是考虑改进那20%的代

26、码。 顾两干煤铀葱晤双袒玫简娜候绦泣吵由凸莉真厌俱竹焚督伎战章闸绷听眺语言嵌入式开发语言嵌入式开发利用硬件特性利用硬件特性CPU对各种存储器的访问速度,基本上是:CPU内部RAM外部同步RAM外部异步RAMFLASH/ROM 1.对于程序代码,已经被烧录在FLASH或ROM中,我们可以让CPU直接从其中读取代码执行,但通常这不是一个好办法,我们最好在系统启动后将FLASH或ROM中的目标代码拷贝入RAM中后再执行以提高取指令速度;2.对于UART等设备,其内部有一定容量的接收BUFFER,我们应尽量在BUFFER被占满后再向CPU提出中断。例如计算机终端在向目标机通过RS-232传递数据时,不

27、宜设置UART只接收到一个BYTE就向CPU提中断,从而无谓浪费中断处理时间;3.如果对某设备能采取DMA方式读取,就采用DMA读取,DMA读取方式在读取目标中包含的存储信息较大时效率较高,其数据传输的基本单位是块,而所传输的数据是从设备直接送入内存的(或者相反)。DMA方式较之中断驱动方式,减少了CPU 对外设的干预,进一步提高了CPU与外设的并行操作程度。盔攘橙孙剧口捻缕湿焦淑贺妹寂沿梆兹饯柜溺韧装钥熏栖售适观剩彦唇卒语言嵌入式开发语言嵌入式开发活用位操作活用位操作 使用C语言的位操作可以减少除法和取模的运算。在计算机程序中数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作,因而,灵活的位操作可以有效地提高程序运行的效率。举例如下 * 方法1 */int i,j;i = 879 / 16;j = 562 % 32; /* 方法2 */int i,j;i = 879 4;j = 562 - (562 5 5); 陀骚萌俄秦食惟拾某殉云酚枫康瓣山碌聊碎僧民抱膝艺踞个渺蚜姜议冰许语言嵌入式开发语言嵌入式开发且纶隙针伯羞搔纯躇刑镭锻俱芋款列系劣恰椎端有归呀锋较琅誉君酣溅慷语言嵌入式开发语言嵌入式开发嵌入式开发的核心就是利用最少的资源最高效地实现所需功能谢谢大家!章驼驶络培抬粳童翼揖奇堰惊辟泽从钡瞪冀鸳柑倦酬椎藉缘诚勾纽氛候堰语言嵌入式开发语言嵌入式开发

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号