你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

教你怎么学习嵌入式

[复制链接]
gaosmile 发布时间:2020-10-10 17:51
01
嵌入式的定义和举例分析
2 k2 q  W/ V" ]6 {
官方定义:/ l/ o6 o8 H- h- i& g' Q. c
根据IEEE(国际电气和电子工程师协会)的定义,嵌入式系统(Embedded System)是指以应用为中心、以计算机技术为基础,软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。举例来说,大到油田的集散控制系统和工厂流水线,小到家用VCD机或手机,甚至组成普通PC终端设备的键盘、鼠标、硬盘、Modem等均是由嵌入式处理器控制的。  l9 v/ }, o  \0 y; E) p0 P. a
这主要是从应用上加以定义的,从中可以看出嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。8 o9 ?5 m! l% X9 a
目前国内一个普遍被认同的定义是:以应用为中心、以计算机技术为基础,软件硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。  Y: P; R7 G7 @7 J1 c4 @
说白了就是先设计硬件,然后根据需求编写能在该硬件上运行的软件,就成了所谓的“智能硬件”。3 D+ V: L' c. Y  M' j3 F+ |
嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等。特别是随着消费家电的智能化,嵌入式更显重要。: P2 F' T! a, h8 h# h
首先嵌入式技术主要分为嵌入式软件和嵌入式硬件2大方向。
5 W( u4 l( |7 W9 C1 s( M
嵌入式硬件方向
7 M" r  j1 Q9 k8 x7 \, Q! {- k3 a( T' K
嵌入式硬件工程师主要工作职责是为产品设计硬件电路原理图,设计硬件PCB板,选择合适的元器件,焊接调试硬件电路板,保证硬件电路板的可靠性、稳定性和抗干扰能力。因为现在集成电路发展迅速,大部分集成电路厂商都会提供参考电路,所以硬件电路原理图的设计相对来说比较简单,硬件工程师工作的含金量主要体现在产品的可靠性和稳定性设计、以及电磁兼容设计,这才是硬件设计工程师的含金量所在。一个资深的嵌入式硬件工程师年薪都在15万~40万之间。
6 D" V* O1 j  c' G* Q: x" {2 s/ k
要成为一个资深的嵌入式工程师相当难,一方面要有非常扎实的理论知识,同时也要有相当的那种大型的、高频CPU、多层PCB板的设计经验。嵌入式硬件工程师要学的课程主要有模拟电路设计、数字电路设计、电磁波理论等。熟悉常用的放大电路、滤波电路、电源电路设计和分析。
% }% m9 p1 G/ l% G; I6 Q
嵌入式软件方向 " o% c2 \. i) [+ q' L( P* E8 B+ i( J/ [
嵌入式软件工程师的职责主要是根据产品的功能需求设计好软件,让硬件工作起来。嵌入式电子产品硬件部分,大部分都是相同的,核心的都是由CPU、RAM和FLASH 几大部分组成,而软件就千差万别了。产品的具体功能都是由软件来实现的,一般来讲一个产品的实现,软件设计的工作量是硬件设计的4~5倍。所以一般情况下,一个公司的软件工程师数量是硬件硬件工程师的4~5倍,嵌入式软件工程师需求比硬件工程师大很多,同时跟硬件工程师相比,嵌入式软件工程师学起来相对容易些,所以这里21ic家重点和大家谈一下嵌入式软件工程的学习路线。 延伸阅读:《嵌入式有什么值得学习的软硬件技术?》、《嵌入式软件和硬件谁更重要?》。
4 H; P3 T, e" Z5 ]) Y6 \  o
02
嵌入式设计应具备的基本技能
; e8 K' c. o" G. v
1、Linux 基础6 {8 I( v9 y  u6 q
安装Linux操作系统Linux文件系统Linux常用命令Linux启动过程详解 熟悉Linux服务能够独立安装Linux操作系统,能够熟练使用Linux系统的基本命令 认识Linux系统的常用服务安装Linux操作系统 Linux基本命令实践 设置Linux环境变量 定制Linux的服务Shell 编程基础使用vi编辑文件 使用Emacs编辑文件 使用其他编辑器
' d3 F  V" c: c6 c1 p7 ?, ^
2、Shell 编程基础
$ A, G  n* |* n, O) B8 a
Shell简介认识后台程序Bash编程熟悉Linux系统下的编辑环境 熟悉Linux下的各种Shell 熟练进行shell编程熟悉vi基本操作 熟悉Emacs的基本操作 比较不同shell的区别 编写一个测试服务器是否连通的shell脚本程序 编写一个查看进程是否存在的shell脚本程序 编写一个带有循环语句的shell脚本程序
3 g. q9 n( y2 v: N& D
3、Linux下的C编程基础
* p: O" g/ x9 n: _! \
linux c语言环境概述 Gcc使用方法 Gdb调试技术 AutoconfAutomake Makefile 代码优化 熟悉Linux系统下的开发环境 熟悉Gcc编译器 熟悉Makefile规则编写Hello,World程序 使用 make命令编译程序 编写带有一个循环的程序 调试一个有问题的程序
' _" c- y, w2 a5 p
4、嵌入式系统开发基础/ B, s  d( r+ V6 D
嵌入式系统概述 交叉编译 配置TFTP服务 配置NFS服务 下载Bootloader和内核 嵌入式Linux应用软件开发流程熟悉嵌入式系统概念以及开发流程 建立嵌入式系统开发环境制作cross_gcc工具链 编译并下载U-boot 编译并下载Linux内核 编译并下载Linux应用程序6 s  y! i' ^7 d
5、嵌入式系统移植
* I+ n4 B/ M$ e: B8 w. {  W0 m
Linux内核代码 平台相关代码分析 ARM平台介绍 平台移植的关键技术 移植Linux内核到 ARM平台 了解移植的概念 能够移植Linux内核移植Linux2.6内核到ARM9开发板
; T* W/ i5 E& E3 p( h
6、嵌入式 Linux 下串口通信
8 P% F  g" h- r! e
串行I/O的基本概念 嵌入式Linux应用软件开发流程 Linux系统的文件和设备 与文件相关的系统调用 配置超级终端和MiniCOM 能够熟悉进行串口通信 熟悉文件I/O 编写串口通信程序 编写多串口通信程序
) C/ @. `5 \6 L3 g1 u
7、嵌入式系统中多进程程序设计
9 T. W* u( A! e7 y4 q% S
Linux系统进程概述 嵌入式系统的进程特点 进程操作 守护进程 相关的系统调用了解Linux系统中进程的概念 能够编写多进程程序编写多进程程序 编写一个守护进程程序 sleep系统调用任务管理同步与通信Linux任务概述任务调度 管道 信号 共享内存 任务管理 API 了解Linux系统任务管理机制 熟悉进程间通信的几种方式 熟悉嵌入式Linux中的任务间同步与通信编写一个简单的管道程序实现文件传输 编写一个使用共享内存的程序
# J, {, F* ^+ G& Z$ j& @3 R
8、嵌入式系统中多线程程序设计
, U% |4 ^( K, ^& l" l7 c6 U# I
线程的基础知识 多线程编程方法 线程应用中的同步问题了解线程的概念 能够编写简单的多线程程序编写一个多线程程序$ x& S  m2 b' Y. [7 P6 U
03
嵌入式软件工程师学习流程

% w9 F: l1 d: w  h! Q, y6 Z8 m
第一部分:Linux平台搭建与环境熟悉
  p  e- s: O" r) |" ^% j
了解linux系统;区分各种版本的Linux系统,以便于拓展 Linux视野。
5 U5 ^  u7 t* a2 t9 a
1、Linux 简介;2、Linux 系统的主要特点;3、Linux 的组成;4、主要的 Linux 版本;5、嵌入式 Linux简介与发展
) _' P# }( O" x3 b+ H
第二部分:虚拟机安装和LINUX系统安装
# q" J5 ~* y; r4 P
1、虚拟机安装;2、Linux系统的安装;3、Linux系统的常用软件的安装;4、Linux快速入门5、 熟悉运用 Linux环境下,常用命令的操作与系统设置,如常用的 Shell;掌握基本的Shell 应用' p0 N! _5 u) m5 Q- Q; G0 r
第三部分:嵌入式LINUX环境搭建
/ n8 @8 H) |  b! K8 f
1、 建立嵌入式 Linux开发环境2、 熟悉嵌入式开发平台3、 嵌入式 Linux开发工具4、 Linux下的调试技巧5、 MAKE工程管理器6、 硬件环境的搭建;arm-linux-gcc与 gcc安装配置) N1 ]( ?* [9 a9 v3 C9 s  t( B7 J( d
第四部分:U-Boot1 g6 \: j  c# q' T# V6 T8 S9 U
了解 U-Boot 的作用及工作流程;了解Bootloader 的代码结构、编译过程;移植U-Boot;掌握常用的U-Boot命令。
+ M3 ]  J5 ?/ |* _% K
1、 Bootloader介绍2、 u-boot工程介绍3、 u-boot的编译使用4、 u-boot源码分析5、 u-boot资源分配6、 配置编译u-boot7、 u-boot移植过程8、 u-boot常用命令操作9、 添加u-boot新命令10、设置u-boot环境变量11、 u-boot驱动添加如网卡:DM9000* g! t) W) H, P9 k) J7 ?3 K4 U
第五部分:LINUX内核移植
0 Y" Z3 U+ n) T$ E+ x! f/ r7 h5 k
熟悉内核的原码结构和kbuild Makefile语法;掌握和内核、驱动模块编译相关的原理及方法。
2 P, ?# ]/ r5 Y8 W. E2 @9 u; ~% }. c
1、Linux内核介绍2、Linux内核特点3、Linux内核源代码结构4、Linux内核选项解析5、Linux内核编译链接6、内核模块编译、使用方法
; D; @+ k& H- P4 {) o, t
第六部分:LINUX根文件系统) q) x+ o2 d; U
1、busybox 包移植、编译2、Linux跟文件系统制作过程3、根文件系统介绍4. nfs文件服务器系统搭建9 \, ?& O% ]( j
第七部分:LINUX应用学习; _* r/ Q3 X. m, k
嵌入式Linux应用开发和系统开发是嵌入式Linux中最重要的一部分,也是企业人才需求最广的一部分。) A' w' F1 o* B( o+ d; d" x
主要目标是精通嵌入式Linux下的程序设计,熟练掌握嵌入式Linux的开发环境、系统编程以及网络编程,熟悉C++、QT编程并且深刻体会整个嵌入式Linux项目开发流程,强化学员对Linux应用开发的能力。
! d! C. N( H/ M) [* _
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、文件读写与存储
+ P/ O0 D$ b5 J. r& r7 T0 O
04
嵌入式软件工程师的内功修炼
+ q$ Q8 p8 Y2 V+ j8 |2 Q

9 A1 @5 Q; c% h
所谓嵌入式软件开发,抽象的讲,就是在专用的硬件平台借助宿主机交叉编译环境通过编程、编译、链接下载、调试达到目标需求;往细了分,嵌入式软件开发可分为嵌入式驱动设计师(向下根据接口协议驱动硬件设备,向上提供应用API),嵌入式系统设计师(编写固件程序,设计操作系统内核或文件系统,根据不同硬件平台移植操作系统,优化系统功能),嵌入式界面设计师(嵌入式硬件平台的上位机GUI设计,人机交互),嵌入式应用设计师(裸机或操作系统移植调度驱动API按照一定的算法逻辑实现相应的需求功能),嵌入式算法设计师(把相关数学算法设计成软件程序精准优化系统功能,如PID控算、卡尔曼滤波算法、低通滤波等)。
1 H2 D9 S; B; w# ]2 ?
C语言就是嵌入式软件的内功,21ic家也曾经多次强调。相信大家都看过武侠小说或电视,金老前辈的甚是出名,里面有“天下武功出少林”一说,为什么呢?; J7 a( M6 U! V7 \$ ^+ I: F+ Z
就是因为少林有一本《易筋经》,“扫地僧”也就是当时江湖的大神,学了易筋经的人想再学其他武功可谓是游刃有余,就像《射雕英雄传》的郭靖郭大侠因为修炼了全真教马钰道长的内功,再学洪七公、老顽童等的外功就很简单了,而C语言就是所有各种编程语言(像Python、Java、C++、PHP、JavaScript等等)里面的“易筋经”,达到精通C的境界,再学其他就很简单了,因为C要整明白,必须了解底层、明白计算机系统的运行机制,当然一个没学过汇编的人不能真正掌握C语言的真谛。7 f, k  n% r1 m, Z6 H% n9 B
在如今Python、Java编程语言火热的市场前景下,资深工程师的建议是,在学校读书真心想搞IT技术,从C语言学起,会受益终生的。
3 p4 B& B7 s! F7 G
学习C语言难吗?资深工程师表示:不难。真正懂得用C语言难吗?--难,但是按照心法不断去实践会化解“难”这颗顽石。现在对C语言水平层次的定义有几阶:入门、掌握、熟悉、精通。现在很多一线的软件工程师都是至多在“熟悉”的水平阶上。
" z: b4 c: Y! J4 h( j0 N# H内功心法:用数学思维抽象化去学习,多编程、多调试、多实际应用,多看高手写的优秀代码,可以尝试去写写RTOS内核;知错就改,温故知新,不断学习

( m# K; U7 m, w0 ?! t2 C& ~. S
内功大纲:结构体、数组、指针、函数、内存管理
- I" t/ f% }$ y0 }
  • 深度理解ANSI标准定义的C语言预处理指令用法,文件结构问题
  • 明确定义及声明,深度解析C语言的32个关键字,sizeof是关键字
  • 标准C语言的20个基本符号深度熟练怎么用,还有表达式的优先级问题
  • 深度理解内存管理与内存泄漏问题,野指针的问题,栈、堆、静态区的问题
  • 深度解析指针和数组的内存布局,它们之间的相互访问形式以及地址的强制转换        ,还有多维数组和多级指针问题
  • 深度理解函数设计的原则和技巧,养成良好的编程风格和编程习惯9 `0 N+ w* w) S$ e3 Q/ s/ r

& ^2 b( c3 Y, F4 w9 Z
顺便提提软件面试一般考察的问题,也就是面试官想通过面试了解的问题:
- x3 C; H, W2 j; _0 p/ Y

0 Q# c8 N6 m- l  d: ?, o
  • 在需求实现的前提下,看你的编程风格;
  • 编程逻辑不可能一步到位,很多时候需要不断修改,看你出错问题的处理能力;
  • 对你代码算法复杂度进行分析,是否提高系统性能。
    - j- ?; [$ c7 m$ h

      j* q- ]# A; k. s0 c. I
05
嵌入式软硬件界限又不是那么深
; O& K: ^9 ]" Q  ~0 L
1 \+ c" ]6 h8 m9 b
2 m" u9 M& l* ^6 M7 _
嵌入式系统的应用范围可以粗略分为两大类:
* _  ]1 D( |1 G1 E; t5 s(1)电子系统的智能化(工业控制,现代农业、家用电器、汽车电子、测控系统、数据采集等等);
% q# S% q, V4 U3 ?* ~& Y& d
(2)计算机应用的延伸(MP3、手机、通信、网络、计算机外围设备等)。从这些应用可以看出,要完成一个以MCU为核心的嵌入式系统应用产品设计,需要有硬件、软件及行业领域相关知识。硬件主要有MCU的硬件最小系统、输入/输出外围电路、人机接口设计。软件设计有固化软件的设计,也可能含PC机软件的设计。行业知识需要通过协作、交流与总结获得。
4 x1 Q8 k  z  h+ a) k
概括地说,学习以MCU为核心的嵌入式系统,需要以下软件硬件基础知识与实践训练:8 |& \. V5 y0 s, q  W
1:硬件最小系统(包括电源、晶振、复位、写入调试接口);2:通用I/O(开关量输入/输出,涉及各种二值量检测与控制);3:模数转换A/D(各种传感器信号的采集与处理,如红外、温度、光敏、超声波、方向等等);4:数模转换D/A(对模拟量设备利用数字进行控制);5:通信(串行通信接口SCI、串行外设接口SPI、集成电路互联总线I2C,CAN、USB、嵌入式以太网、ZigBee技术等);6:显示(LED、LCD等等);7:控制(控制各种设备,包含PWM等控制技术);8:数据处理(图形、图像、语音、视频等处理或识别);9:各种具体应用。
( B! r& H3 n+ u% A
事实上,万变不离其宗,任何应用都可以归入这几类。而应用中的硬件设计、软件设计、测试等都必须遵循嵌入式软件工程的方法、原理与基本原则。所以,嵌入式软件工程也是嵌入式系统知识体系的有机组成部分,只不过,它融于具体项目的开发过程之中。21ic家多次强调,虽然嵌入式工程师有软件和硬件工程师的分别,但是其实对于嵌入式工程师来说,两手都要硬,只不过相关领域工程师的深浅不同。更多相关内容可以在21ic中国电子网查阅查看。
! N; `. ~) q. k
以上实践训练涉及硬件基础、软件基础及相关领域知识。计算机语言、操作系统、开发环境等均是完成这些目的的工具。有些初学者,容易把工具的使用与所要达到的真正目的相混淆。例如,有的学习者,学了很长时间的嵌入式操作系统移植,而不进行实际嵌入式系统产品的开发,到了最后,做不好一个嵌入式系统小产品,偏离了学习目标,甚至放弃了嵌入式系统领域。这就是进入了嵌入式系统学习误区的情况,下面对此做一些分析。
5 k8 a2 E9 D9 W7 b' k! z
06
嵌入式系统的学习误区

6 H( g( S8 d! H
关于嵌入式系统的学习方法,因学习经历、学习环境、学习目的、已有的知识基础等不同,可能在学习顺序、内容选择、实践方式等方面有所不同。但是,应该明确哪些是必备的基础知识,哪些应该先学,哪些应该后学,哪些必须通过实践才能获得的,哪些是与具体芯片无关的通用知识,哪些是与具体芯片或开发环境相关的知识。8 J7 b  y& ?' V2 ?
由于微处理器与微控制器种类繁多,也可能由于不同公司、不同机构出于自身的利益,给出一些误导性宣传,特别是我国嵌入式微控制器制造技术的落后及其他相关情况,使得人们对微控制器的发展,在认识与理解上存在差异。导致一些初学者,进入了嵌入式系统的学习误区,浪费了宝贵的学习时间。下面分析初学者可能存在的几个误区。
- U9 T8 X( n; X0 N6 o
如果说,学习嵌入式系统不是为了开发其应用产品,那就没有具体目标了,许多诸如学习方法问题也就不必谈了。实际上,这正是许多人想学,又不知从何开始学习的关键问题所在,不知道自己学习的具体目标。于是,看了一些培训广告,看了书店中书架上种类繁多的嵌入式系统的书籍,或上网以“嵌入式系统”为关键词进行查询,然后参加培训或看书,开始“学习起来”。对于有计算机阅历的人,往往选择一个嵌入式操作系统就开始学习了。不好听的比喻,有点象“瞎子摸大象”,只了解其一个侧面。这样如何能对嵌入式产品的开发过程有个全面了解呢?针对许多初学者选择“xxx嵌入式操作系统+xxx处理器”的嵌入式系统入门学习模式,我认为是不合适的。我的建议是:首先把嵌入式系统软件与硬件基础打好了,再根据实际需要,选择一种实时操作系统(RTOS)进行学习实践。要记住:RTOS是开发某些类嵌入式产品的辅助工具,是手段,不是目的。许多类嵌入式产品,并不需要RTOS。所以,一开始就学习RTOS,并不符合学习“由浅入深、循序渐进”的学习规律。& U" ?4 }8 k) E
RTOS本身由于种类繁多,实际使用何种RTOS,一般需要工作单位确定。基础阶段主要学习RTOS的基本原理与在RTOS之上的软件开发方法,而不是学习如何设计RTOS。以开发实际嵌入式产品为目标的学习者,不要把过多的精力花在设计或移植RTOS上面。正如很多人使用Windows操作系统,而设计Windows操作系统只有Microsoft。许多人“研究”Linux,但不使用它,浪费时间了,人的精力是有限的,学习必须有所选择。
5 w1 i5 P- D& w' O) H1 I6 ]
硬件与软件的困惑) d* A# M( x- }5 I: r
以MCU为核心的嵌入式技术的知识体系必须通过具体的MCU来体现、实践与训练。但是,选择任何型号的MCU,其芯片相关的知识只占知识体系的20%,80%是通用知识。但是80%的通用知识,必须通过具体实践才能进行,所以学习嵌入式技术要选择一个系列的MCU。但不论如何,系统含有硬件与软件两大部分,它们之间的关系如何?! o! r3 X2 z+ e/ v. I
有些学者,仅从电子角度认识嵌入式系统。认为“嵌入式系统=MCU硬件系统+小程序”。这些学者,大多学习背景是具有良好的电子技术基础知识。实际情况是,早期MCU内部RAM小、程序存储器外接,需要外扩各种I/O,没有象现在这样USB、嵌入式以太网等较复杂的接口,因此,程序占总设计量小于50%,使人们认为嵌入式系统(单片机)是“电子系统”,以硬件为主、程序为辅。但是,随着MCU制造技术的发展,不仅MCU内部RAM越来越大,Flash进入MCU内部改变了传统的嵌入式系统开发与调试方式,固件程序可以被更方便地调试与在线升级,许多情况与开发PC机程序方便程度相差无几,只不过开发环境与运行环境不是同一载体而已。这些情况使得嵌入式系统的软件硬件设计方法发生了根本变化。5 s5 |8 ~) a7 V7 g2 T
有些学者,仅从软件开发角度认识嵌入式系统,甚至有的仅从嵌入式操作系统认识嵌入式系统。这些学者,大多具有良好的计算机软件开发基础知识,认为硬件是生产厂商的事,没有认识到,嵌入式系统产品的软件与硬件均是需要开发者设计的。我常常接到一些关于嵌入式产品稳定性的咨询电话,发现大多数是由于软件开发者对底层硬件的基本原理不理解造成的。特别是,有些功能软件开发者,过分依赖于底层硬件的驱动软件设计完美,自己对底层驱动原理知之甚少。实际上,一些功能软件开发者,名义上再做嵌入式软件,实际上,仅仅使用嵌入式编辑、编译环境而已,本质与开发通用PC机软件没有两样。7 B0 ?/ |/ q. ~9 \# @
而底层硬件驱动软件的开发,若不全面考虑高层功能软件对底层硬件的可能调用,也会使得封装或参数设计得不合理或不完备,导致高层功能软件的调用困难。从这段描述可以看出,若把一个嵌入式系统的开发孤立地分为硬件设计、底层硬件驱动软件设计、高层功能软件设计,一旦出现了问题,就可能难以定位。实际上,嵌入式系统设计是一个软件、硬件协同设计工程,不能象通用计算机那样,软件、硬件完全分开来看,要在一个大的框架内协调工作。 面对学习嵌入式系统以软件为主还是以硬件为主,或是如何选择切入点,如何在软件与硬件之间取得一些平衡。对于这个困惑的建议是:要想成为一名真正的嵌入式系统设计师,在初学阶段,必须重视打好嵌入式系统的硬件与软件基础。以下是从事嵌入式系统设计二十多年的一个美国学者John Catsoulis 在《Designing Embedded Hardware》一书中关于这个问题的总结:嵌入式系统与硬件紧密相关,是软件与硬件的综合体,没有对硬件的理解就不可能写好嵌入式软件,同样没有对软件的理解也不可能设计好嵌入式硬件。3 H$ l6 r0 J! I3 t7 m
嵌入式系统产品种类繁多,应用领域各异。在2.1小节中,我们把嵌入式系统的应用范围粗略分为电子系统的智能化与计算机应用的延伸两大类,从初学者角度,可能有分别从这两个角度片面认识嵌入式系统的问题。因此,一些从电子系统智能化角度认识嵌入式系统的学习者,可能会忽视编程结构、编程规范、软件工程的要求、操作系统等知识的积累。另一些从计算机应用的延伸角度认识嵌入式系统的学习者,可能会把通用计算机学习过程中的概念与方法生搬硬套到嵌入式系统的实践中,忽视嵌入式系统与通用计算机的差异。
4 t2 V8 F' g( G8 q' A
实际上,在嵌入式系统学习与实践的初始阶段,应该充分了解嵌入式系统的特点,根据自身的已有知识结构,制定适合自身情况的学习计划。目标应该是打好嵌入式系统的硬件与软件基础,通过实践,为成为良好的嵌入式系统设计师建立起基本知识结构。学习过程,可以通过具体应用系统为实践载体,但不能拘泥于具体系统,应该有一定的抽象与归纳。例如,有的初学者开发一个实际控制系统,没有使用实时操作系统,但不要认为实时操作系统不需要学习。又例如,有的初学者以一个带有实时操作系统的样例为蓝本进行学习,但不要认为,任何嵌入式系统都需要使用实时操作系统,甚至把一个十分简明的实际系统加上一个不必要的实时操作系统。因此,片面认识嵌入式系统,可能导致学习困惑。应该根据实际项目需要,锻炼自己分析实际问题、解决问题的能力。这是一个比较长期的学习与实践过程,不能期望通过短期培训完成整体知识体系的建立,应该重视自身实践,全面地理解嵌入式系统的知识体系。
2 n4 O" o( h$ f* d. K1 }6 u
嵌入式系统的大部分初学者需要选择一个微控制器(MCU)进行入门级学习,面对众多厂家生产的微控制器系列,不知如何是好。$ A3 e# M1 M5 l6 J1 C' V4 x
首先是关于位数问题,目前主要有8位、16位、32位,面对嵌入式系统应用的多样性,不同位数的MCU各有应用领域,这一点与通用微机有很大不同。你做一个遥控器,不需要使用一个32位MCU,可能一个MCU芯片价格已经超过遥控器价格需求。对于首次接触嵌入式系统的学习者,可以根据自己的知识基础选择入门芯片的位数。建议大多数初学者,可以选择一个8位MCU作为快速入门芯片,了解一些汇编与底层硬件知识,之后再选一个16位或32位芯片进行学习实践。6 k/ _% ~3 E6 @9 u& A2 F3 ~) V
关于芯片选择的另一个误区,认为有“主流芯片”存在,嵌入式系统也可以形成芯片垄断。这完全是一种误解,是套用通用计算机系统的思维模式,而忽视了嵌入式系统应用的多样性。5 r5 q1 x$ X* ^  D6 r' R
关于学习芯片选择还有一个误区,是系统的工作频率。误认为选择工作频率高的芯片进行入门学习,表示更先进。实际上,工作频率高可能给初学者带来学习过程中的不少困难。7 n' W6 u, a/ D! L) q* e/ C5 B
实际嵌入式系统设计不是追求芯片位数、工作频率、操作系统等因素,而是追求稳定可靠、维护、升级、功耗、价格等指标。而初学者选择入门芯片,是通过某一MCU作为蓝本获得嵌入式系统知识体系的通用基础,其基本原则是:入门时间较快、硬件成本较少,知识要素较多,学习难度较低。5 b/ e* L( F0 L9 T: H+ h
07基础阶段的学习建议
7 L; |$ B: i& N, x6 L$ j

( \( W3 }$ C" M% L
基于以上讨论,21ic家总结了渴望学习嵌入式系统的学子提出几点基础阶段的学习建议:
3 o: Z( ~. V. p! {0 d
(1)嵌入式系统软件硬件密切相关,一定要打好软件硬件基础。其实,只要找到正确的方法,加上努力,任何理工科学生,甚至非理工科学生,都能学好嵌入式系统。
  ?& E1 M7 w. y2 n/ o& M
(2)选择一个芯片及硬件评估板(入门芯片最好是简单一点,例如8位MCU)、选择一本好书(最好有规范的例子)、找一位好老师(最好是有经验且热心的)。硬件评估板的价格一定要在1000元以下,不要太贵,最好能有自己动手的空间。不花一分硬件钱,要想学好嵌入式系统不实际。因为,这是实践性很强的学科。好书,可以使你少走弯路,不会被误导,要知道有的书是会使人进入学习误区的。好老师也可以是做过一些实际项目的学长(一定要找做过几个成功项目的学长或老师做指导,否则,经验不足也可能误导),有教师指导,学习进程会加快(人工智能学科里有个术语叫无教师指导学习模式与有教师指导学习模式,无教师指导学习模式比有教师指导学习模式复杂许多)。: e( `" Z& p# t( I1 G
(3)许多人怕硬件,其实嵌入式系统硬件比电子线路好学多了。只要深入理解MCU的硬件最小系统,对I/O口、串行通信、键盘、LED、LCD、SPI、I2C、PWM、A/D(包括一些传感器)、D/A等逐个实验理解,逐步实践。再通过自己做一个实际的小系统,底层硬件基础就有了。各个硬件模块驱动程序的编写是嵌入式系统的必备基础。学习嵌入式系统的初期,这个过程是必须的。
; I  @5 Z! i7 V7 e' p2 a6 O5 p  \
(4)至于嵌入式实时操作系统RTOS,一定不要一开始就学,这样会走很多弯路,也会使你对嵌入式系统感到畏惧。等你软件硬件基础打好了,再学习就感到容易理解。实际上,众多嵌入式应用,并不一定需要操作系统。也可以根据实际项目需要再学习特定的RTOS。一定不要被一些嵌入式实时操作系统培训班宣传所误导,而忽视实际嵌入式系统软件硬件基础知识的学习。
9 x/ v9 W2 O4 n, Y8 }! e+ \
(5)要避免片面地单纯从“电子”或“计算机软件”角度认识嵌入式系统。前面说过,嵌入式系统是软件与硬件的综合体。因此,要逐步从MCU的最小系统开始,一点一点理解硬件原理及底层硬件驱动编程方法。要通过规范的例子,理解软件工程封装、可复用等思想。通过规范编程,积累底层构件(Component),也就是一个一个模块,但是要封装得比较好,可复用。9 |; v" R8 f. W: b3 F; w- y
(6)注重实验与实践。这里说的实验主要指通过重复或验证他人的工作,目的是学习基础知识,这个过程一定要经历。实践是自己设计,有具体的“产品”目标。如果你能花500元左右自己做一个具有一定功能的小产品,且能稳定运行1年以上,就可以说接近入门了。
2 J( x9 }  p1 a, B  j1 ^, r: w
(7)关于入门芯片的选择。不要选太复杂的微控制器作为入门芯片,不能超越学习过程。不要一下子学习几种芯片,可以通过一个芯片入门并具有一个实践经验后,根据实际需要选择芯片开发实际产品。注意,不要把微处理器(MPU)与微控制器(MCU)概念相混淆,微处理器只是微控制器的内核。; O- v+ l: F( `' i
(8)关于操作系统的选择。可以等到你具有一定实践后,选择一个简单容易理解原理的进行学习,不要一开始就学习几种操作系统,理解了基本原理,实践中确有实际需要再学习也不迟。人总是要不断学习的。* N5 o+ X8 d) M( g$ g7 O' f9 m
(9)关于汇编与C语言的取舍。随着MCU对C编译的优化支持,对于汇编可以只了解几个必须的语句,直接使用C语言编程。但必须通过第一个程序理解芯片初始化过程、中断机制、程序存储情况等区别于PC机程序的内容。另外,为了测试的需要,最好掌握一门PC机编程语言。6 O" k$ T0 H" [( H/ I
(10)要明确自己的学习目的,并注意学习方法。关于学习目的要明确是打基础,还是为了适应某些工作而进行的短训;而学习方法方面,要根据学习目的选择合适的学习途径,注意理论学习与实践、通用知识与芯片相关知识、硬件知识与软件知识的平衡,要在理解软件工程基本原理基础上理解硬件构件与软件构件等基本概念。
6 p8 ?) p: b' m4 d
以上建议,仅供参考。 当然,以上只是基础阶段的学习建议,要成为良好的嵌入式系统设计师,还需要在实际项目中锻炼,并不断学习与积累经验。如果还没有看够,可以在21ic中国电子网的专栏进行查阅。
9 t' P% F# O) m  A* ^
附:嵌入式 Arm Linux 入门必读书籍推荐6 t: m0 i' _7 g& k9 M
: {0 I) `" J# q
1、Linux基础入门
5 d& f( L$ w+ g
  • 《笨办法学 Linux 》
  • 《嵌入式 Linux 基础教程》
  • 《Linux 就该这么学》
  • 《Linux C 编程一站式学习》
  • 《嵌入式 Linux 开发教程》
  • 《鸟哥的 Linux 私房菜》
  • 《Linux 自学大全》
  • 《ARM嵌入式 Linux 系统开发从入门到精通》
  • 《ARM Linux 入门与实践》* G. ?" A7 n) ~1 h! c
: c% G6 c. C8 g. Q1 ?
2、Linux 系统环境
9 ^' A) V8 ^, N% i# F
  • 《LINUX命令行与SHELL脚本编程大全》第三版
  • 《Shell 编程大全》
  • 《Shellbook》
  • 《Shell 命令行操作》3 X" S8 S( L& D

% u9 B* m' J  y) @3 D9 z$ L: z
3、Git 版本管理
/ k) I( X7 r% t* |/ Q( Z9 S1 g
  • 《GitHub 入门与实践》
  • 《Pro Git》第二版
    + t* q/ q3 R+ K1 |$ M7 H
. U5 {, H8 V: @) ]- ?2 J
4、C 语言和汇编
8 M; E' y1 c+ ]
  • 《C 和 指针》
  • 《C 语言深度剖析》
  • 《高质量C++编程指南》
  • TheCprogramminglanguage《C程序设计语言》
  • Ctrapsandpitfalls《C陷阱与缺陷》
  • ExpertCLanuage《专家C编程》
  • WritingCleanCode-----MicrosoftTechiniquesforDevelopingBug-freeCPrograms《编程精粹--Microsoft编写优质无错C程序秘诀》
  • ProgrammingEmbeddedSystemsinCandC++《嵌入式系统编程》
  • 《高质量C++/C编程指南》林锐 * w! {, |# b( L# V* {/ ?0 n* R2 y

# A. _, K; }0 ]1 [8 s
5、Arm 体系结构
( f+ T  t9 t( K3 R# v1 H" V8 i, R
  • 《ARM 嵌入式系统开发-软件设计与优化》
  • 《ARM系列处理器应用技术完全手册》
  • ARM 官方文档
  • 编程指南:2 M+ H: T2 |. `/ x
    • 《The_Definitive_Guide_to_ARM_Corte_M3&M4》
    • 《Arm Cortex-A 编程指南》
    • 《Armv8-A 编程指南》4 |) S9 E8 i3 @& K
, H& [' q" {. l' L5 O6 {
6、Linux 应用编程0 ?" u) b: m$ u6 B9 t9 ^0 T1 q
  • 《Linux 环境编程:从应用到内核》
  • 《GNU Linux 编程指南》
  • 《Linux 程序设计》
  • 《Linux 系统编程》
  • 《UNIX 环境高级编程》) Y7 m+ G3 K9 Q( R
0 a9 }8 s7 _& u( H
6、Linux 内核基础原理
# R0 ?& L1 o1 G1 }; j3 {% L# Q) X+ u
  • 《Linux 内核设计与实现》
  • 《Linux 设备驱动程序》
  • 《深入 Linux 内核架构》
  • 《深入Linux 设备驱动程序内核机制》
  • 《Mastering Linux Kernel Development》
    3 r# ^  h9 Y# o2 x

) I6 b. b# P: t( L
7、Linux 内核开发与实践9 m' C; K/ `' A& M7 V$ C
  • 《Linux 设备驱动开发详解》
  • 《精通 Linux设备驱动开发》
  • 《嵌入式 Linux 基础教程》
  • 《构建嵌入式 Linux 系统》
  • 《深入 Linux 内核架构》
  • 《Linux 内核完全注释(带源码中文注释)》
  • 《一幅漫画解读 Linux 内核》
  • 《快速理解什么是 Linux 内核》
  • 《嵌入式 Linux 框架的理解》/ G/ _: C/ p: L  N7 E$ r. [

      S$ _/ A* |% d" S9 w9 Z
8、Linux应用开发5 b( n% `4 E# Y+ s
  • 《韦东山嵌入式 Linux 应用开发完全手册》
  • 《Linux 学习资料(华为)》
  • 《树莓派开始,玩转 Linux》
  • 《书单:顶级Linux大神告诉你该看哪些书》
  • 《给编程初学者的7本书+高级Linux编程(开源书下载)
    % D6 b# p" {5 m. {) a
: b' c5 t0 x( e4 w) J0 b
9、操作系统理论与基础
8 ^; \5 G( W" t4 Z1 B4 i$ @
  • 《深入理解计算机系统》
  • 《Operating Systems:Three Easy Pieces》
    * _) f' @6 P; u: Y, U7 Q9 @, W4 Q

" d% y/ U( o9 `* f2 @$ k. c
收藏 1 评论0 发布时间:2020-10-10 17:51

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版