jiangfuquan999的笔记 https://bbs.21ic.com/?698633 [收藏] [复制] [RSS]

日志

嵌入式系统点滴(转)

已有 924 次阅读2013-10-22 17:02 |个人分类:单片机|系统分类:嵌入式系统| windows, 电子产品, 软件技术, 微处理器, 单片机

序言:嵌入式系统点滴之一



       ——本文写于2006年,现在重新拿出来,个别词汇稍有改动。



      很多人都在从事嵌入式系统的编程工作,遇到了很多的挑战。嵌入式系统的培训变的非常热门,我看到很多地方都有培训班。本人一直从事电子产品的编程工作,现在,把这些年来的经验与体会拿出来和大家分享。目的是希望把实际工作中应该掌握和注意的问题进行一个精要的概括,希望对大家有帮助。



    嵌入式操作系统到底有哪些高深之处呢?



    传统的单片机,其实就是一种嵌入式系统。但是,随着芯片技术的发展,新技术不断涌现,处理器越来越复杂,速度越来越快。既有传统的MCU,又有DSPARMMIPS等多种类型的微处理器,并且出现了双核、四核处理器。软件技术也随着芯片的发展不断发展变化,出现了vxworks, tonado, linux, uclinux, windows CEPALM等操作系统。编程方法也比传统的单片机复杂多了。并且,出现了一个时髦的名词:RTOSReal time Operating
System
实时操作系统)。



       哪些人在做嵌入式系统呢?



      嵌入式系统需要直接对硬件进行直接的操作,需要有一定的硬件基础,单片机程序员可以做嵌入式系统,同时,由于代码量在不断增加,需要编写更多的代码,于是,有很多PC机程序员加入到了嵌入式系统的行列。所以,大家看到,PC机程序的思维方式正在嵌入式系统领域大行其道。



      其实,如果希望事情变得简单,单片机程序员需要熟练掌握模块化的思维方式,PC机程序员需要掌握直接对硬件操作的方法。







嵌入式系统的思维方式:嵌入式系统点滴之二



掌握嵌入式系统的思维方式,必须掌握:



模块化的思想



实时操作系统



图形化程序的思维方式



编译和链接



一些新概念













模块化的思维方式:嵌入式系统点滴之三



一个功能就是一个模块(module)。由一个.c(或者.cpp,.asm等)文件和一个.h(或者.hpp,.inc等)文件构成。  



   模块化的程序非常容易维护。对于一个成熟的模块,只要知道它的接口(interface)就可以了。知道它的输入(inpout),输出(output),便可以轻松调用。  



   程序的结构只能是这样的:先进行初始化(initialize,初始化结束之后进入死循环(loop)。初始化程序是一个模块,在循环中,可以执行很多模块。  



宋体;color:black;mso-themecolor:text1;mso-font-kerning:0pt;mso-no-proof:yes;
text-decoration:none;text-underline:none">


  
  
  
  
  
  
  
  
  
  
  
  






说明: cx1.jpg



    我一直以为程序只有这一种写法,后来偶然见到有人不这样写程序,很是吃惊。后来才终于确认,的确只有这一种写法,其他的写法最终都会被证明是错误的。



    模块的执行的方法大致有三种,顺序执行和并行执行,中断。






说明: cx2.jpg











实时操作:嵌入式系统点滴之四



    所谓实时操作(real time operating,就是把程序执行的时间分成若干片,然后,把不同的进程分配到不同的时间片中去执行。这样,每个正在执行的进程都可以在同一时间进行,所有的事件都可以得到即时的响应。各个时间片的划分,是通过系统的时间中断来完成的。当然,能够进行实时操作的条件是当芯片的执行速度足够快。






说明: rt.jpg



    如果是非常简单的功能,是不需要操作系统和实时操作的。选择用操作系统的目的是,在系统比较复杂、程序量比较大的情况下,利用现成的程序代码,缩短开发周期。  



    程序中的条件和选择,用 if,else if,else,switch,case来表示。当程序出现很多状态的时候,变得尤其复杂,switch case用的比较多。在这种情况下,尤其检验你,是不是真正的模块化思维方式。你不可能把这么大的程序看完,你也不可能搞清楚所有的状态,你要做的是:很快的知道哪些模块是已经没有问题的,然后,集中精力去搞好那些有问题的模块。这是一个挑战,你的思维就必须是模块化的。  



   开发者为了保密的目的,往往会把很多核心代码隐藏了,你只看到一些switch,case,if,else,else,然后,就是一个函数名,函数的内容是隐藏的。只有真正的模块化思维才能把你解救出来,不要为那些看不见的代码而烦恼了,做好自己能够把控得了的那部分吧。







图形化:嵌入式系统点滴之五



  只要鼠标轻轻的点几下,程序就可以自动产生了?这就是图形化。  



    其实,图形化只是模块化的一种表现形式,只要掌握了模块化的思维方式,就很容易掌握图形化。一个个的程序模块好好的放在了那里,在鼠标轻轻点击的时候,把很多模块联系在了一起,构成了程序的框架。  



    图形化程序减少了程序的工作量,让软件工程师有更多的精力去了解整个系统的来龙去脉,为能够在较短的时间内完成更多、更复杂的程序提供了更大的可能性。





编译和链接:嵌入式系统点滴之六



芯片供应商会把程序的编译和链接的方法提供给大家。有兴趣的话,可以看看make(通常是.mak)文件和link(通常是.lnk)文件,如果可以设置,最好让编译系统产生以下两个文件:



·        
.asm文件:可以看到汇编程序代码,在程序的速度要求比较严格的情况下,可以作为参考,优化代码。



·        
.map.lst文件:了解程序代码和变量存放的位置。







一些新概念:嵌入式系统点滴之七



1  Boot loader(系统引导程序)  



    单片机程序,通常存储在 ROMEEPROM或者FLASH中,系统上电复位后从RESET的中断地址开始执行。这就是Normal的启动过程。另外一种启动过程是Boot启动。出现Boot loader是在应用了嵌入式操作系统之后。因为运行任何一个操作系统需要更高的速度,把程序放到RAM中执行速度更快一些,所以,需要在系统上电后,把程序代码复制到RAM中,然后从RAM中开始运行程序代码。Boot loader大多存储在On chip ROM中,是系统复位后,程序开始执行的位置,它只对系统做很少的初始化,然后把程序加载到RAM中,最后,开始运行操作系统。有的程序代码是经过压缩了的,这种情况下Boot loader是要把解压过的程序加载到RAM中。



     不同的芯片,不同的操作系统会有不同的Boot loader.所以在做一个新的系统之前,需要看一些关于系统Boot loader方面的文档。



2  BSPBoard support package



    操作系统不能直接支持硬件,必须通过BSP把操作系统和硬件连接起来。不同的操作系统有不同的BSP。也可以说是硬件驱动程序。



    我看到,有一些产品的程序中,例如BLUETOOTH,也有一个BSP,将BSP和系统的实时操作内核放在了一起,并且打包起来,没有开放BSP部分的代码,只告诉生产厂家这是一个BSP。这种做法,使那些不太了解实时操作的程序员迷惑不解。





小结:  



     软件要适应硬件和应用的发展,不断的发生变化。经常出现一些新名词,虽然在新名词出现的时候,会有一大堆的解释,但还是让人迷惑不解。而源代码又是看不到的。



    的确如此,如果能够同时看到源代码,所有问题就会迎刃而解。而实际上这是不可能的。有一些源代码是被开发商封装隐藏起来的。大家对软件的保密是越来越关注了。  



    其实,这也无关紧要,既然软件是模块化的,你也不需要去理会那些已经成熟的东西,重要的是做好自己的应用。你能在自己能力的范围内做的更好,做出差异化,做出经济效益才是真工夫,才是企业真正的核心竞争力。  



    唯一不变的是一切都在变。别忘了万变不离其宗,只要掌握了模块化思想,和时实操作的技巧,出现任**名词时,都可以通过阅读文档、查看源代码、利用以往的经验、并根据一点点想象迅速的适应它。







掌握底层操作的方法:嵌入式系统点滴之八



掌握底层操作的方法,必须掌握:



·        
接口操作



·        
有效的利用和节约资源







接口操作:嵌入式系统点滴之九



底层操作中最复杂的就是接口了。  



    常见的接口有:并口、串口、ADDAUSBPS2I2CHCIHost Control
Interface
)、RS232VGA(显示器)、DVIS-VIDEOPCIIDE(硬盘)、网线接口(RJ45),电话线接口(RJ11)等。另外,还有一些无线传输方式接口,如BLUETOOTH,红外接口(I2DA)等。接口是数不尽的,不同的行业应用不同的接口。



    简单的接口如并口,串口等,可以借助仿真器和示波器进行调试,在写程序的时候认真看芯片的datasheet,注意控制寄存器的设置方法(如并口的输入输出设置),和参数设置(如串口的波特率)。遇到困难的时候,参考芯片供应商和芯片代理商提供的例子,或者直接咨询。



    比较复杂的接口如USBBLUETOOTH等,传输需要比较复杂的协议,不但要对协议有比较深入的了解,而且还要对程序的结构有深入的认识。这是非常严峻的挑战。



    怎么样才能做好接口呢?



·        
首先,必须对硬件有认识。必须了解软件的操作将控制硬件IO的电压、电流、以及频率、寄存器状态的改变。



·        
要非常熟悉汇编语言。接口操作对时间的要求是非常严格的,要对每条指令的执行时间清清楚楚,才能严格控制接口操作的执行速度。  



·        
对于USBBLUETOOTH等,有比较复杂的协议的接口,不但要懂协议,还要掌握模块化的思维方式,适应大型的复杂程序。



·        
对于需要写PC驱动的接口,还要学习PC驱动程序的各种工具。



·        
有一些接口,传输协议信号的产生,需要一些数**算,还得有点数学基础。  



·        
一定得学好英语,所有关于接口的原始资料,都是用英语写的,你得有良好的英文基础,或者有在做好接口中学好英语的精神,  



    接口虽然复杂,但是当你掌握了调试和测试的工具之后,便有了一个好的开端,接下来,就是用你所有的智慧、不屈不挠的精神、各种收集信息的技巧、和获得帮助的能力,去克服所有的障碍。







有效的节约和利用资源:嵌入式系统点滴之十



  嵌入式系统由于成本、产品体积等因素的限制,资源相对比较紧张,在程序设计的时候,就应该考虑到资源的控制。以下几个方面应该关注:



·        
经常查看map文件(或者list文件),注意程序存储空间(ROM或者FLASHEEPROM等)和变量存储空间(RAM)是如何分配的。



·        
RAM空间比较少的情况下,可以使用全局(global)变量,和位(bit)操作的方法,来节约空间。



·        
在执行速度要求比较严格的情况下,可以使用汇编语言来控制程序的执行速度。



·        
还可以选择好的计算方法来提高程序的执行效率。其中倍受推崇的是查表法。



·        
使用C编译器时,结构变量的存取比使用普通变量占用更多的时间。



·        
使用位(bit)操作占用更多的时间。



·        
存取寄存器比利用普通的RAM空间要快。



·        
使用哈佛结构的芯片(如DSP)时,指令执行的先后次序,影响程序执行的速度。



·        
有些芯片可以寄存器来设置时钟的频率,控制指令周期。



·        
在程序空间紧张的情况下,可以用公用的函数来减少某个模块的代码量。



·        
要不要用操作系统:应用操作系统是为了适应复杂的程序,缩短开发周期。当然,操作系统本身也会占用一定的程序存储空间,变量存储空间,系统时间。所以,对于系统比较简单,开发周期可以控制在较短时间内的软件应用,大可不必追求时髦,不用操作系统系统的效率更高。







结束语:嵌入式系统点滴之十一



   做任何事情,除了掌握思维方式和工作方法之外,更重要的一件事情是:需要大量的实践。正如李阳所说:游泳是游出来的,英语是说出来的。我要说的是:技术,是做出来的。最后提醒大家的是:如果要成为国际水平的工程师,还应该说一口流利的英语。



    嵌入式系统只不过是你所熟悉的小小单片机长大了。内部有一个实时操作(real
time operating
)内核,在不断的切换运行着几个你希望同时运行的程序。这种切换是通过时间中断来实现的。所有的程序都是在初始化(initialize)之后进入死循环(loop)。



    希望大家不要被那些不断出现的崭新名词所吓倒,要不断的适应新形式,解决新问题。万变不离其宗。



    我不屑于去追寻什么通用化,图形化,它只会隐藏那些真正有助于理解程序的代码,把简单的问题复杂化。但是,如果通用化,图形化的工具降临到你的面前,就快些努力去去适应它,当你熟悉它的时候,你很快就会喜欢上它。



    最后,



    热烈庆祝“天宫一号目标飞行器”于北京时间20119292116分于酒泉卫星发射中心发射成功!



    明天是你的生日,祝我们的国家生日快乐!



        嵌入式系统点滴系列到此结束。



        祝大家好运。



            你们的朋友



                  张鲁波


作者博客:


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)