购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.2 嵌入式系统的知识体系、学习误区及学习建议

1.2.1 嵌入式系统的知识体系

嵌入式系统的应用范围可以粗略分为两大类:① 电子系统的智能化 (如工业控制、现代农业、家用电器、汽车电子、测控系统、数据采集等),这类应用也被称为微控制器领域;② 计算机应用的延伸 (如平板电脑、手机、电子图书等),这类应用也被称为应用处理器领域。在ARM产品系列中,ARM Cortex M系列与ARM Cortex R系列适用于电子系统的智能化类应用,即微控制器领域;ARM Cortex A系列适用于计算机应用的延伸,即应用处理器领域,本书以ARM Cortex-M4内核MCU为蓝本阐述嵌入式应用与设计方法。不论如何分类,嵌入式系统的技术基础是不变的,即要完成一个嵌入式系统产品设计,需要有硬件、软件及行业领域相关知识。

硬件主要有MCU的硬件最小系统、输入/输出外围电路、人机接口设计。软件设计有固化软件的设计,也可能含PC软件的设计。行业知识需要通过协作、交流与总结获得。

概括地说,学习以MCU为核心的嵌入式系统,需要以下软件硬件基础知识与实践训练:

● 硬件最小系统(包括电源、晶振、复位、写入调试器接口等);

● 通用I/O(开关量输入/输出,涉及各种二值量检测与控制);

● A/D转换(各种传感器信号的采集与处理,如红外、温度、光敏、超声波、方向等);

● D/A转换(对模拟量设备利用数字信号进行控制);

● 通信(SCI、SPI、I2C、CAN、USB、嵌入式以太网、无线传感器网络等);

● 显示(LED、LCD、触摸屏等);

● 控制(控制各种设备,包括PWM等控制技术);

● 数据处理(图形、图像、语音、视频等处理或识别);

● 各种具体的应用。

事实上,万变不离其宗,任何应用都可以归入这几类。而应用中的硬件设计、软件设计、测试等都必须遵循嵌入式软件工程的方法、原理与基本原则。所以,嵌入式软件工程也是嵌入式系统知识体系的有机组成部分,只不过,它融于具体项目的开发过程之中。

以上实践训练涉及硬件基础、软件基础及相关领域知识。计算机语言、操作系统、开发环境等均是完成这些目的的工具。有些初学者,容易把工具的使用与所要达到的真正目的相混淆。例如,有的初学者,学了很长时间的嵌入式操作系统移植,而不进行实际嵌入式系统产品的开发,到了最后,做不好一个嵌入式系统小产品,偏离了学习目标,甚至放弃了嵌入式系统领域。这就是进入了嵌入式系统学习误区的情况,下面对此做一些分析。

1.2.2 嵌入式系统的学习误区

关于嵌入式系统的学习方法,因学习经历、学习环境、学习目的、已有的知识基础等不同,可能在学习顺序、内容选择、实践方式等方面有所不同。但是,应该明确哪些是必备的基础知识,哪些应该先学,哪些应该后学;哪些必须通过实践才能获得的;哪些是与具体芯片无关的通用知识,哪些是与具体芯片或开发环境相关的知识。

由于微处理器与微控制器种类繁多,也可能由于不同公司、不同机构出于自身的利益,给出一些误导性宣传,特别是我国嵌入式微控制器制造技术的落后及其他相关情况,使得人们对微控制器的发展,在认识与理解上存在差异,导致一些初学者,进入了嵌入式系统的学习误区,浪费了宝贵的学习时间。下面分析初学者可能存在的几个误区。

1.嵌入式系统学习误区 1——操作系统的困惑

如果说,学习嵌入式系统不是为了开发嵌入式应用产品,那就没有具体目标了,许多诸如学习方法问题也就不必谈了。实际上,这正是许多人想学,又不知从何开始学习的关键问题所在,不知道自己学习的具体目标。于是,看了一些培训广告,看了书店中书架上种类繁多的嵌入式系统的书籍,或上网以“嵌入式系统”为关键词进行查询,然后参加培训或看书,开始“学习起来”。对于有计算机阅历的人,往往选择一个嵌入式操作系统就开始学习了。不好听的比喻,有点像“瞎子摸大象”,只了解其一个侧面。这样如何能对嵌入式产品的开发过程有个全面了解呢? 针对许多初学者选择“xxx嵌入式操作系统+xxx处理器”的嵌入式系统入门学习模式,我认为是不合适的。我的建议是:首先把嵌入式系统软件与硬件基础打好了,再根据实际应用需要,选择一种实时操作系统(RTOS)进行实践。 要记住:RTOS是开发某些嵌入式产品的辅助工具,是手段,不是目的。况且许多嵌入式产品并不需要RTOS。所以,一开始就学习RTOS,并不符合“由浅入深、循序渐进”的学习规律。

另外,即使学习RTOS,也要认识到RTOS种类繁多,实际使用何种RTOS,一般需要工作单位确定。基础阶段主要学习RTOS的基本原理与在RTOS之上的软件开发方法,而不是学习如何设计RTOS。以开发实际嵌入式产品为目标的学习者,不要把过多的精力花在设计或移植RTOS上面。正如很多人使用Windows操作系统,而设计Windows操作系统只有Microsoft。许多人“研究”Linux,但不使用它,浪费时间了,人的精力是有限的,所以学习必须有所选择。

2.嵌入式系统学习误区 2——硬件与软件的困惑

以MCU为核心的嵌入式技术的知识体系必须通过具体的MCU来体现、实践与训练。但是,选择任何型号的MCU,其芯片相关的知识只占知识体系的 20%左右,80%左右是通用知识。但是这 80%的通用知识,必须通过具体实践才能掌握,所以学习嵌入式技术要选择一个系列的MCU。但不论如何,嵌入式系统均含有硬件与软件两大部分,它们之间的关系如何呢?

有些学者仅从电子角度认识嵌入式系统。 认为“嵌入式系统=MCU硬件系统+小程序”。这些学者,大多具有良好的电子技术基础知识。而实际情况是,早期MCU内部RAM小、程序存储器外接,需要外扩各种I/O,没有像现在的USB、嵌入式以太网等较复杂的接口,因此,程序占总设计量小于 50%,使人们认为嵌入式系统(MCU)是“电子系统”,以硬件为主、程序为辅。但是,随着MCU制造技术的发展,不仅MCU内部RAM越来越大,Flash进入MCU内部改变了传统的嵌入式系统开发与调试方式,固件程序可以被更方便地调试与在线升级,许多情况与开发PC程序方便程度相差无几,只不过开发环境与运行环境不是同一载体而已。这些情况使得嵌入式系统的软硬件设计方法发生了根本变化。特别是因软件危机而发展起来的软件工程学科对嵌入式系统软件的发展也产生了重要影响,产生了嵌入式系统软件工程。

有些学者仅从软件开发角度认识嵌入式系统。 甚至有的仅从嵌入式操作系统认识嵌入式系统。这些学者大多具有良好的计算机软件开发基础知识,认为硬件是生产厂商的事,没有认识到嵌入式系统产品的软件与硬件均是需要开发者设计的。我常常接到一些关于嵌入式产品稳定性的咨询电话,发现大多数是由于软件开发者对底层硬件的基本原理不理解造成的。特别是有些功能软件开发者,过分依赖于底层硬件的驱动软件设计完美,自己对底层驱动原理知之甚少。实际上,一些功能软件开发者,名义上是在做嵌入式软件,但仅仅是使用嵌入式编辑、编译环境与下载工具而已,本质与开发通用PC软件没有区别。而底层硬件驱动软件的开发,若不全面考虑高层功能软件对底层硬件的可能调用,也会使得封装或参数设计得不合理或不完备,导致高层功能软件的调用困难。从这段描述可以看出,若把一个嵌入式系统的开发孤立地分为硬件设计、底层硬件驱动软件设计、高层功能软件设计,一旦出现了问题,就可能难以定位。 实际上,嵌入式系统设计是一个软件、硬件协同设计工程,不能像通用计算机那样软件和硬件完全分开, 要在一个大的框架内协调工作。在一些小型公司,需求分析、硬件设计、底层驱动、软件设计、产品测试等过程可能是由同一个团组完成,这就需要团队成员,对软件、硬件及产品需求有充分的认识,才能协作开发好。甚至许多实际情况是在一些小公司这个“团队”可能就是一个人。

面对学习嵌入式系统以软件为主还是以硬件为主,或是如何选择切入点,如何在软件与硬件之间取得一些平衡。对于这个困惑的建议是: 要想成为一名真正的嵌入式系统设计师,在初学阶段,必须重视打好嵌入式系统的硬件与软件基础。 以下是从事嵌入式系统设计二十多年的一个美国学者John Catsoulis在《Designing Embedded Hardware》一书中关于这个问题的总结: 嵌入式系统与硬件紧密相关,是软件与硬件的综合体,没有对硬件的理解就不可能写好嵌入式软件,同样没有对软件的理解也不可能设计好嵌入式硬件。

3.嵌入式系统学习误区 3——片面认识嵌入式系统

嵌入式系统产品种类繁多,应用领域各异。在 1.2.1 节中,把嵌入式系统的应用范围粗略分为 电子系统的智能化与计算机应用的延伸两大类。 对于初学者,可能存在分别从这两个角度片面认识嵌入式系统的问题。因此,一些从电子系统智能化角度认识嵌入式系统的学习者,可能会忽视编程结构、编程规范、软件工程的要求、操作系统等知识的积累;另一些从计算机应用的延伸角度认识嵌入式系统的学习者,可能会把通用计算机学习过程中的概念与方法生搬硬套到嵌入式系统的实践中,忽视嵌入式系统与通用计算机的差异。

实际上,在嵌入式系统学习与实践的初始阶段,应充分了解嵌入式系统的特点,根据自身已有的知识结构,制定适合自身情况的学习计划。 目标应该是打好嵌入式系统的硬件与软件基础,通过实践,为成为良好的嵌入式系统设计师建立起基本知识结构。 学习过程可以以具体应用系统为实践载体,但不能拘泥于具体系统,应该有一定的抽象与归纳。例如,有的初学者开发一个实际控制系统,没有使用实时操作系统,但不要认为实时操作系统不需要学习,要注意知识学习的先后顺序与时间点的把握。又如,有的初学者以一个带有实时操作系统的样例为蓝本进行学习,但不要认为,任何嵌入式系统都需要使用实时操作系统,甚至把一个十分简明的实际系统加上一个不必要的实时操作系统。因此, 片面认识嵌入式系统,可能会导致学习上的困惑。 应该根据实际项目需要,锻炼自己分析实际问题、解决问题的能力。这是一个比较长期的学习与实践过程,不能期望通过短期培训完成整体知识体系的建立,应该重视自身实践,全面地理解嵌入式系统的知识体系。

4.嵌入式系统学习误区 4——入门芯片选择的困惑

嵌入式系统的大部分初学者需要选择一个微控制器(MCU)进行入门级学习,面对众多厂家生产的微控制器系列,不知如何是好。

首先是关于位数问题,目前主要有 8 位、16 位、32 位,面对嵌入式系统应用的多样性,不同位数的MCU各有其应用领域,这一点与通用微机有很大的不同。例如,开发一个遥控器,一般不需要使用一个 32 位MCU,原因是可能一个MCU芯片价格已经超过遥控器价格的需求。对于首次接触嵌入式系统的学习者,可以根据自己的知识基础选择入门芯片的位数。建议大多数初学者,可以选择一个 8 位MCU作为快速入门芯片,了解一些汇编与底层硬件知识,之后再选一个 16 位或 32 位芯片进行学习实践。由于这十多年来,作者陆续以飞思卡尔 8 位(HC08、S08)、16 位(HCS12、S12X)、32 位(Coldfire)系列微控制器为蓝本写了嵌入式系统方面的书,其C语言编程实例,按照构件封装原则,把硬件相关的部分封装底层构件,统一接口,高层程序与芯片无关,可以在各种芯片应用系统移植与复用。所以,不论选择何种芯片学习,关键是要掌握嵌入式系统设计的基本要素与基本方法。

关于学习芯片的选择还有一个误区,是系统的工作频率。误认为选择工作频率高的芯片进行入门学习,表示更先进。实际上,工作频率高可能给初学者带来学习过程中的不少困难。

实际嵌入式系统设计不是追求芯片位数、工作频率、操作系统等因素,而是追求稳定可靠、维护、升级、功耗、价格等指标。而初学者选择入门芯片,通过某一MCU作为蓝本获得嵌入式系统知识体系的通用知识, 其基本原则是:入门时间较短、硬件成本较少,知识要素较多,学习难度较低。

1.2.3 基础阶段的学习建议

基于以上讨论,下面对广大渴望学习嵌入式系统的学子提出几点基础阶段的学习建议。

(1) 嵌入式系统软件和硬件密切相关,一定要打好软件和硬件基础。 其实,只要找到正确的方法,加上努力,任何理工科学生,甚至非理工科学生,都能学好嵌入式系统。

(2) 选择一个芯片及硬件评估板 (入门芯片最好简单一点,例如 8 位MCU)、选择一本好书(最好有规范的例子)、找一位好老师(最好是有经验且热心的)。硬件评估板的价格一定要在 1 000元以下,不要太贵,最好能有自己动手的空间。不花一分硬件钱,要想学好嵌入式系统是不现实的。因为,这是实践性很强的学科。好书,可以使你少走弯路,不会被误导,要知道有的书是会使人进入学习误区的。好老师也可以是做过一些实际项目的学长(一定要找做过几个成功项目的学长或老师做指导,否则,经验不足也可能误导初学者)。有教师指导,学习进程会加快(人工智能学科里有个术语叫无教师指导学习模式与有教师指导学习模式,无教师指导学习模式比有教师指导学习模式复杂许多)。

(3) 许多人怕硬件,其实嵌入式系统硬件比电子线路好学多了。 只要深入理解MCU的硬件最小系统,对I/O口、串行通信、键盘、LED、LCD、SPI、I2C、PWM、A/D(包括一些传感器)、D/A等逐个实验理解,逐步实践。再通过自己做一个实际的小系统,底层硬件基础就有了。各个硬件模块驱动程序的编写是嵌入式系统的必备基础。学习嵌入式系统的初期,这个过程是必须的。

(4) 至于嵌入式实时操作系统RTOS,一定不要一开始就学,这样会走很多弯路, 也会使你对嵌入式系统感到畏惧。等你软件硬件基础打好了,再学习就感到容易理解。实际上,众多嵌入式应用,并不一定需要操作系统。也可以根据实际项目需要再学习特定的RTOS。一定不要被一些嵌入式实时操作系统培训班宣传所误导,而忽视实际嵌入式系统软件硬件基础知识的学习。

(5) 要避免片面地单纯从“电子”或“计算机软件”角度认识嵌入式系统。 前面说过,嵌入式系统是软件与硬件的综合体。因此,要逐步从MCU的最小系统开始,一点一滴地理解硬件原理及底层硬件驱动编程方法。要通过规范的例子,理解软件工程封装、可复用等思想。通过规范编程,积累底层构件(Component),也就是一个一个的模块,但是要封装得比较好,可复用。

(6) 注重实验与实践。 这里说的实验主要指通过重复或验证他人的工作,其目的是学习基础知识,这个过程一定要经历。实践是自己设计,有具体的“产品”目标。如果你能花 500 元左右自己做一个具有一定功能的小产品,且能稳定运行 1 年以上,就可以说接近入门了。

(7) 关于入门芯片的选择。 不要选太复杂的微控制器作为入门芯片,不能超越学习过程。不要一下子学习几种芯片,可以通过一个芯片入门并具有实践经验后,根据实际需要选择芯片开发实际产品。注意,不要把微处理器(MPU)与微控制器(MCU)概念相混淆,微处理器只是微控制器的内核。

(8) 关于嵌入式操作系统的选择。 可以等到你具有一定实践后,选择一个简单容易理解原理的进行学习,不要一开始就学习几种操作系统,理解了基本原理,实践中确有实际需要再学习也不迟。人总是要不断学习的。

(9) 关于汇编与C语言的取舍。 随着MCU对C语言编译的优化支持,对于汇编可以只了解几个必须的语句,直接使用C语言编程。但必须通过第一个程序理解芯片初始化过程、中断机制、程序存储情况等区别于PC程序的内容。另外,为了测试的需要,最好掌握一门PC编程语言。

(10) 要明确自己的学习目的,并注意学习方法。 关于学习目的,要明确是打基础,还是为了适应某些工作而进行的短训;而在学习方法方面,要根据学习目的选择合适的学习途径,注意理论学习与实践、通用知识与芯片相关知识、硬件知识与软件知识的平衡,要在理解软件工程基本原理的基础上理解硬件构件与软件构件等基本概念。

以上建议,仅供参考。当然,以上只是基础阶段的学习建议,要成为良好的嵌入式系统设计师,还需要在实际项目中锻炼,并不断学习与积累经验。

1.2.4 嵌入式系统开发所遇到的若干问题

自从 1974 年第一款微处理器芯片问世以来,嵌入式系统应用已深入到军事、航空航天、通信、家电等各个领域。近年来,随着微控制器(MCU)内部Flash存储器可靠性提高及擦写方式的变化,内部RAM及Flash存储器容量的增大,以及外部模块内置化程度的提高,设计复杂性、设计规模及开发手段已经发生了根本性的变化。

在嵌入式系统发展的最初阶段,嵌入式系统开发(包括硬件和软件设计)通常是由一个工程师来承担的,软件在整个工作中的比例很小。随着时间的推移,硬件设计变得越来越复杂,软件的份量也急剧增长,嵌入式开发人员也由一人发展为由若干人组成的开发团队。

目前,嵌入式系统开发主要存在以下两大问题。

问题 1:硬件设计缺乏重用支持

导致硬件设计缺乏重用支持的主要原因是:目前缺少可供硬件设计工程师们共同遵守的设计规范。设计人员往往是凭借个人工作经验和习惯的积累进行系统硬件电路的设计。在开发完一个嵌入式应用系统再进行下一个应用开发时,硬件电路原理图往往需要从零开始,重新绘制;或者在一个类似的原理图上修改,但往往又很麻烦,容易出错。

问题 2:驱动程序可移植性差

驱动程序的开发在嵌入式系统的开发中具有举足轻重的地位。驱动程序的好坏直接关系着整个嵌入式系统的稳定性和可靠性。然而,开发出完备、稳定的驱动程序并非易事。长期以来,开发人员在编写驱动程序时缺少软件工程思想的支撑,软、硬件设计过程孤立,造成与硬件密切相关的底层软件缺乏通用性,可移植性和可复用性较差,开发过程中缺少标准化、文档化的管理,给开发人员之间的交流以及日后系统的维护带来很大的困难。

上述两个问题导致的结果是系统开发周期长,效率低。下面提出的基于硬件构件的软硬件设计思想可在一定程度上解决这些问题。 1QUNfXtdLgt0pnfoiTVu5ghijbH2Xhq8O0dBK8prXW2lEVSpkNRtO0y5mjY2rLNQ

点击中间区域
呼出菜单
上一章
目录
下一章
×