嵌入式系统的知识体系学习误区及学习建议.docx
- 文档编号:11901122
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:13
- 大小:25.37KB
嵌入式系统的知识体系学习误区及学习建议.docx
《嵌入式系统的知识体系学习误区及学习建议.docx》由会员分享,可在线阅读,更多相关《嵌入式系统的知识体系学习误区及学习建议.docx(13页珍藏版)》请在冰点文库上搜索。
嵌入式系统的知识体系学习误区及学习建议
嵌入式系统的知识体系、学习误区及学习建议
(XX大学王宜怀)
1嵌入式系统的知识体系
嵌入式系统的应用X围可以粗略分为两大类:
(1)电子系统的智能化(工业控制,现代农业、家用电器、汽车电子、测控系统、数据采集等等);
(2)计算机应用的延伸(MP3、手机、通信、网络、计算机外围设备等)。
从这些应用可以看出,要完成一个以MCU为核心的嵌入式系统应用产品设计,需要有硬件、软件及行业领域相关知识。
硬件主要有MCU的硬件最小系统、输入/输出外围电路、人机接口设计。
软件设计有固化软件的设计,也可能含PC机软件的设计。
行业知识需要通过协作、交流与总结获得。
概括地说,学习以MCU为核心的嵌入式系统,需要以下软件硬件基础知识与实践训练:
(1)硬件最小系统(包括电源、晶振、复位、写入调试接口);
(2)通用I/O(开关量输入/输出,涉及各种二值量检测与控制);
(3)模数转换A/D(各种传感器信号的采集与处理,如红外、温度、光敏、超声波、方向等等);
(4)数模转换D/A(对模拟量设备利用数字进行控制);
(5)通信(串行通信接口SCI、串行外设接口SPI、集成电路互联总线I2C,CAN、USB、嵌入式以太网、ZigBee技术等);
(6)显示(LED、LCD等等);
(7)控制(控制各种设备,包含PWM等控制技术);
(8)数据处理(图形、图像、语音、视频等处理或识别);
(9)各种具体应用。
事实上,万变不离其宗,任何应用都可以归入这几类。
而应用中的硬件设计、软件设计、测试等都必须遵循嵌入式软件工程的方法、原理与基本原则。
所以,嵌入式软件工程也是嵌入式系统知识体系的有机组成部分,只不过,它融于具体项目的开发过程之中。
以上实践训练涉及硬件基础、软件基础及相关领域知识。
计算机语言、操作系统、开发环境等均是完成这些目的的工具。
有些初学者,容易把工具的使用与所要达到的真正目的相混淆。
例如,有的学习者,学了很长时间的嵌入式操作系统移植,而不进行实际嵌入式系统产品的开发,到了最后,做不好一个嵌入式系统小产品,偏离了学习目标,甚至放弃了嵌入式系统领域。
这就是进入了嵌入式系统学习误区的情况,下面对此做一些分析。
2嵌入式系统的学习误区
关于嵌入式系统的学习方法,因学习经历、学习环境、学习目的、已有的知识基础等不同,可能在学习顺序、内容选择、实践方式等方面有所不同。
但是,应该明确哪些是必备的基础知识,哪些应该先学,哪些应该后学,哪些必须通过实践才能获得的,哪些是与具体芯片无关的通用知识,哪些是与具体芯片或开发环境相关的知识。
由于微处理器与微控制器种类繁多,也可能由于不同公司、不同机构出于自身的利益,给出一些误导性宣传,特别是我国嵌入式微控制器制造技术的落后及其他相关情况,使得人们对微控制器的发展,在认识与理解上存在差异。
导致一些初学者,进入了嵌入式系统的学习误区,浪费了宝贵的学习时间。
下面分析初学者可能存在的几个误区。
2.1 嵌入式系统学习误区1-操作系统的困惑
如果说,学习嵌入式系统不是为了开发其应用产品,那就没有具体目标了,许多诸如学习方法问题也就不必谈了。
实际上,这正是许多人想学,又不知从何开始学习的关键问题所在,不知道自己学习的具体目标。
于是,看了一些培训广告,看了书店中书架上种类繁多的嵌入式系统的书籍,或上网以“嵌入式系统”为关键词进行查询,然后参加培训或看书,开始“学习起来”。
对于有计算机阅历的人,往往选择一个嵌入式操作系统就开始学习了。
不好听的比喻,有点象“瞎子摸大象”,只了解其一个侧面。
这样如何能对嵌入式产品的开发过程有个全面了解呢?
针对许多初学者选择“xxx嵌入式操作系统+xxx处理器”的嵌入式系统入门学习模式,我认为是不合适的。
我的建议是:
首先把嵌入式系统软件与硬件基础打好了,再根据实际需要,选择一种实时操作系统(RTOS)进行学习实践。
要记住:
RTOS是开发某些类嵌入式产品的辅助工具,是手段,不是目的。
许多类嵌入式产品,并不需要RTOS。
所以,一开始就学习RTOS,并不符合学习“由浅入深、循序渐进”的学习规律。
RTOS本身由于种类繁多,实际使用何种RTOS,一般需要工作单位确定。
基础阶段主要学习RTOS的基本原理与在RTOS之上的软件开发方法,而不是学习如何设计RTOS。
以开发实际嵌入式产品为目标的学习者,不要把过多的精力花在设计或移植RTOS上面。
正如很多人使用Windows操作系统,而设计Windows操作系统只有Microsoft。
许多人“研究”Linux,但不使用它,浪费时间了,人的精力是有限的,学习必须有所选择。
2.2嵌入式系统学习误区2-硬件与软件的困惑
以MCU为核心的嵌入式技术的知识体系必须通过具体的MCU来体现、实践与训练。
但是,选择任何型号的MCU,其芯片相关的知识只占知识体系的20%,80%是通用知识。
但是80%的通用知识,必须通过具体实践才能进行,所以学习嵌入式技术要选择一个系列的MCU。
但不论如何,系统含有硬件与软件两大部分,它们之间的关系如何?
有些学者,仅从电子角度认识嵌入式系统。
认为“嵌入式系统=MCU硬件系统+小程序”。
这些学者,大多学习背景是具有良好的电子技术基础知识。
实际情况是,早期MCU内部RAM小、程序存储器外接,需要外扩各种I/O,没有象现在这样USB、嵌入式以太网等较复杂的接口,因此,程序占总设计量小于50%,使人们认为嵌入式系统(单片机)是“电子系统”,以硬件为主、程序为辅。
但是,随着MCU制造技术的发展,不仅MCU内部RAM越来越大,Flash进入MCU内部改变了传统的嵌入式系统开发与调试方式,固件程序可以被更方便地调试与在线升级,许多情况与开发PC机程序方便程度相差无几,只不过开发环境与运行环境不是同一载体而已。
这些情况使得嵌入式系统的软件硬件设计方法发生了根本变化。
有些学者,仅从软件开发角度认识嵌入式系统,甚至有的仅从嵌入式操作系统认识嵌入式系统。
这些学者,大多具有良好的计算机软件开发基础知识,认为硬件是生产厂商的事,没有认识到,嵌入式系统产品的软件与硬件均是需要开发者设计的。
我常常接到一些关于嵌入式产品稳定性的咨询,发现大多数是由于软件开发者对底层硬件的基本原理不理解造成的。
特别是,有些功能软件开发者,过分依赖于底层硬件的驱动软件设计完美,自己对底层驱动原理知之甚少。
实际上,一些功能软件开发者,名义上再做嵌入式软件,实际上,仅仅使用嵌入式编辑、编译环境而已,本质与开发通用PC机软件没有两样。
而底层硬件驱动软件的开发,若不全面考虑高层功能软件对底层硬件的可能调用,也会使得封装或参数设计得不合理或不完备,导致高层功能软件的调用困难。
从这段描述可以看出,若把一个嵌入式系统的开发孤立地分为硬件设计、底层硬件驱动软件设计、高层功能软件设计,一旦出现了问题,就可能难以定位。
实际上,嵌入式系统设计是一个软件、硬件协同设计工程,不能象通用计算机那样,软件、硬件完全分开来看,要在一个大的框架内协调工作。
面对学习嵌入式系统以软件为主还是以硬件为主,或是如何选择切入点,如何在软件与硬件之间取得一些平衡。
对于这个困惑的建议是:
要想成为一名真正的嵌入式系统设计师,在初学阶段,必须重视打好嵌入式系统的硬件与软件基础。
以下是从事嵌入式系统设计二十多年的一个美国学者JohnCatsoulis在《DesigningEmbeddedHardware》一书中关于这个问题的总结:
嵌入式系统与硬件紧密相关,是软件与硬件的综合体,没有对硬件的理解就不可能写好嵌入式软件,同样没有对软件的理解也不可能设计好嵌入式硬件。
2.3嵌入式系统学习误区3-片面认识嵌入式系统
嵌入式系统产品种类繁多,应用领域各异。
在2.1小节中,我们把嵌入式系统的应用X围粗略分为电子系统的智能化与计算机应用的延伸两大类,从初学者角度,可能有分别从这两个角度片面认识嵌入式系统的问题。
因此,一些从电子系统智能化角度认识嵌入式系统的学习者,可能会忽视编程结构、编程规X、软件工程的要求、操作系统等知识的积累。
另一些从计算机应用的延伸角度认识嵌入式系统的学习者,可能会把通用计算机学习过程中的概念与方法生搬硬套到嵌入式系统的实践中,忽视嵌入式系统与通用计算机的差异。
实际上,在嵌入式系统学习与实践的初始阶段,应该充分了解嵌入式系统的特点,根据自身的已有知识结构,制定适合自身情况的学习计划。
目标应该是打好嵌入式系统的硬件与软件基础,通过实践,为成为良好的嵌入式系统设计师建立起基本知识结构。
学习过程,可以通过具体应用系统为实践载体,但不能拘泥于具体系统,应该有一定的抽象与归纳。
例如,有的初学者开发一个实际控制系统,没有使用实时操作系统,但不要认为实时操作系统不需要学习。
又例如,有的初学者以一个带有实时操作系统的样例为蓝本进行学习,但不要认为,任何嵌入式系统都需要使用实时操作系统,甚至把一个十分简明的实际系统加上一个不必要的实时操作系统。
因此,片面认识嵌入式系统,可能导致学习困惑。
应该根据实际项目需要,锻炼自己分析实际问题、解决问题的能力。
这是一个比较长期的学习与实践过程,不能期望通过短期培训完成整体知识体系的建立,应该重视自身实践,全面地理解嵌入式系统的知识体系。
2.4嵌入式系统学习误区4-入门芯片选择的困惑
嵌入式系统的大部分初学者需要选择一个微控制器(MCU)进行入门级学习,面对众多厂家生产的微控制器系列,不知如何是好。
首先是关于位数问题,目前主要有8位、16位、32位,面对嵌入式系统应用的多样性,不同位数的MCU各有应用领域,这一点与通用微机有很大不同。
你做一个遥控器,不需要使用一个32位MCU,可能一个MCU芯片价格已经超过遥控器价格需求。
对于首次接触嵌入式系统的学习者,可以根据自己的知识基础选择入门芯片的位数。
建议大多数初学者,可以选择一个8位MCU作为快速入门芯片,了解一些汇编与底层硬件知识,之后再选一个16位或32位芯片进行学习实践。
关于芯片选择的另一个误区,认为有“主流芯片”存在,嵌入式系统也可以形成芯片垄断。
这完全是一种误解,是套用通用计算机系统的思维模式,而忽视了嵌入式系统应用的多样性。
关于学习芯片选择还有一个误区,是系统的工作频率。
误认为选择工作频率高的芯片进行入门学习,表示更先进。
实际上,工作频率高可能给初学者带来学习过程中的不少困难。
实际嵌入式系统设计不是追求芯片位数、工作频率、操作系统等因素,而是追求稳定可靠、维护、升级、功耗、价格等指标。
而初学者选择入门芯片,是通过某一MCU作为蓝本获得嵌入式系统知识体系的通用基础,其基本原则是:
入门时间较快、硬件成本较少,知识要素较多,学习难度较低。
3基础阶段的学习建议
基于以上讨论,下面对广大渴望学习嵌入式系统的学子提出几点基础阶段的学习建议:
(1)嵌入式系统软件硬件密切相关,一定要打好软件硬件基础。
其实,只要找到正确的方法,加上努力,任何理工科学生,甚至非理工科学生,都能学好嵌入式系统。
(2)选择一个芯片及硬件评估板(入门芯片最好是简单一点,例如8位MCU)、选择一本好书(最好有规X的例子)、找一位好老师(最好是有经验且热心的)。
硬件评估板的价格一定要在1000元以下,不要太贵,最好能有自己动手的空间。
不花一分硬件钱,要想学好嵌入式系统不实际。
因为,这是实践性很强的学科。
好书,可以使你少走弯路,不会被误导,要知道有的书是会使人进入学习误区的。
好老师也可以是做过一些实际项目的学长(一定要找做过几个成功项目的学长或老师做指导,否则,经验不足也可能误导),有教师指导,学习进程会加快(人工智能学科里有个术语叫无教师指导学习模式与有教师指导学习模式,无教师指导学习模式比有教师指导学习模式复杂许多)。
(3)许多人怕硬件,其实嵌入式系统硬件比电子线路好学多了。
只要深入理解MCU的硬件最小系统,对I/O口、串行通信、键盘、LED、LCD、SPI、I2C、PWM、A/D(包括一些传感器)、D/A等逐个实验理解,逐步实践。
再通过自己做一个实际的小系统,底层硬件基础就有了。
各个硬件模块驱动程序的编写是嵌入式系统的必备基础。
学习嵌入式系统的初期,这个过程是必须的。
(4)至于嵌入式实时操作系统RTOS,一定不要一开始就学,这样会走很多弯路,也会使你对嵌入式系统感到畏惧。
等你软件硬件基础打好了,再学习就感到容易理解。
实际上,众多嵌入式应用,并不一定需要操作系统。
也可以根据实际项目需要再学习特定的RTOS。
一定不要被一些嵌入式实时操作系统培训班宣传所误导,而忽视实际嵌入式系统软件硬件基础知识的学习。
(5)要避免片面地单纯从“电子”或“计算机软件”角度认识嵌入式系统。
前面说过,嵌入式系统是软件与硬件的综合体。
因此,要逐步从MCU的最小系统开始,一点一点理解硬件原理及底层硬件驱动编程方法。
要通过规X的例子,理解软件工程封装、可复用等思想。
通过规X编程,积累底层构件(ponent),也就是一个一个模块,但是要封装得比较好,可复用。
(6)注重实验与实践。
这里说的实验主要指通过重复或验证他人的工作,目的是学习基础知识,这个过程一定要经历。
实践是自己设计,有具体的“产品”目标。
如果你能花500元左右自己做一个具有一定功能的小产品,且能稳定运行1年以上,就可以说接近入门了。
(7)关于入门芯片的选择。
不要选太复杂的微控制器作为入门芯片,不能超越学习过程。
不要一下子学习几种芯片,可以通过一个芯片入门并具有一个实践经验后,根据实际需要选择芯片开发实际产品。
注意,不要把微处理器(MPU)与微控制器(MCU)概念相混淆,微处理器只是微控制器的内核。
(8)关于操作系统的选择。
可以等到你具有一定实践后,选择一个简单容易理解原理的进行学习,不要一开始就学习几种操作系统,理解了基本原理,实践中确有实际需要再学习也不迟。
人总是要不断学习的。
(9)关于汇编与C语言的取舍。
随着MCU对C编译的优化支持,对于汇编可以只了解几个必须的语句,直接使用C语言编程。
但必须通过第一个程序理解芯片初始化过程、中断机制、程序存储情况等区别于PC机程序的内容。
另外,为了测试的需要,最好掌握一门PC机编程语言。
(10)要明确自己的学习目的,并注意学习方法。
关于学习目的要明确是打基础,还是为了适应某些工作而进行的短训;而学习方法方面,要根据学习目的选择合适的学习途径,注意理论学习与实践、通用知识与芯片相关知识、硬件知识与软件知识的平衡,要在理解软件工程基本原理基础上理解硬件构件与软件构件等基本概念。
以上建议,仅供参考。
当然,以上只是基础阶段的学习建议,要成为良好的嵌入式系统设计师,还需要在实际项目中锻炼,并不断学习与积累经验。
面向硬件构件底层驱动程序设计要求
1.硬件构件
独立编程的实体就是硬件构件,硬件构件分为内部构件和外部构件,内部构件比如系统初始化、定时器、Flash、串口等,外部构件比如LED、开关、按钮、电机等。
每个构件有独立模块。
2.程序设计基本原则
2.1对每个硬件构件编写独立的驱动程序
每个构件对应一个头文件和源文件,如果构件是外部构件,则要在头文件用宏定义构件接在哪个脚上,头文件只声明供外部调用的功能函数,也就是说,其他人只要看头文件函数声明就知道如何使用此构件而无需去看源文件去阅读代码。
一般函数的命名规则是:
构件_功能,比如初始化LED,函数名可以为LED_Init。
如果一个函数只供构件功能函数内部调用,则此函数在源文件里面声明和实现,不出现在头文件里,并声明为static函数,因为声明为static的函数只能供定义此函数的源文件使用,其他源文件看不到此函数。
如果一个全局变量只供某模块使用,则可以把此全局变量定义为static,这样此变量只能在定义它的源文件中使用,其他源文件看不到此变量,所以不会产生命名冲突。
2.2封装要完整、封装之间不能交叉
模块函数就实现此模块要实现的功能,模块内部之间不能相互调用,如果要调用则交给高端来处理,比如在Flash子程序里面不能调用串口,当然测试Flash子程序的时候例外,当测试完毕时,必须把调用串口子程序代码删除,此时Flash子程序可以通过返回值告诉高端,让高端根据返回值来决定是否调用串口子程序。
2.3返回值问题
如果只返回一个基本类型的返回值,则用返回值返回此值也可,如果返回一个复杂类型的返回值,比如一个struct结构体,则用返回值返回的话要进行复制,开销很大,此时用传址方式返回,如果返回的值很多,可以把这些值定义在一个struct里面,通过指针形式返回。
2.4函数编写
函数第一要命名合理,一看函数名就知道此函数的功能、操作的构件。
函数的层次最好不要多于5级,一个是效率降低,再一个阅读性也变差,对每个函数注释清楚,所有的函数代码编写方式有一个统一的风格,注意对齐。
函数中的堆栈变量使用前一定要负初值,在一个嵌入式的RAM一般比较少,注意不要堆栈溢出。
尽量用效率高的方式编码,比如乘除可以用移位来实现。
如果编写的程序在16位控制器上运行,函数整型参数和局部整型变量要用16位,因为如果用8位的整型变量,系统要做多余的工作来防止8位溢出之类的事情,不仅不节省空间,还会降低效率,通过反汇编对比可以看出此现象。
3.测试
测试是当模块编写完成后对其功能性的测试,先进行白盒测试,然后进行黑盒测试,测试要测试模块所有可能的输入,对非法的输入进行检测,一定测试全面。
4.调用驱动程序
一般会在两个地方调用驱动程序,一个是main函数,一个是中断处理函数,可能有多个源文件包含相同的头文件。
设计头文件的时候要避免重复定义问题,方法是:
以定义LED模块为例,头文件如下编写:
#ifndef_LED_H
#define _LED_H
/*函数声明*/
#endif
5.变量
变量分为全局变量、堆栈变量、函数内静态变量、文件内静态变量、寄存器变量。
寄存器变量是当某个变量频繁使用很多次的时候为了避免每次从内存中读它,而把它放在寄存器中来改变性能。
如果一个变量只在函数中使用,并且要一直存在,则命名为函数内静态变量,如果一个函数只在某个源文件中使用,此源文件各个函数通过此变量来通信,则此变量命名为文件内静态变量。
所有的变量要有一定的命名规X,全局变量前面加前缀g_,静态变量前面加前缀s_,寄存器变量前面加前缀r_,如果一个变量名由多个单词组成,单词之间可以用下划线分开,也可以是第一个单词字母大写,不管使用何种命名写法,全局要统一一致,不能两种混合使用。
6.总体设计
每个系统编码之前一定要先设计,思路要弄清晰,之后才编码。
大任务调用小任务,小任务如果全部正确,则大任务一定正确,知道某个小任务一定正确,但是大任务不正确,调试的时候就可以把此小任务分割出去,不用去管,这样调试会更加有目的性,更加容易调试。
一个小灯可能就是一个很好的调试工具,所以不要忽略这个小灯,在系统初始化的时候通过闪亮小灯指示初始化成功很有必要性。
电路板布板基本要求V1.0
1.布局
在正式走线之前要对PCB的大体格局进行规划,布局规划基本原则:
(1)在PCB布板之前首先要打印出相应的原理图,然后根据原理图确定整个PCB板的大体布局即各个模块的位置安排;
(2)PCB板的形状如无其他要求,一般为矩形,长宽比为4:
3或3:
2;
(3)考虑面板上元件的放置要求;
(4)考虑边缘接口。
2.元件放置
(1)芯片尽可能正放;
(2)元件放置要求整齐,各模块内同类元件尽可能排放在一起;
(3)电容的位置要特别注意,其中电源模块的滤波电容要求靠近电源,而IC的滤波电容要靠近IC的引脚;
(4)考虑元件间的距离,防止元件之间出现重叠。
3.有关设定
在正式布线之前,需要对PROTEL的一些属性进行设置:
(1)线宽。
导线尽可能宽,这样既可以减小阻抗,又可以防止由于制造工艺的原因导致导线断路。
电源、地线的宽度要大于普通信号线。
三者关系为地线>电源线>信号线。
(2)间距。
导线间距离以及导线与元件间距离要尽可能的大,这样可以有效解决焊接时短路的问题。
(3)过孔大小。
过孔大小设定要适中。
4.测量点、复接点及复接线
考虑到硬件测试的方便,在PCB布板时要留下一些测量点,以便调试之用。
测量点要根据原理图确定。
以下几处需要留测量点:
(1)原理图中模块的输入输出引脚;
(2)最小系统模块中MCU的引脚;
(3)各硬件模块单元的输入、输出处;
使用复接点复接线方式,利用冗余提高稳定。
5.模块标示
由于在整体布局的时候基本将各个模块的元件放在一起,因而可以在PCB板上将各个模块区分开,并用汉字标出模块名(与原理图一致)。
注意字体字号。
6.空余位置的利用
PCB板的空余位置可作以下之用:
(1)电源、地。
空白地多留几排电源和地。
(2)双排孔。
留出几排两孔相连的排孔,以用来扩展或试验时焊接其他元件。
(3)在PCB上画固定板的固定孔,一般在板的四个角落。
7.铺地
铺地可以减小干扰,提高PCB板的稳定性,因此在布板的最后都要铺地。
以下几点为铺地注意点:
(1)在铺地前,要设定地与导线、地与引脚之间的距离,并要求该距离尽可能大;
(2)铺地本应该双面铺,作为实验用板,为了方便检查,可只铺反面地;
(3)如果电路板中有数字地和模拟地,应隔离开,两者间使用磁珠相连。
8.标注相关信息
在完成PCB板的铺地之后,要在板的正面适当位置标出以下几点:
(1)单位;
(2)日期;
(3)责任人;
(4)PCB板的名称;
(5)编号。
如2008-XX。
9.检查
布板完成后一定要进行自动与人工检查。
10.其他补充
(1)过孔数尽可能少。
(2)最小系统中未使用的I/O口,可通过电阻接地。
(3)走线注意点。
元件的排列方位尽可能保持与原理图相一致,布线方向最好与电路图走线方向相一致。
要尽量避免长距离平行布线,电路中电气互连点间布线力求最短。
设计布线图时,走线尽量少拐弯,印刷弧上的线宽不要突变,导线拐角应≥90°,力求线条简单明了。
信号线的拐角应设计成钝角走向,或成圆形、圆弧形,切忌画成90°或更小角度形状。
印刷电路中不允许有交叉电路,对于可能交叉的线条,可以用“钻”、“绕”两种办法解决。
即让某引线从别的电阻、电容、三极管脚下的空隙处“钻”过去,或从可能交叉的某条引线的一端“绕”过去。
晶振电路要注意外界的干扰,晶振下方尽量不走线。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 知识 体系 学习 误区 建议