嵌入式入门,资深工程师带带你:嵌入式到底应该该怎么学

描述

01、嵌入式的定义和举例分析

官方定义:

根据 IEEE(国际电气和电子工程师协会)的定义,嵌入式系统(Embedded System)是指以应用为中心、以计算机技术为基础,软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。举例来说,大到油田的集散控制系统和工厂流水线,小到家用 VCD 机或手机,甚至组成普通 PC 终端设备的键盘、鼠标、硬盘、Modem 等均是由嵌入式处理器控制的。

这主要是从应用上加以定义的,从中可以看出嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。

目前国内一个普遍被认同的定义是:以应用为中心、以计算机技术为基础,软件硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。

说白了就是先设计硬件,然后根据需求编写能在该硬件上运行的软件,就成了所谓的“智能硬件”。

嵌入式系统无疑是当前最热门最有发展前途的 IT 应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等。特别是随着消费家电的智能化,嵌入式更显重要。

首先嵌入式技术主要分为嵌入式软件和嵌入式硬件 2 大方向。 

嵌入式硬件方向

嵌入式硬件工程师主要工作职责是为产品设计硬件电路原理图,设计硬件 PCB 板,选择合适的元器件,焊接调试硬件电路板,保证硬件电路板的可靠性、稳定性和抗干扰能力。因为现在集成电路发展迅速,大部分集成电路厂商都会提供参考电路,所以硬件电路原理图的设计相对来说比较简单,硬件工程师工作的含金量主要体现在产品的可靠性和稳定性设计、以及电磁兼容设计,这才是硬件设计工程师的含金量所在。一个资深的嵌入式硬件工程师年薪都在 15 万~40 万之间。 

要成为一个资深的嵌入式工程师相当难,一方面要有非常扎实的理论知识,同时也要有相当的那种大型的、高频 CPU、多层 PCB 板的设计经验。嵌入式硬件工程师要学的课程主要有模拟电路设计、数字电路设计、电磁波理论等。熟悉常用的放大电路、滤波电路、电源电路设计和分析。 

嵌入式软件方向 

嵌入式软件工程师的职责主要是根据产品的功能需求设计好软件,让硬件工作起来。嵌入式电子产品硬件部分,大部分都是相同的,核心的都是由 CPU、RAM 和 FLASH 几大部分组成,而软件就千差万别了。产品的具体功能都是由软件来实现的,一般来讲一个产品的实现,软件设计的工作量是硬件设计的 4~5 倍。所以一般情况下,一个公司的软件工程师数量是硬件硬件工程师的 4~5 倍,嵌入式软件工程师需求比硬件工程师大很多,同时跟硬件工程师相比,嵌入式软件工程师学起来相对容易些,所以这里 21ic 家重点和大家谈一下嵌入式软件工程的学习路线。 延伸阅读:《嵌入式有什么值得学习的软硬件技术?》、《嵌入式软件和硬件谁更重要?》。

02、嵌入式设计应具备的基本技能
1、Linux 基础

安装 Linux 操作系统
Linux 文件系统
Linux 常用命令
Linux 启动过程详解 
熟悉 Linux 服务能够独立安装 Linux 操作系统,能够熟练使用 Linux 系统的基本命令 
认识 Linux 系统的常用服务安装 Linux 操作系统 
Linux 基本命令实践 
设置 Linux 环境变量 
定制 Linux 的服务 Shell 
编程基础使用 vi 编辑文件 
使用 Emacs 编辑文件 
使用其他编辑器

2、Shell 编程基础

Shell 简介
认识后台程序 Bash 编程
熟悉 Linux 系统下的编辑环境 
熟悉 Linux 下的各种 Shell 
熟练进行 shell 编程熟悉 vi 基本操作 
熟悉 Emacs 的基本操作 
比较不同 shell 的区别 
编写一个测试服务器是否连通的 shell 脚本程序 
编写一个查看进程是否存在的 shell 脚本程序 
编写一个带有循环语句的 shell 脚本程序

3、Linux 下的 C 编程基础

linux c 语言环境概述 
Gcc 使用方法 
Gdb 调试技术 
AutoconfAutomake Makefile 代码优化 
熟悉 Linux 系统下的开发环境 
熟悉 Gcc 编译器 
熟悉 Makefile 规则编写 Hello,World 程序 
使用 make 命令编译程序 
编写带有一个循环的程序 
调试一个有问题的程序

4、嵌入式系统开发基础

嵌入式系统概述 
交叉编译 
配置 TFTP 服务 
配置 NFS 服务 
下载 Bootloader 和内核 
嵌入式 Linux 应用软件开发流程熟悉嵌入式系统概念以及开发流程 
建立嵌入式系统开发环境制作 cross_gcc 工具链 
编译并下载 U-boot 
编译并下载 Linux 内核 
编译并下载 Linux 应用程序

5、嵌入式系统移植

Linux 内核代码 
平台相关代码分析 
ARM 平台介绍 
平台移植的关键技术 
移植 Linux 内核到 ARM 平台 
了解移植的概念 
能够移植 Linux 内核移植 Linux2.6 内核到 ARM9 开发板

6、嵌入式 Linux 下串口通信

串行 I/O 的基本概念 
嵌入式 Linux 应用软件开发流程 
Linux 系统的文件和设备 
与文件相关的系统调用 
配置超级终端和 MiniCOM 
能够熟悉进行串口通信 
熟悉文件 I/O 
编写串口通信程序 
编写多串口通信程序

7、嵌入式系统中多进程程序设计

Linux 系统进程概述 
嵌入式系统的进程特点 
进程操作 
守护进程 
相关的系统调用了解 Linux 系统中进程的概念 
能够编写多进程程序编写多进程程序 
编写一个守护进程程序 
sleep 系统调用任务管理
同步与通信 Linux 任务概述任务调度 
管道 信号 共享内存 任务管理 API 
了解 Linux 系统任务管理机制 
熟悉进程间通信的几种方式 
熟悉嵌入式 Linux 中的任务间同步与通信编写一个简单的管道程序实现文件传输 
编写一个使用共享内存的程序

8、嵌入式系统中多线程程序设计

线程的基础知识 
多线程编程方法 
线程应用中的同步问题了解线程的概念 
能够编写简单的多线程程序编写一个多线程程序

03、嵌入式软件工程师学习流程
第一部分:Linux 平台搭建与环境熟悉

了解 linux 系统;区分各种版本的 Linux 系统,以便于拓展 Linux 视野。

1、Linux 简介;
2、Linux 系统的主要特点;
3、Linux 的组成;
4、主要的 Linux 版本;
5、嵌入式 Linux 简介与发展

第二部分:虚拟机安装和 LINUX 系统安装

1、虚拟机安装;
2、Linux 系统的安装;
3、Linux 系统的常用软件的安装;
4、Linux 快速入门
5、 熟悉运用 Linux 环境下,常用命令的操作与系统设置,如常用的 Shell;掌握基本的 Shell 应用

第三部分:嵌入式 LINUX 环境搭建

1、 建立嵌入式 Linux 开发环境
2、 熟悉嵌入式开发平台
3、 嵌入式 Linux 开发工具
4、 Linux 下的调试技巧
5、 MAKE 工程管理器
6、 硬件环境的搭建;arm-linux-gcc 与 gcc 安装配置

第四部分:U-Boot

了解 U-Boot 的作用及工作流程;了解 Bootloader 的代码结构、编译过程;移植 U-Boot;掌握常用的 U-Boot 命令。

1、 Bootloader 介绍
2、 u-boot 工程介绍
3、 u-boot 的编译使用
4、 u-boot 源码分析
5、 u-boot 资源分配
6、 配置编译 u-boot
7、 u-boot 移植过程
8、 u-boot 常用命令操作
9、 添加 u-boot 新命令
10、设置 u-boot 环境变量
11、 u-boot 驱动添加网卡:DM9000

第五部分:LINUX 内核移植

熟悉内核的原码结构和 kbuild Makefile 语法;掌握和内核、驱动模块编译相关的原理及方法。

1、Linux 内核介绍
2、Linux 内核特点
3、Linux 内核源代码结构
4、Linux 内核选项解析
5、Linux 内核编译链接
6、内核模块编译、使用方法

第六部分:LINUX 根文件系统

1、busybox 包移植、编译
2、Linux 跟文件系统制作过程
3、根文件系统介绍
4. nfs 文件服务器系统搭建

第七部分:LINUX 应用学习

嵌入式 Linux 应用开发和系统开发是嵌入式 Linux 中最重要的一部分,也是企业人才需求最广的一部分。

主要目标是精通嵌入式 Linux 下的程序设计,熟练掌握嵌入式 Linux 的开发环境、系统编程以及网络编程,熟悉 C++、QT 编程并且深刻体会整个嵌入式 Linux 项目开发流程,强化学员对 Linux 应用开发的能力。

1、Linux 系统中的进程的概念,在应用程序中线程与父子进程的创建与应用
2、线程之间、进程之间的通信
3、进程间通信基本概念
4、管道(PIPE)
5、信号(SIGNAL)
6、内存映射(MAPPED MEMORY)
7、消息队列(MESSAGE QUEUE)
8、信号量(SEMAPHORE)
9、共享内存(SHARE MEMORY)@
10、tcPip 协议在应用程序中的编程开发(SOCKET 套接字编程开发)
10.1. ISO/OSI 七层协议模型与 IP 网络四层模式
10.2.TCP/IP 协议簇
10.3. 基于嵌入式 Linux 的 TCP/IP 网络结构
10.4. 基于嵌入式 Linux 的 SOCKET 编程
10.5.UDP 与 TCP 的区别
10.6. UDP SERVER-CLIENT 关系程
11、文件读写与存储

04、嵌入式软件工程师的内功修炼
所谓嵌入式软件开发,抽象的讲,就是在专用的硬件平台借助宿主机交叉编译环境通过编程、编译、链接下载、调试达到目标需求;往细了分,嵌入式软件开发可分为嵌入式驱动设计师(向下根据接口协议驱动硬件设备,向上提供应用 API),嵌入式系统设计师(编写固件程序,设计操作系统内核或文件系统,根据不同硬件平台移植操作系统,优化系统功能),嵌入式界面设计师(嵌入式硬件平台的上位机 GUI 设计,人机交互),嵌入式应用设计师(裸机或操作系统移植调度驱动 API 按照一定的算法逻辑实现相应的需求功能),嵌入式算法设计师(把相关数学算法设计成软件程序精准优化系统功能,如 PID 控算、卡尔曼滤波算法、低通滤波等)。

C 语言就是嵌入式软件的内功,21ic 家也曾经多次强调。相信大家都看过武侠小说或电视,金老前辈的甚是出名,里面有“天下武功出少林”一说,为什么呢?

就是因为少林有一本《易筋经》,“扫地僧”也就是当时江湖的大神,学了易筋经的人想再学其他武功可谓是游刃有余,就像《射雕英雄传》的郭靖郭大侠因为修炼了全真教马钰道长的内功,再学洪七公、老顽童等的外功就很简单了,而 C 语言就是所有各种编程语言(像 Python、Java、C++、PHP、JavaScript 等等)里面的“易筋经”,达到精通 C 的境界,再学其他就很简单了,因为 C 要整明白,必须了解底层、明白计算机系统的运行机制,当然一个没学过汇编的人不能真正掌握 C 语言的真谛。

在如今 Python、Java 编程语言火热的市场前景下,资深工程师的建议是,在学校读书真心想搞 IT 技术,从 C 语言学起,会受益终生的。

学习 C 语言难吗?资深工程师表示:不难。真正懂得用 C 语言难吗?-- 难,但是按照心法不断去实践会化解“难”这颗顽石。现在对 C 语言水平层次的定义有几阶:入门、掌握、熟悉、精通。现在很多一线的软件工程师都是至多在“熟悉”的水平阶上。

内功心法:用数学思维抽象化去学习,多编程、多调试、多实际应用,多看高手写的优秀代码,可以尝试去写写 RTOS 内核;知错就改,温故知新,不断学习

内功大纲:结构体、数组、指针、函数、内存管理

深度理解 ANSI 标准定义的 C 语言预处理指令用法,文件结构问题
明确定义及声明,深度解析 C 语言的 32 个关键字,sizeof 是关键字
标准 C 语言的 20 个基本符号深度熟练怎么用,还有表达式的优先级问题
深度理解内存管理与内存泄漏问题,野指针的问题,栈、堆、静态区的问题
深度解析指针和数组的内存布局,它们之间的相互访问形式以及地址的强制转换 ,还有多维数组和多级指针问题
深度理解函数设计的原则和技巧,养成良好的编程风格和编程习惯

顺便提提软件面试一般考察的问题,也就是面试官想通过面试了解的问题:

在需求实现的前提下,看你的编程风格;
编程逻辑不可能一步到位,很多时候需要不断修改,看你出错问题的处理能力;
对你代码算法复杂度进行分析,是否提高系统性能。

05、嵌入式软硬件界限又不是那么深

嵌入式系统的应用范围可以粗略分为两大类:

(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:各种具体应用。

事实上,万变不离其宗,任何应用都可以归入这几类。而应用中的硬件设计、软件设计、测试等都必须遵循嵌入式软件工程的方法、原理与基本原则。所以,嵌入式软件工程也是嵌入式系统知识体系的有机组成部分,只不过,它融于具体项目的开发过程之中。21ic 家多次强调,虽然嵌入式工程师有软件和硬件工程师的分别,但是其实对于嵌入式工程师来说,两手都要硬,只不过相关领域工程师的深浅不同。更多相关内容可以在 21ic 中国电子网查阅查看。

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

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

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

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

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

硬件与软件的困惑

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

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

有些学者,仅从软件开发角度认识嵌入式系统,甚至有的仅从嵌入式操作系统认识嵌入式系统。这些学者,大多具有良好的计算机软件开发基础知识,认为硬件是生产厂商的事,没有认识到,嵌入式系统产品的软件与硬件均是需要开发者设计的。我常常接到一些关于嵌入式产品稳定性的咨询电话,发现大多数是由于软件开发者对底层硬件的基本原理不理解造成的。特别是,有些功能软件开发者,过分依赖于底层硬件的驱动软件设计完美,自己对底层驱动原理知之甚少。实际上,一些功能软件开发者,名义上在做嵌入式软件,实际上,仅仅使用嵌入式编辑、编译环境而已,本质与开发通用 PC 机软件没有两样。

而底层硬件驱动软件的开发,若不全面考虑高层功能软件对底层硬件的可能调用,也会使得封装或参数设计得不合理或不完备,导致高层功能软件的调用困难。从这段描述可以看出,若把一个嵌入式系统的开发孤立地分为硬件设计、底层硬件驱动软件设计、高层功能软件设计,一旦出现了问题,就可能难以定位。实际上,嵌入式系统设计是一个软件、硬件协同设计工程,不能象通用计算机那样,软件、硬件完全分开来看,要在一个大的框架内协调工作。 面对学习嵌入式系统以软件为主还是以硬件为主,或是如何选择切入点,如何在软件与硬件之间取得一些平衡。对于这个困惑的建议是:要想成为一名真正的嵌入式系统设计师,在初学阶段,必须重视打好嵌入式系统的硬件与软件基础。以下是从事嵌入式系统设计二十多年的一个美国学者 John Catsoulis 在《Designing Embedded Hardware》一书中关于这个问题的总结:嵌入式系统与硬件紧密相关,是软件与硬件的综合体,没有对硬件的理解就不可能写好嵌入式软件,同样没有对软件的理解也不可能设计好嵌入式硬件。

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

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

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

首先是关于位数问题,目前主要有 8 位、16 位、32 位,面对嵌入式系统应用的多样性,不同位数的 MCU 各有应用领域,这一点与通用微机有很大不同。你做一个遥控器,不需要使用一个 32 位 MCU,可能一个 MCU 芯片价格已经超过遥控器价格需求。对于首次接触嵌入式系统的学习者,可以根据自己的知识基础选择入门芯片的位数。建议大多数初学者,可以选择一个 8 位 MCU 作为快速入门芯片,了解一些汇编与底层硬件知识,之后再选一个 16 位或 32 位芯片进行学习实践。

关于芯片选择的另一个误区,认为有“主流芯片”存在,嵌入式系统也可以形成芯片垄断。这完全是一种误解,是套用通用计算机系统的思维模式,而忽视了嵌入式系统应用的多样性。

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

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

07、基础阶段的学习建议

基于以上讨论,21ic 家总结了渴望学习嵌入式系统的学子提出几点基础阶段的学习建议:

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

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

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

审核编辑 黄昊宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分