第一篇:
原文链接:https://www.zhihu.com/question/464205608/answer/3358027187
一、什么是嵌入式系统
- 嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于应用系统,对功能、可靠性、成本、体积、功耗等方面有特殊要求的专用计算机系统。
- 嵌入式系统与通用计算机系统的本质区别在于系统应用不同,嵌入式系统是将一个计算机系统嵌入到对象系统中。这个对象可能是庞大的机器,也可能是小巧的手持设备,用户并不关心这个计算机系统的存在。
- 嵌入式系统一般包含嵌入式微处理器、外围硬件设备、嵌入式操作系统和应用程序4个部分。嵌入式领域已经有丰富的软硬件资源可以选择,涵盖了通信、网络、工业控制、消费电子、汽车电子等各种行业。
二、嵌入式系统操作
嵌入式操作系统的一个重要特性是实时性。所谓实时性,就是在确定的时间范围内响应某个事件的特性。
著名的嵌入式操作系统有:VxWorks、Linux和Windows CE等。
三、嵌入式Linux的特点
1、Linux系统是层次结构且内核完全开放。Linux是由很多体积小且性能高的微内核系统组成。在内核代码完全开放的前提下,不同领域和不同层次的用户可以根据自己的应用需要方便地对内核进行改造,低成本地设计和开发出满足自己需要的嵌入式系统。
2、强大的网络支持功能。Linux诞生于因特网时代并具有Unix的特性,保证了它支持所有标准因特网协议,并且可以利用Linux的网络协议栈将其开发成为嵌入式的TCP/IP网络协议栈。
3、Linux具备一整套工具链,容易自行建立嵌入式系统的开发环境和交叉运行环境,可以跨越嵌入式系统开发中仿真工具的障碍。Linux也符合IEEE POSIX1标准,使应用程序具有较好的可移植性。
传统的嵌入式开发的程序调试和调试工具是用在线仿真器(ICE)实现的。它通过取代目标板的微处理器,给目标程序提供一个完整的仿真环境,完成监视和调试程序;但一般价格比较昂贵,只适合做非常底层的调试。
4、Linux具有广泛的硬件支持特性。无论是RISC还是CISC、32位还是64位等各种处理器Linux都能运行。这意味着嵌入式Linux将具有更广泛的应用前景。
四、嵌入式系统的组成
1、硬件和软件
①硬件:嵌入式处理器、存储系统、(由IO连接)外设、时钟、复位、电源。
三大件全部集成:嵌入式微控制器(单片机);
三大件部分集成:嵌入式微处理器、IO集成在一个芯片内部,存储外置
②软件:嵌入式操作系统(可裁剪移植的、定制开发)、应用软件(专用性、固化)
嵌入式系统通常由嵌入式处理器、外围设备、嵌入式操作系统和应用软件等几大部分组成。
2、硬件层
硬件层由嵌入式处理器、存储器系统、通用设备接口和I/O接口(如A/D、D/A、I/O等)组成。在一片嵌入式微处理器基础上增加电源电路、时钟电路和存储器电路(ROM和SDRAM等),就构成了七个嵌入式核心控制模块。其中,操作系统和应用程序都可以固化在ROM中。
3、中间层
中间层也称为硬件抽象层或板极支持包,它把系统软件与底层硬件部分隔离。板极支持包对上具有操作系统相关性,对下具有硬件相关性。设计一个完整的中间层需要完成两部分工作:
① 嵌入式系统的初始化,它包括片级初始化、板级初始化和系统级初始化。
② 设计硬件相关的设备驱动
4、软件层
软件层由多任务操作系统(OS)、文件系统、图形用户接口(GUI)、网络系统及通用组件模块组成。OS是嵌入式应用软件的基础和开发平台;是一段嵌入式目标代码中的程序,系统复位后首先执行,相当于用户的主程序,用户的其他应用程序都建立在OS之上;是一个标准的内核,它将CPU时钟、中断、I/O、定时器等资源都封装起来,留给用户的是一个标准的API函数接口。
5、 功能层与执行装置
功能层由基于OS开发的应用程序组成,用来完成对被控对象的控制功能。功能层是面向被控制对象和用户的,为方便用户操作,往往需要提供一个友好的人机界面。执行装置是指那些可以接受嵌入式计算机系统发出控制命令,执行所规定的操作或任务的设备和装置。在不同应用领域中,嵌入式系统的执行装置一般是不同的,应该根据具体的应用场合和系统所要求实现的功能选择不同的设备和执行装置。
五、 Linux内核目录结构
- arch :包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如i386、arm、arm64、powerpc、mips 等。Linux 内核目前已经支持30 种左右的体系结构。在arch目录下,存放的是各个平台以及各个平台的芯片对Linux 内核进程调度、内存管理、中断等的支持,以及每个具体的SoC 和电路板的板级支持代码。
- block:块设备驱动程序I/O 调度。
- crypto:常用加密和散列算法(如AES、SHA 等),还有一些压缩和CRC 校验算法。
- documentation:内核各部分的通用解释和注释。
- drivers :设备驱动程序,每个不同的驱动占用一个子目录,如char、block、net、mtd、i2c 等。
- fs:所支持的各种文件系统,如EXT、FAT、NTFS、JFFS2 等。
- include:头文件,与系统相关的头文件放置在include/linux 子目录下。
- init:内核初始化代码。著名的start_kernel() 就位于init/main.c 文件中。
- ipc:进程间通信的代码。
- kernel :内核最核心的部分,包括进程调度、定时器等,而和平台相关的一部分代码放在arch/*/kernel 目录下。
- lib:库文件代码。
- mm:内存管理代码,和平台相关的一部分代码放在arch/*/mm 目录下。
- net:网络相关代码,实现各种常见的网络协议。
- scripts:用于配置内核的脚本文件。
- security:主要是一个SELinux 的模块。
- sound:ALSA、OSS 音频设备的驱动核心代码和常用设备驱动。
- usr:实现用于打包和压缩的cpio 等。
- include:内核API 级别头文件。
第二篇
原文链接:https://www.zhihu.com/question/464205608/answer/2336725208
linux开发一般是3个部分,最底层的是PCB绘制,也就是纯硬件,往上一点是驱动开发,最上层是应用开发。
首先你需要明白,“我只能做嵌入式Linux应用开发”本身就是错误的,你可以有很多的选择,因为嵌入式涉及的面积很广阔,你没办法只了解其中一部分,正如我上面所说一样,至少这3部分你都需要明白,然后去专精某一部分。
嵌入式应用开发,应当包含两部分,底层一点是linux驱动开发,比如公司有一块板子,设计成一半ARM,一半FPGA,那么你负责ARM这一块的开发的时候大多是底层性质的,你需要根据硬件来设计相应的驱动程序。驱动开发不仅仅需要C/C++的功底(尤其是C,还要一点汇编),还要学习linux内核的知识,以及uboot等等(所以计算机原理和操作系统这两门课很重要),你需要从一块没有任何东西的开发版中引导Linux,然后把自己写好的驱动程序加载进内核,保证整个系统的稳定运行。你写的东西最终会被上层的其他开发者调用,比如公司有一块CAN通信的板子,那么你就需要根据需求让linux识别这块板子,并且按照想要的功能留出API,以供上层调用。
另一部分就是应用层开发,应用层开发大多是C++。你需要调用驱动程序开放的接口来实现整个项目的功能,比如上面的CAN驱动已经有人写好了(大多是情况下是你写的,没错,只有公司很大或者项目很大的时候这二者是分开的,大部分都是你自己来写),需要没过10s发送一次数据,那么你就需要写一个定时器,让他10s调用一次CAN发送的接口,然后把数据发送出去,更甚至基本都是UI开发,用QT写一个上位机,然后调用接口。
最后,给你举个例子,我们做过一个温度测量的系统,需要嵌入在一个控制室里边,难度不是很大,首先需要一个ARM的芯片,身为驱动开发工程师,你需要在这块芯片上装一个linux,然后写好系统引导程序,保证开机成功引导系统,接着你需要写一个SPI驱动,让这个芯片能够以SPI通信的方式读取到温度传感器的数据。然后,应用层的开发工程师要写一个QT上位机,一大堆功能,其中一个就是调用SPI接口获取数据,然后呈现出来,最后什么数据导出了,绘图什么的。但是很遗憾,这些工作都是我一个人来干,就很离谱。这里边还有一些东西,比如开机之后,是不加载比如ubuntu那个界面的,是直接打开写好的QT上位机的界面。
所以就是说,不要认为linux应用开发是分离的,大部分情况下都需要一个人干,这点我也比较能理解,两人开发就API接口的对接来说肯定不如一个人写简单。而且,嵌入式本身就大杂烩,哪一点你都不能完全不知道。