什么是嵌入式?

i2c0: i2c@44e0b000

嵌入式系统是软硬结合的东西,搞嵌入式开发的人有两类。

buildroot是什么 buildroot和yoctobuildroot是什么 buildroot和yocto


buildroot是什么 buildroot和yocto


一类是学电子工程、通信工程等偏硬件专业出身的人,他们主要是搞硬件设计,有时要开发一些与硬件关系最密切的层软件,如BootLoader、Board Support Package(像PC的BIOS一样,往下驱动硬件,往上支持作系统),最初级的硬件驱动程序等。他们的优势是对硬件原理非常清楚,不足是他们更擅长定义各种硬件接口,但对复杂软件系统往往力不从心(例如嵌入式作系统原理和复杂应用软件等)。

另一类是学软件、计算机专业出身的人,主要从事嵌入式作系统和应用软件的开发。如果这类人对硬件原理和接口有较好的掌握,也完全可以写BSP和硬件驱动程序。嵌入式硬件设计完后,各种功能就全靠软件来实现了,嵌入式设备的增值很大程度上取决于嵌入式软件,这占了嵌入式系统的最主要工作(有很多公司将硬件设计包给了专门的硬件公司,稍复杂的硬件都交给或国外公司设计,国内的硬件设计力量很弱,很多嵌入式公司自己只负责开发软件,因为公司都知道,嵌入式产品的异很大程度在软件上,在软件方面是最有“花头“可做的),所以软件研发人员完全不用担心在嵌入式市场上的无用武之地,越是智能设备越是复杂系统,软件越起关键作用,而且这是趋势。

嵌入式领域较新,发展非常快,很多软硬件技术出现的时间都不太长(如ARM处理器、嵌入式作系统、LINUX作系统),大多数人没有条件接触或进入嵌入式行业,更谈不上能有机会接受专业人士的指导。因此,踏进这个行业的难度比较大,嵌入式人才稀缺,身价自然也水涨船高。

权威部门统计,我国嵌入式人才缺口每年50万人左右。根据前程无忧网发布的调查报告,嵌入式软件开发是未来几年最热门和的职业之一,具有10年工作经验的高级嵌入式工程师年薪在30万元左右。即使是初级的嵌入式软件开发人员,平均月薪也达到了3000—5000元,中高级的嵌入式工程师月薪平均超过10000元。做软件实际上有高下之分,开发语言从机器语言、汇编到C、C++,再到红透半边天的Ja、C#等,该学哪种呢?为什么有些开发者工资低,而有些开发者千金难求?为什么3年的Ja高级程序员薪水仅仅8k-10k,而一个Linux底层C语言程序员两年经验就敢要10k的薪水?

还是门槛,比如月薪15k的Linux嵌入式开发职位,门槛就有 Linux系统、Shell编程、Linux开发环境、C语言、ARM硬件平台、数据结构、Linux内核、驱动程序等,粗略数数就有8道关口,他需要非常熟悉整个的计算机体系,能做出实际的产品,而Ja的开发者却仅仅是会使用名叫Ja的语言工具,始终高高飘在众多层次之上,开发项目非常快,甚至可以不知道OSI模型,很可能自始至终都是软件蓝领。[6]

嵌入式开发本身也有高下之分,至少包含嵌入式应用程序工程师和底层的驱动内核工程师两种。前者同样是使用现成工具进行简单劳动,比如使用J2ME开发小游戏或者进行一些界面开发,而后者是根据芯片具体情况把作系统(如Linux)移植到上面,同时编写必要的驱动程序,改写相应的内核代码。很显然后者是一个公司真正的技术核心。而技术核心的工资很可能是其他开发者的数倍。

如果在十年前也许有70%的人不曾了解。但从今天看,不管是从行业应用,还是智能硬件的爆发,物联网时代的来临,大数据等等嵌入式技术都得到了的发展。所以如果你还不了解什么是嵌入式,那确实有些OUT了。

简单的说下,嵌入式技术是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统技术。举个简单的例子:

你智能手机其实就是一个嵌入式系统,它的系统配置的一些硬件如存储,CPU、电池,但考虑到功耗,为智能手机特别定制了一个系统。试想一下,若智能手机还用台式电脑的CPU,那最终成型产品得有几十斤,那样的手机还有人买吗?因此嵌入式系统就是针对产品需求而定制的系统。

嵌入式它最初起源于单片机技术, 是各类数字化的电子、机电产品的核心,主要用于实现对硬件设备的控制、监视或管理等功能。进入21世纪计算机应用的各行各业中90%左右的开发将涉及到嵌入式开发。全球嵌入式软件市场年增长率超过12.5%,嵌入式系统带来的工业年产值达一万亿美无,未来三年嵌入式软件产业将保持40%以上的年复合增长率。

做软件开发实际上是有高低之分的,开发语言多的去了!如C、C++,再到红透半边天的Ja等,该学哪种呢?为什么有些开发者工资很低,而有些开发者却月薪好几万?又为什么3年的Ja高级程序员薪水最多也只能15K?而一个嵌入式底层工程师两年经验就敢要15K-20k的薪水?正是由于良好的前景所致。什么是嵌入式?我想到这里多少有一些了解了。

但是如果想从事嵌入式开发,必须懂的技术也挺多,它并不是天上掉馅饼的行业,一个成熟的嵌入式工程师基本上要了解,应用开发,底层开发,当然这里又会包含很多很多。具体可看看朱有鹏老师嵌入式的学习路线,跟着一起学习,掌握好基础,然后再慢慢进步。

嵌入式是一种Linux纵系统,不同于一般的PC机系统,这种系统可以根据自己的需求,软硬件可裁剪,对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。拿个非常常见且人人都用到过的嵌入式设备举例——智能手机,手机的作系统就是基于Linux的,试想一下:如果手机的硬盘、CPU、内存跟台式机那般大,做出来的手机我想是没有客户的。这就是直白的认知!

嵌入式系统的组成

嵌入式系统结构其实并不复杂,同样是由硬件设备、作系统、应用软件三部ip=192.168.5.222:192.168.5.226:192.168.5.1:255.255.255.0:core335x:0:off分组成。他们是上下级的关系。

嵌入式系统特点

A.可裁剪性。支持开放性和可伸缩性的体系结构。

B.强实时性。EOS实时性一般较强,可用于各种设备控制中。

C.统一的接口。提供设备统一的驱动接口。

D.作方便、简单、提供友好的图形GUI和图形界面,追求易学易用。

提供强大的网络功能,支持TCP/IP协议及其他协议,提供TCP/UDP/IP/PPP协议支持及统一的MAC访问层接口,为各种移动计算设备预留接口。

E.强稳定性,弱交互性。嵌入式系统一旦开始运行就不需要用户过多的干预、这就要负责系统管理的EOS具有较强的稳定性。嵌入式作系统的用户接口一般不提供作命令,它通过系统的调用命令向用户程序提供服务。

G.更好的硬件适应性,也就是良好的移植性。

H.嵌入式系统和具体应用有机地结合在一起,它的升级换代也是和具体产品同步进行,因此嵌入式系统产品一旦进入市场,具有较长的生命周期。

嵌入式系统应用领域

其实从嵌入式应用来看,也能理解为什么落后一些工业几十年?如德国、美国、日本等。在各行各业智能化是一个重要的体现,特别是近年来,一些工厂逐渐使用嵌入式系统的智能化设备,让一些工人活越来越少。甚至说重复性的工作机器人完全就都能取代。

如:1.消费电子:mp3、手机、电梯、汽车...

2.智能家电:数字电视、微波炉、数码相机、空调...

3.网络设备:交换机、路由器...

4.医疗仪器:..各种医疗器械...

5.航天设备:卫星、航天飞机、月球探测仪...

6.工业控制:控制主机,智能...

7. 远程安防、智能农业、智能城市等等

嵌入式行业前景

谈到嵌入式的前景,这不用多说,有需求必有市场。特别是如今的智能硬件、物联网的兴起。他们都离不开嵌入式系统。

将电子系统(控制)嵌入到一个特殊的设备(终端)里,就像有了大脑一样,可以处理一些。例如各种打着智能、自动的产品,如自动洗衣机、智能(家电)音响。打印机、机器人、无人机、数控机床都算嵌入式。

近年来的物联网就是嵌入式比较大的产业。

嵌入式(Embedded)是指将计算机系统嵌入到其他产品中,以实现特定功能的一种技术。嵌入式系统通常由硬件和软件两部分组成,它们紧密地结合在一起,成为整个系统的核心。

嵌入式系统通常具有以下特点:

实时性:嵌入式系统需要及时响应外部和数据,因此需要具有高实时性。

节能性:嵌入式系统通常需要在电池或小型电源下工作,因此需要具有高节能性。

小型化:嵌入式系统需要尽可能小型化,以适应不同的产品形态。

嵌入式系统广泛应用于各个领域,例如消费电子、汽车、工业控制、医疗设备、智能家居、安防等。嵌入式系统的应用范围越来越广泛,它们已经成为人们日常生活中不可或缺的一部分。

就比如耳机说嵌入式的,意思就是不像耳麦似的挂在耳朵上或者贴着耳朵外,而是深入到耳蜗里,镶嵌进去的那种。

有软件,有硬件。

就像是手机

ja写的程序能嵌入到手机系统里!

怎么解释嵌入式系统

编译openwrt 用什么系统

甚至再说一/in/fsck.ext4 /dev/mmcblk0p5些高大上的智能手表、智能水杯、智能吸尘器、智能各种产品横空出世。其实我们真的可以宣布进入了智能时代。要说嵌入式系统的应用领域太多太多。下面列举一小部分。

如何在ARM Linux上使用FDT和initrd

在使用initrd的时候有几点需要注意的:

这文章算是最近工作的备忘。

FDT是ARM

Linux的设备驱动程序信息表,使用FDT的内核,就不用像过去的内核那样,一个板子加一个mach的C文件,所有的设备信息可以记录在一个树状信息文件里面。

目前这方面资料比较少,我以AM335x处理器为例概括一下FDT的使用:

FDT仅仅是一个信息的目录和参数表,要使用某个功能内核中还必须有相应的驱动程序代码

FDT的源文件位置在:arch/arm/boot/dts,例如,TI的Beagle bone black,源文件是arch/arm/boot/dts/am335x_boneblack.dts

FDT在make ARCH=arm的时候就会自动生成,也可用make ARCH=arm

dtbs来生成,例如TI的Beagle bone black生成的文件是arch/arm/boot/dts/am335x_boneblack.dtb,这是一个二进制文件

要想新增你自定义的FDT,请修改arch/arm/boot/dts/Makefile,并在相应的Kconfig中增加config选项,例如,TI的Beagle

FDT的dtb文件由u-boot传递给内核,u-boot必须把这个文件拷贝到内核解压地址之后的某个位置,确保内核解压的时候不会覆盖,然后使用“bootm

如果dtb文件不正确,对于3.10以上的内核,可能什么显示都没有,3.8内核,可能就显示到Uncompressing kernel......done

FDT的编写规则说明在Documentation/devtree/bindings,不同的设备有相应的txt文件说明,其中的“compatible”可以作为关键字搜索驱动程序的源文件,例如,AM335x的GPIO,用“ti,omap4-gpio”为关键字,可以找到其代码位于drivers/gpio/gpio-omap.c

FDT可以包含子文件,比如am335x_boneblack.dts就包含了am33xx.dtsi,am335x-bone-common.dtsi

以一个例子来说明编写规则,我的板子上,I2C0上挂了一个音频CODEC,其地址是0x18,型号是TLV320AIC3104IRHBT。

先找到i2c0的位置,这在arch/arm/boot/dts/am33xx.dtsi中:

{compatible =

#address-cells =

#size-cells =

<0>;

ti,hwmods =

"i2c1";

reg = <0x44e0b000

0x1000>;

interrupts =

<70>;

status =

"disabled";

};

要在这个上挂东西,可以直接在am33xx.dtsi中挂,可以写成这样:

{compatible =

#address-cells =

#size-cells =

<0>;

ti,hwmods =

"i2c1";

reg = <0x44e0b000

0x1000>;

interrupts =

<70>;

status =

"okay";

tlv320aic3x: tlv320aic3x@18 {

compatible = "ti,tlv320aic3x";

reg = <0x18>;

status = "okay";

AVDD-supply = <&ldo4_reg>;

IOVDD-supply = <&ldo4_reg>;

DRVDD-supply = <&ldo4_reg>;

};

};

其中compatible字串“ti,tlv320aic3x”是在Documentation/devtree/bindings里面全文搜索“tlv320aic”获得的,“tlv320aic3x:

tlv320aic3x@18”遵循的是“标识符:名称@地址”的格式,前面的“i2c0:

i2c@44e0b000”也是这个格式。这里的标识符可以在包含这个文件的文件或这个文件的其他位置引用,因此,可以使用arch/arm/boot/dts/am335x-boneblack.dts包含arch/arm/boot/dts/am33xx.dtsi,然后在am335x-boneblack.dts里写:

&i2c0 {

status = "okay";

tlv320aic3x: tlv320aic3x@18 {

compatible = "ti,tlv320aic3x";

reg = <0x18>;

status = "okay";

AVDD-supply = <&ldo4_reg>;

IOVDD-supply = <&ldo4_reg>;

DRVDD-supply = <&ldo4_reg>;

};

};

&i2c0表示引用了i2c0这个标识符,然后把括号里的内容挂载到标识符下,如果属性的名字相同,例如status出现两次,前面是“disabled”后面是“okay”,以后面的为准,引用标识符的次数不受限制。

也许一开始会觉得FDT的工作过程很神秘,但你只要用compatible的字串去全文搜索一下C文件,然后仔细阅读一下,就会发现很简单,没过几分钟你就可以自定义FDT的属性了。反倒是这些作过程我没找到什么文档说,比较头痛,所以我把这些写出来,希望能给大家帮助。

下面说说initrd,initrd的用处是给内核一个初始的基本文件系统,用来加载内核模块之类的东西。很多人觉得嵌入式系统不需要initrd,也可以把initrd作为最终的根文件系统。我用initrd是用来校验真正的根文件系统,因为在嵌入式设备上,无法预测用户到底什么时候关机,可能会造成文件系统问题。

initrd可以用buildroot,像制作正常文件系统一样做,把根下的linuxrc换成一个例如下面这样的文件:

#!/bin/sh

虽然Documentation/initrd.txt里面说,内核会执行initrd里面的/in/init,但在我用的linux-3.8.13上,init/do_mounts_initrd.c里面,执行的是/linuxrc,不知道是不是文档没有更新过来。具体的调用顺序是,kernel_init(init/main.c)

> kernel_init_freeable(init/main.c)

> initrd_load(init/do_mounts_initrd.c) > handle_initrd

(init/do_mounts_initrd.c)。

不建议在initrd上挂载别的东西,会引起未知的问题,貌似看到个文章说这个,找不到了

因为上面的这条,而且在initrd的时候,内核还没有挂载devtmpfs,因此建议使用静态设备,以AM335x为例(内核参数console=/dev/ttyO0,115200n8),必须的有:

/dev/null

/dev/console

/dev/ttyO0

这些可以用fakeroot之后mknod在buildroot的output/target/dev里创建,除了/dev/console,buildroot会自己创建,其他也可以写到buildroot的/dev_table.txt里面让buildroot自动创建:

#/dev/null

c 666 0 0

1 bone black,Kconfig的位置在arch/arm/mach-omap2/Kconfig 3

-/dev/ttyO0 c 600

0 0

/linuxrc可以是个程序也可以是个脚本,脚本的话,命令写路径,而且记得把/linuxrc的mode改为755

使用initrd只需要用u-boot把buildroot制作的文件系统映像拷贝到内存里,然后传递initrd=[地址],[容量]这样的参数给内核,例如initrd=0x81300000,8M,最终的root参数可以不变,例如root=/dev/mmcblk0p5,这表示最终的root是SD卡上扩展分区中的个逻辑分区。给两个内核参数的例子:

console=ttyO0,115200n8 root=/dev/mmcblk0p5 initrd=0x81300000,8M vram=16M

consoleblank=0

console=ttyO0,115200n8 initrd=0x81300000,8M root=/dev/nfs rw

nfsroot=192.168.5.226:/home/cdu/nfsroot

vram=16M consoleblank=0

个不解释了,第二个表示使用initrd,同时使用nfsroot。

啰嗦一句,使用initrd需要在内核配置里打开支持,这个网上的资料太多了,我就不说在哪里了。

spec是什么类型的文件?

"ti,omap4-i2c";

投机; 说明书;

spec文件解读:

一Lnse: 软件授权方式,通常就是GPL、编写spec脚本

由前面的日志了解到,生成rpm除了源码外,最重要的就是懂得编写.spec脚本。rpm建包的原理其实并不复杂,可以理解为按照标准的格式整理一些信息,包括:软件基础信息,以及安装、卸载前后执行的脚本,对源码包解压、打补丁、编译,安装路径和文件等。

实际过程中,最关键的地方,是要清楚虚拟路径的位置,以及宏的定义。

spec脚本包括很多关键字,主要有:

引用

Name: 软件包的名称,后面可使用%{name}的方式引用

Version: 软件的实际版本号,例如:1.0.1等,后面可使用%{version}引用

Release: 发布序列号,例如:1linuxing等,标明第几次打包,后面可使用%{release}引用

Group: 软件分组,建议使用标准分组

BuildRoot: 这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:

%{_tmppath}/%{name}-%{version}-%{release}-root

或%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n}

编译openwrt 用什么系统

F.固化该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行作。代码。在嵌入式系统中,嵌入式作系统和应用软件被固化在嵌入式系统计算机的ROM中。

什么是嵌入式?

二、关键字

嵌入式系统是软硬结合的东西,搞嵌入式开发的人有两类。

一类是学电子工程、通信工程等偏硬件专业出身的人,他们主要是搞硬件设计,有时要开发一些与硬件关系最密切的层软件,如BootLoader、Board Support Package(像PC的BIOS一样,往下驱动硬件,往上支持作系统),最初级的硬件驱动程序等。他们的优势是对硬件原理非常清楚,不足是他们更擅长定义各种硬件接口,但对复杂软件系统往往力不从心(例如嵌入式作系统原理和复杂应用软件等)。

另一类是学软件、计算机专业出身的人,主要从事嵌入式作系统和应用软件的开发。如果这类人对硬件原理和接口有较好的掌握,也完全可以写BSP和硬件驱动程序。嵌入式硬件设计完后,各种功能就全靠软件来实现了,嵌入式设备的增值很大程度上取决于嵌入式软件,这占了嵌入式系统的最主要工作(有很多公司将硬件设计包给了专门的硬件公司,稍复杂的硬件都交给或国外公司设计,国内的硬件设计力量很弱,很多嵌入式公司自己只负责开发软件,因为公司都知道,嵌入式产品的异很大程度在软件上,在软件方面是最有“花头“可做的),所以软件研发人员完全不用担心在嵌入式市场上的无用武之地,越是智能设备越是复杂系统,软件越起关键作用,而且这是趋势。

嵌入式领域较新,发展非常快,很多软硬件技术出现的时间都不太长(如ARM处理器、嵌入式作系统、LINUX作系统),大多数人没有条件接触或进入嵌入式行业,更谈不上能有机会接受专业人士的指导。因此,踏进这个行业的难度比较大,嵌入式人才稀缺,身价自然也水涨船高。

权威部门统计,我国嵌入式人才缺口每年50万人左右。根据前程无忧网发布的调查报告,嵌入式软件开发是未来几年最热门和的职业之一,具有10年工作经验的高级嵌入式工程师年薪在30万元左右。即使是初级的嵌入式软件开发人员,平均月薪也达到了3000—5000元,中高级的嵌入式工程师月薪平均超过10000元。做软件实际上有高下之分,开发语言从机器语言、汇编到C、C++,再到红透半边天的Ja、C#等,该学哪种呢?为什么有些开发者工资低,而有些开发者千金难求?为什么3年的Ja高级程序员薪水仅仅8k-10k,而一个Linux底层C语言程序员两年经验就敢要10k的薪水?

还是门槛,比如月薪15k的Linux嵌入式开发职位,门槛就有 Linux系统、Shell编程、Linux开发环境、C语言、ARM硬件平台、数据结构、Linux内核、驱动程序等,粗略数数就有8道关口,他需要非常熟悉整个的计算机体系,能做出实际的产品,而Ja的开发者却仅仅是会使用名叫Ja的语言工具,始终高高飘在众多层次之上,开发项目非常快,甚至可以不知道OSI模型,很可能自始至终都是软件蓝领。[6]

嵌入式开发本身也有高下之分,至少包含嵌入式应用程序工程师和底层的驱动内核工程师两种。前者同样是使用现成工具进行简单劳动,比如使用J2ME开发小游戏或者进行一些界面开发,而后者是根据芯片具体情况把作系统(如Linux)移植到上面,同时编写必要的驱动程序,改写相应的内核代码。很显然后者是一个公司真正的技术核心。而技术核心的工资很可能是其他开发者的数倍。

如果在十年前也许有70%的人不曾了解。但从今天看,不管是从行业应用,还是智能硬件的爆发,物联网时代的来临,大数据等等嵌入式技术都得到了的发展。所以如果你还不了解什么是嵌入式,那确实有些OUT了。

简单的说下,嵌入式技术是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统技术。举个简单的例子:

你智能手机其实就是一个嵌入式系统,它的系统配置的一些硬件如存储,CPU、电池,但考虑到功耗,为智能手机特别定制了一个系统。试想一下,若智能手机还用台式电脑的CPU,那最终成型产品得有几十斤,那样的手机还有人买吗?因此嵌入式系统就是针对产品需求而定制的系统。

嵌入式它最初起源于单片机技术, 是各类数字化的电子、机电产品的核心,主要用于实现对硬件设备的控制、监视或管理等功能。进入21世纪计算机应用的各行各业中90%左右的开发将涉及到嵌入式开发。全球嵌入式软件市场年增长率超过12.5%,嵌入式系统带来的工业年产值达一万亿美无,未来三年嵌入式软件产业将保持40%以上的年复合增长率。

做软件开发实际上是有高低之分的,开发语言多的去了!如C、C++,再到红透半边天的Ja等,该学哪种呢?为什么有些开发者工资很低,而有些开发者却月薪好几万?又为什么3年的Ja高级程序员薪水最多也只能15K?而一个嵌入式底层工程师两年经验就敢要15K-20k的薪水?正是由于良好的前景所致。什么是嵌入式?我想到这里多少有一些了解了。

但是如果想从事嵌入式开发,必须懂的技术也挺多,它并不是天上掉馅饼的行业,一个成熟的嵌入式工程师基本上要了解,应用开发,底层开发,当然这里又会包含很多很多。具体可看看朱有鹏老师嵌入式的学习路线,跟着一起学习,掌握好基础,然后再慢慢进步。

嵌入式是一种Linux纵系统,不同于一般的PC机系统,这种系统可以根据自己的需求,软硬件可裁剪,对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。拿个非常常见且人人都用到过的嵌入式设备举例——智能手机,手机的作系统就是基于Linux的,试想一下:如果手机的硬盘、CPU、内存跟台式机那般大,做出来的手机我想是没有客户的。这就是直白的认知!

嵌入式系统的组成

嵌入式系统结构其实并不复杂,同样是由硬件设备、作系统、应用软件三部分组成。他们是上下级的关系。

嵌入式系统特点

A.可裁剪性。支持开放性和可伸缩性的体系结构。

B.强实时性。EOS实时性一般较强,可用于各种设备控制中。

C.统一的接口。提供设备统一的驱动接口。

D.作方便、简单、提供友好的图形GUI和图形界面,追求易学易用。

提供强大的网络功能,支持TCP/IP协议及其他协议,提供TCP/UDP/IP/PPP协议支持及统一的MAC访问层接口,为各种移动计算设备预留接口。

E.强稳定性,弱交互性。嵌入式系统一旦开始运行就不需要用户过多的干预、这就要负责系统管理的EOS具有较强的稳定性。嵌入式作系统的用户接口一般不提供作命令,它通过系统的调用命令向用户程序提供服务。

G.更好的硬件适应性,也就是良好的移植性。

H.嵌入式系统和具体应用有机地结合在一起,它的升级换代也是和具体产品同步进行,因此嵌入式系统产品一旦进入市场,具有较长的生命周期。

嵌入式系统应用领域

其实从嵌入式应用来看,也能理解为什么落后一些工业几十年?如德国、美国、日本等。在各行各业智能化是一个重要的体现,特别是近年来,一些工厂逐渐使用嵌入式系统的智能化设备,让一些工人活越来越少。甚至说重复性的工作机器人完全就都能取代。

如:1.消费电子:mp3、手机、电梯、汽车...

2.智能家电:数字电视、微波炉、数码相机、空调...

3.网络设备:交换机、路由器...

4.医疗仪器:..各种医疗器械...

5.航天设备:卫星、航天飞机、月球探测仪...稳定性:嵌入式系统需要长期稳定运行,因此需要具有高可靠性和稳定性。

6.工业控制:控制主机,智能...

7. 远程安防、智能农业、智能城市等等

嵌入式行业前景

谈到嵌入式的前景,这不用多说,有需求必有市场。特别是如今的智能硬件、物联网的兴起。他们都离不开嵌入式系统。

将电子系统(控制)嵌入到一个特殊的设备(终端)里,就像有了大脑一样,可以处理一些。例如各种打着智能、自动的产品,如自动洗衣机、智能(家电)音响。打印机、机器人、无人机、数控机床都算嵌入式。

近年来的物联网就是嵌入式比较大的产业。

嵌入式(Embedded)是指将计算机系统嵌入到其他产品中,以实现特定功能的一种技术。嵌入式系统通常由硬件和软件两部分组成,它们紧密地结合在一起,成为整个系统的核心。

嵌入式系统通常具有以下特点:

实时性:嵌入式系统需要及时响应外部和数据,因此需要具有高实时性。

节能性:嵌入式系统通常需要在电池或小型电源下工作,因此需要具有高节能性。

小型化:嵌入式系统需要尽可能小型化,以适应不同的产品形态。

嵌入式系统广泛应用于各个领域,例如消费电子、汽车、工业控制、医疗设备、智能家居、安防等。嵌入式系统的应用范围越来越广泛,它们已经成为人们日常生活中不可或缺的一部分。

就比如耳机说嵌入式的,意思就是不像耳麦似的挂在耳朵上或者贴着耳朵外,而是深入到耳蜗里,镶嵌进去的那种。

有软件,有硬件。

就像是手机

ja写的程序能嵌入到手机系统里!

怎么解释嵌入式系统

spec是什么类型的文件?

--

投机; 说明书;

spec文件解读:

一、编写spec脚本

由前面的日志了解到,生成rpm除了源码外,最重要的就是懂得编写.spec脚本。rpm建包的原理其实并不复杂,可以理解为按照标准的格式整理一些信息,包括:软件基础信息,以及安装、卸载前后执行的脚本,对源码包解压、打补丁、编译,安装路径和文件等。

实际过程中,最关键的地方,是要清楚虚拟路径的位置,以及宏的定义。

spec脚本包括很多关键字,主要有:

引用

Name: 软件包的名称,后面可使用%{name}的方式引用

Version: 软件的实际版本号,例如:1.0.1等,后面可使用%{version}引用

Release: 发布序列号,例如:1linuxing等,标明第几次打包,后面可使用%{releja就是嵌入式开发的典型。他能嵌入到其他的程序里面ase}引用

Group: 软件分组,建议使用标准分组

BuildRoot: 这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:

%{_tmppath}/%{name}-%{version}-%{release}-root

或%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n}

如何在ARM Linux上使用FDT和initrd

这文章算是最近工作的备忘。

FDT是ARM

Linux的设备驱动程序信息表,使用FDT的内核,就不用像过去的内核那样,一个板子加一个mach的C文件,所有的设备信息可以记录在一个树状信息文件里面。

目前这方面资料比较少,我以AM335x处理器为例概括一下FDT的使用:

FDT仅仅是一个信息的目录和参数表,要使用某个功能内核/bin/echo Now Check SD Card中还必须有相应的驱动程序代码

FDT的源文件位置在:arch/arm/boot/dts,例如,TI的Beagle bone black,源文件是arch/arm/boot/dts/am335x_boneblack.dts

FDT在make ARCH=arm的时候就会自动生成,也可用make ARCH=arm

dtbs来生成,例如TI的Beagle bone black生成的文件是arch/arm/boot/dts/am335x_boneblack.dtb,这是一个二进制文件

要想新增你自定义的FDT,请修改arch/arm/boot/dts/Makefile,并在相应的Kconfig中增加config选项,例如,TI的Beagle

FDT的dtb文件由u-boot传递给内核,u-boot必须把这个文件拷贝到内核解压地址之后的某个位置,确保内核解压的时候不会覆盖,然后使用“bootm

如果dtb文件不正确,对于3.10以上的内核,可能什么显示都没有,3.8内核,可能就显示到Uncompressing kernel......done

FDT的编写规则说明在Documentation/devtree/bindings,不同的设备有相应的txt文件说明,其中的“compatible”可以作为关键字搜索驱动程序的源文件,例如,AM335x的GPIO,用“ti,omap4-gpio”为关键字,可以找到其代码位于drivers/gpio/gpio-omap.c

FDT可以包含子文件,比如am335x_boneblack.dts就包含了am33xx.dtsi,am335x-bone-common.dtsi

以一个例子来说明编写规则,我的板子上,I2C0上挂了一个音频CODEC,其地址是0x18,型号是TLV320AIC3104IRHBT。

先找到i2c0的位置,这在arch/arm/boot/dts/am33xx.dtsi中:

{compatible =

#address-cells =

#size-cells =

<0>;

ti,hwmods =

"i2c1";

reg = <0x44e0b000

0x1000>;

interrupts =

<70>;

status =

"disabled";

};

要在这个上挂东西,可以直接在am33xx.dtsi中挂,可以写成这样:

{compatible =

#address-cells =

#size-cells =

<0>;

ti,hwmods =

"i2c1";

reg = <0x44e0b000

0x1000>;

interrupts =

<70>;

status =

"如果你只是要编译一个自定义的固件(默认带什么软件,不带什么软件,自定义默认的配置等等),那你用ImageBuilder,简单快速,省心省力 你要是需要自己开发软件包,用OpenWRT的SDK,直接出ipk文件 要完全重写就buildroot,完全从源代码开始改起,SVN和GIT都有源okay";

tlv320aic3x: tlv320aic3x@18 {

compatible = "ti,tlv320aic3x";

reg = <0x18>;

status = "okay";

AVDD-supply = <&ldo4_reg>;

IOVDD-supply = <&ldo4_reg>;

DRVDD-supply = <&ldo4_reg>;

};

};

其中compatible字串“ti,tlv320aic3x”是在Documentation/devtree/bindings里面全文搜索“tlv320aic”获得的,“tlv320aic3x:

tlv320aic3x@18”遵循的是“标识符:名称@地址”的格式,前面的“i2c0:

i2c@44e0b000”也是这个格式。这里的标识符可以在包含这个文件的文件或这个文件的其他位置引用,因此,可以使用arch/arm/boot/dts/am335x-boneblack.dts包含arch/arm/boot/dts/am33xx.dtsi,然后在am335x-boneblack.dts里写:

&i2c0 {

status = "okay";

tlv320aic3x: tlv320aic3x@18 {

compatible = "ti,tlv320aic3x";

reg = <0x18>;

status = "okay";

AVDD-supply = <&ldo4_reg>;

IOVDD-supply = <&ldo4_reg>;

DRVDD-supply = <&ldo4_reg>;

};

};

&i2c0表示引用了i2c0这个标识符,然后把括号里的内容挂载到标识符下,如果属性的名字相同,例如status出现两次,前面是“disabled”后面是“okay”,以后面的为准,引用标识符的次数不受限制。

也许一开始会觉得FDT的工作过程很神秘,但你只要用compatible的字串去全文搜索一下C文件,然后仔细阅读一下,就会发现很简单,没过几分钟你就可以自定义FDT的属性了。反倒是这些作过程我没找到什么文档说,比较头痛,所以我把这些写出来,希望能给大家帮助。

下面说说initrd,initrd的用处是给内核一个初始的基本文件系统,用来加载内核模块之类的东西。很多人觉得嵌入式系统不需要initrd,也可以把initrd作为最终的根文件系统。我用initrd是用来校验真正的根文件系统,因为在嵌入式设备上,无法预测用户到底什么时候关机,可能会造成文件系统问题。

initrd可以用buildroot,像制作正常文件系统一样做,把根下的linuxrc换成一个例如下面这样的文件:

#!/bin/sh

虽然Documentation/initrd.txt里面说,内核会执行initrd里面的/in/init,但在我用的linux-3.8.13上,init/do_mounts_initrd.c里面,执行的是/linuxrc,不知道是不是文档没有更新过来。具体的调用顺序是,kernel_init(init/main.c)

> kernel_init_freeable(init/main.c)

> initrd_load(init/do_mounts_initrd.c) > handle_initrd

(init/do_mounts_initrd.c)。

不建议在initrd上挂载别的东西,会引起未知的问题,貌似看到个文章说这个,找不到了

因为上面的这条,而且在initrd的时候,内核还没有挂载devtmpfs,因此建议使用静态设备,以AM335x为例(内核参数console=/dev/ttyO0,115200n8),必须的有:

/dev/null

/dev/console

/dev/ttyO0

这些可以用fakeroot之后mknod在buildroot的output/target/dev里创建,除了/dev/console,buildroot会自己创建,其他也可以写到buildroot的/dev_table.txt里面让buildroot自动创建:

#/dev/null

c 666 0 0

1 3

-/dev/ttyO0 c 600

0 0

/linuxrc可以是个程序也可以是个脚本,脚本的话,命令写路径,而且记得把/linuxrc的mode改为755

使用initrd只需要用u-boot把buildroot制作的文件系统映像拷贝到内存里,然后传递initrd=[地址],[容量]这样的参数给内核,例如initrd=0x81300000,8M,最终的root参数可以不变,例如root=/dev/mmcblk0p5,这表示最终的root是SD卡上扩展分区中的个逻辑分区。给两个内核参数的例子:

console=ttyO0,115200n8 root=/dev/mmcblk0p5 initrd=0x81300000,8M vram=16M

consoleblank=0

console=ttyO0,115200n8 initrd=0x81300000,8M root=/dev/nfs rw

nfsroot=192.168.5.226:/home/cdu/nfsroot

vram=16M consoleblank=0

个不解释了,第二个表示使用initrd,同时使用nfsroot。

啰嗦一句,使用initrd需要在内核配置里打开支持,这个网上的资料太多了,我就不说在哪里了。

瑞芯微rk3588什么时间上市

瑞芯微rk把软件嵌入到硬件里的产品,就是嵌入式3588于2020> prepare_namespace(init/do_mounts.c)年2月上市。

2021年12月16日,在瑞芯微举办的第六届开发者大会上,瑞芯微发布了新一代高性能旗舰Soc芯片RK3588

spec是什么类型的文件?

Source: 源代码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用

投机; 说明书;

rk3588 系统支持:Android12 系统、Debian11、Buildroot、Ubuntu 等系统 Uboot 版本 2017.09 版本

spec文件解读:

一、编写spec脚本

由前面的日志了解到,生成rpm除了源码外,最重要的就是懂得编写.spec脚本。rpm建包的原理其实并不复杂,可以理解为按照标准的格式整理一些信息,包括:软件基础信息,以及安装、卸载前后执行的脚本,对源码包解压、打补丁、编译,安装路径和文件等。

实际过程中,最关键的地方,是要清楚虚拟路径的位置,以及宏的定义。

spec脚本包括很多关键字,主要有:

引用

Name: 软件包的名称,后面可使用%{name}的方式引用

Version: 软件的实际版本号,例如:1.0.1等,后面可使用%{version}引用

Release: 发布序列号,例如:1linuxing等,标明第几次打包,后面可使用%{release}引用

Group: 软件分组,建议使用标准分组

BuildRoot: 这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:

%{_tmppath}/%{name}-%{version}-%{release}-root

或%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n}