发布时间:2024-09-13
浏览次数:0
嵌入式系统是一个很宽泛的定义,从技术角度可以分为硬件层、驱动层、系统层、应用层,硬件层就是原理图、PCB图、电路板等。
驱动层的主要工作是读写MCU的寄存器,使用总线,操作传感器等外设,简单来说就是编写直接操作硬件的代码。
系统层把前面的驱动层封装起来,做一个接口(驱动接口),加上进程控制、内存管理、文件系统、网络通信等,再把这些东西封装起来,最后给应用层提供一个接口。当然,嵌入式系统是特殊的设备,功能是可以裁剪的,不一定都有上面五个东西。
应用层,凡是涉及到人机交互界面的都属于这一层,其中之一就是手机开发。
我们现在把在驱动和硬件两个层面做成的产品叫做智能硬件。
例如无人机:
简单来说,无人机就是硬件层+驱动层,应用层可能有操作系统、人机界面。
一个智能插座无非就是单片机+继电器+手机APP。
嵌入式系统有广义和狭义之分,广义的嵌入式系统指片上系统,包括单片机、PSOC、NIOS等,狭义的嵌入式系统指运行操作系统的特定芯片如ARM9、A8等sublime text ubuntu,本文主要介绍狭义嵌入式系统的学习路径。
还是主流方法,先学会使用,再深入底层。
常用的嵌入式操作系统有Linux、WIN CE、、QNX、OSE等,目前资料最多的是Linux,因此下面就以Linux为例。
1.安装虚拟机及Linux系统
大多数人的电脑都会安装操作系统,如果想在上面运行其他系统,就得安装虚拟机了。目前主流的虚拟机有、、、等,随便选一个安装即可。然后去官网下载个人版Linux镜像(.iso文件),在虚拟机里安装。下面是主流Linux系统的官网链接:、、、、、suse。如果你没用过Linux,建议使用。因为是收费的,而且改名为RHEL,这里就不介绍了。
2. 学习使用常见的 Linux 命令
这里要改掉点鼠标的习惯,在Linux下做事情都要用命令行。另外在Linux下下载软件的时候,不用百度下载,用Linux自带的包管理工具(如:apt-get、dnf、rpm等),如果用的话要修改软件源(下载软件的网站),因为国外的源比较慢,百度有详细的使用说明。接下来要学会最基本的命令,如:ls、cd、find、grep、ps、diff、fdisk等,照着教材多操作几遍,就能学会。不需要很深的理论知识,不需要掌握所有的命令,也不需要记住所有的命令选项,用到的时候查查就行,有时间的话可以去社区或者Linux公社看看。
3. 学习使用常见的 Linux 工具
1.编辑器(写代码必备)。有gedit,vim,emacs等,建议学习vim。
2. gcc 和 gdb。gcc 是一个编译器,而 gdb 是一个代码调试器。
3.这个不像VC++6.0sublime text ubuntu,点一下鼠标就能帮你编译,在Linux下,必须用make和make工具才能编译,make和make可以自动生成。
4. ssh、tftp。如果你的ARM开发板上有web服务器,可以使用这些工具来访问。其中,建议使用ssh工具或者。
5、Samba.如果你想要使用Linux来交换数据,也可以搭建Samba服务器。
6.版本控制器。有svn,cvs,git等。建议学习git。有了git,就不用手动备份代码了。
4.学习编写shell脚本
实际工作中,复杂的系统管理操作并不是一行一行敲命令就能搞定的,而是使用脚本(命令是基础)。脚本也是一种编程语言,只不过是解释型语言,相对于C/C++、C#、JAVA等高级语言来说,脚本要容易学得多(因为加入了语法糖)。Linux下,shell有很多种,比如bsh、bash、csh、tcsh、ksh、zsh等,一般学完bash,再学其他的也不迟,因为都差不多。另外bash语法比较奇特,很多符号(如:$#、$0、$?等)比较难记,不过也没必要刻意去死记硬背,留个印象就行,需要用的时候再查手册就行。这里重点说一下掌握正则表达式,如果有时间,建议再学一下脚本。它的语法比 bash 更简单,用途也更广泛。
5.学习Linux下的C编程
虽然学了bash能干很多事,但是驱动和内核开发还是用C语言,因为那时候系统还没起来,还不能用bash。另外C语言的执行效率比bash高,网络编程也经常用C语言开发。这里要掌握基本的文件操作,进程/线程控制等。我推荐《Linux环境C编程》、《UNIX环境高级编程》、《UNIX网络编程卷一》、《UNIX网络编程卷二》。这些教材可能有点难,但是请不要钻牛角尖,暂时不懂的就跳过,学完下一阶段的理论再回来看,之前不懂的就变得容易了。
6.增强理论知识
因为有些人冒充嵌入式硬件工程师,但其实嵌入式硬件就是普通硬件工程师干的活,我们这里讨论的是软件,嵌入式就是以软件为主(薪资差别很大)。
1.单片机。如果不想学单片机,可以学计算机组成原理。
2.数据结构。主要掌握表和树,其中链表用于操作系统的调度算法。
3.操作系统。都很重要,必须深入学习,才能更全面地了解Linux。
4. 编译器原理。有时间的话,最好多看一看。没时间的话,也学一下。对提高编程水平很有帮助。
5. 数据库。除了基本的数据库理论之外,你还必须掌握或。
6. ARM架构。本章主要介绍ARM的架构和指令集,在移植uboot和驱动的时候会用到。如果不做这两项工作的话,可以不用学。
7、计算机网络基础。开发中用到的TCP、UDP、SSH、TFTP、HTTP、RTP都会涉及到网络相关的知识,也就是编程。
8、接口应用。如:串口、IIC、SPI、1-wire、USB、HDMI、CAN、IIS、PCIE、蓝牙、陀螺仪等。
在学习完上面的理论之后,再回顾一下Linux下的C编程,你会收获更多。
后面的第七、八、九阶段,大家使用开发板自带的就可以了,暂时不用研究。
7.文件系统
在学习操作系统原理的时候,文件系统已经介绍过了,没必要深究文件系统的具体算法,只要了解它的特性,然后学会使用它就行了。例如:NFS、FAT32、NTFS、ext4、ZFS等。
8. 内核修剪
一般对于初学者来说,可以先掌握内核裁剪(具体工作就是填写几个选项)。裁剪只是将内核不必要的功能移除,以减少代码大小。这里只需要熟悉内核的所有功能选项即可。如果裁剪还是不能满足要求,那就得阅读内核源码,修改内核了。我推荐《Linux入门》和《Linux阅读内核源码》,推荐还是。
9. 驱动程序开发
由于系统还没起来,驱动能用的API还不多(部分是内核API,如:等),很多函数还是要自己写。其中临界资源会经常被访问,所以自旋锁、睡眠锁一定要掌握。另外,驱动出了问题,整个系统就挂了,所以还必须掌握各种调试驱动的方法,如:goto语句、日志系统、KDB等。接下来还要熟悉字符设备和块设备的驱动。推荐《小白的博客》和《Linux》(中文版不推荐)。
10.移植
单片机也有,keil C下的.a51,主要用于初始化。嗯,ARM上功能也差不多,也不是那么重要,所以放在最后。常用的有vivi和uboot。一般学习uboot主要还是掌握uboot的启动流程和移植。经过前面的学习,uboot对你来说会非常轻松。一般你只需要学会如何使用uboot或者使用已经移植好的uboot,不需要深入研究。建议看uboot自带的帮助文档和《深入理解》。阅读uboot源码,推荐还是。
11.图形界面开发
常用的GUI图形库有:GTK++、QT、JAVA、等。如果有C++基础,建议学QT,如果不懂C++,建议学JAVA。GUI开发初期不需要用开发板,2440跑QT就很合适。如果要跑JAVA或者,建议换开发板,可以考虑换开发板,另外也可以用自带的开发板来开发图形界面。
因为系统在Linux基础上封装了一层API,所以如果要开发驱动,必须掌握Linux(上面前十个阶段)。如果只是开发 App,只需要使用或者配合模拟器(最好是手机),不需要学习Linux或者开发板。
在你做过几个GUI项目之后,学习UML和设计模式,这将大大提升你的代码架构能力。
12. Web 开发
有时候需要在ARM板上搭建一个网页服务器,这里就得学习HTML、CSS、XML、Ajax、PHP等,看上去内容很多,其实也不多,因为这些语言都好用。初学者用Adobe做开发就可以了,入门之后,一本带浏览器的文本就够了(还要学习MVC模式)。另外还要会用bash或者写CGI程序,这样才能在网页上调用底层的C语言接口。我推荐《疯狂HTML 5/CSS3/讲义》。
13.最后
这个就不涉及流程图绘制软件,文档生成工具等等了(这两个东西工作中经常用到)。
从上面我们可以看出,嵌入式软件涉及到很多计算机相关的知识,就算你掌握了上面提到的这些知识,也只是开了个小小窗口,还有很多东西你做不到。比如:二维码识别,视频采集卡等等。
嵌入式工作也分为几个职位,分别是系统工程师、驱动工程师、软件工程师、UI工程师。
系统工程师:熟悉操作系统内核原理,熟悉内核源代码。主要职责是对系统打补丁或者增加新功能,比如热升级,提高系统的容错能力等。一般公司不做这种开发。
驱动工程师:熟悉各类外设的驱动开发,为内核、GUI提供接口。由于很多IC厂家都提供相关芯片的驱动,很多驱动工程师被裁员(需求减少)。
软件工程师:熟悉各种编程语言和GUI图形库、框架(光会查文档是不够的,需要对框架非常熟悉)。由于项目需求经常变化,开发效率跟不上变化,对软件工程师的需求大大增加。
如有侵权请联系删除!
Copyright © 2023 江苏优软数字科技有限公司 All Rights Reserved.正版sublime text、Codejock、IntelliJ IDEA、sketch、Mestrenova、DNAstar服务提供商
13262879759
微信二维码