导航

公墓网

当前位置: 首页 > 公墓资讯

linux嵌入式开发【Linux嵌入式开发用什么语言】

更新时间:2025 11 09 09:39:31 作者 :庆美网 围观 : 61次

很多朋友对于linux嵌入式开发【Linux嵌入式开发用什么语言】和不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

前面已经提到过,Linux系统为用户提供了多种用户界面,包括Shell界面、系统调用和图形界面。其中Shell界面是UNIX/Linux系统的传统界面,也可以说是最重要的用户界面,无论是服务器、桌面系统还是嵌入式应用,都离不开Shell。

Shell,英文本意是外壳,Linux Shell就是Linux操作系统的外壳,为用户提供使用操作系统的接口,是Linux系统用户交互的重要接口。登录Linux系统或者打开Linux的终端,都将会启动Linux所使用的Shell。

Linux Shell一个命令解释器,是Linux下最重要的交互界面,从标准输入接收用户命令,将命令进行解析并传递给内核,内核则根据命令,作出相应的动作,如果有反馈信息,则输出到标准输出上,示意过程如图 3.1所示。嵌入式Linux的标准输入和输出都是串口终端。

linux嵌入式开发【Linux嵌入式开发用什么语言】

图3.1 命令输入和结果输出

Shell既能解释自身的内建命令,也能解释外部命令,如系统某个目录下的可执行程序。Shell首先判断是否是自己的内建命令,然后再检查是不是系统的应用程序,如果不是内建命令,在系统也找不到这个应用程序,则提示错误信息,如果找到了应用程序,则应用程序调入系统调用时陷入内核。

Shell也是一种解释型的程序设计语言,并且支持绝大多数高级语言的程序元素,如变量、数组、函数以及程序控制等。Shell编程简单易学,任何在Shell提示符中输入的命令都可以放到一个可执行的Shell程序文件中。Shell文件其实就是众多Linux命令的集合,也称为Shell脚本文件。

Linux Shell有多种Shell,比较通用且有标准的主要分为两类:Bourne Shell(sh)和C Shell (csh),各自包括几种具体的Shell,具体如表 3.1所列。

Bourne Shell是UNIX最初使用的shell,在每种UNIX上都可以使用。Bourne Shell的优点是在Shell编程方面很好,缺点是用户的交互不如其他几种Shell。

Bourne Again Shell简称Bash,是Bourne Shell的扩展,与Bourne Shell完全向后兼容,在Bourne Shell的基础上增加了很多新特性。Bash提供了命令补全、命令编辑和命令历史表等功能,还包含了很多C shell和Korn shell中的优点,使用灵活,界面友好,编程方便,是GNU/Linux操作系统的默认Shell。

Korn Shell由AT&T的Bell实验室David Korn开发,吸收了所有C Shell的交互式特性,并融入了Bourne shell的语法,与Bourne shell完全兼容。

C Shell由Bill Joy在BSD系统上开发,增强了用户交互功能,并将编程语法变成了C语言风格,还增加了命令历史、别名、文件名替换、作业控制等功能。目前使用较少。

在不同发行版中,所采用的默认Shell也有所不同,如Redhat和Fedora中默认Shell为bash,Ubuntu中用了dash。无论用哪种Shell,登录系统后系统将运行一个Shell进程。根据不同用户,Shell提供不同的命令提示符,root用户的提示符为“#”,普通用户的命令提示符为“$”,在命令提示符下输入命令即可与系统进行交互。

尽管不同发行版的默认Shell有可能不同,但是所采用的Shell一般都具有如下特性:

  • 具有内置命令可供用户直接使用;
  • 支持复合命令:把已有命令组合成新的命令;
  • 支持通配符(*、?、[]);
  • 支持TAB键补齐;
  • 支持历史记录;
  • 支持环境变量;
  • 支持后台执行命令或者程序;
  • 支持Shell脚本程序;
  • 具有模块化编程能力,如顺序流控制、条件控制和循环控制等;
  • Ctrl+C能终止进程。

linux嵌入式应用程序开发

Yocto 的开发一般包括:创建 Layers、添加新的软件包、扩充或自定义系统镜像、移植到新的硬件平台(添加新的 MACHINE)。

创建图层

Yocto 使用 OpenEmbeded 来构建系统,支持以 Metadata 的形式来组织和管理构建系统所用到的软件包、源码、配置信息等。Metadata 在一定程度上可以理解为 Layers,其实就是文件夹(这些文件夹通常以 meta-xxx 的形式命名)。使用 Layers 来管理源数据有利于保持模块化的设计,Layer 中包含了某些特定功能所需的源数据,层与层之间互不干扰,当构建的系统所需的功能发生变化时,只需要修改该功能对应的 Layer 即可,保持了功能的独立性和模块化设计。

创建图层的步骤

1. 查看已有图层:一般会列出已有的公开、开放的Metadata,当需要创建新图层时,可以先查看网站是否有现成的Metadata,如果有,则直接使用,如果没有,则需要自行创建。

2. 创建一个文件夹来存储Layer中的数据,通常命名为meta-xxx。例如:meta-mylayer、meta-GUI_XYZ、meta-mymachine等。

3.创建Layer配置文件。在新建的Layer文件夹(例如:meta-mylayer)中创建conf/layer.conf文件。layer.conf文件基本框架如下:

各变量含义如下:

(1).bbPATH:将新添加的层路径添加到全局变量bbPATH中,BitBake构建系统时会根据此变量寻找对应的层。

(2)bbFILES:将新添加的Layer中的配方文件(即.bb或者.bbappend文件)添加到全局变量bbFILES中,BitBake构建系统时会根据此变量寻找对应的配方文件。

(3).bbFILE_COLLECTIONS:将图层名称附加到bbFILE_COLLECTIONS变量中,即将图层的文件夹名称meta-xxx中的xxx赋值给bbFILE_COLLECTIONS。

(4).bbFILE_PATTERN:bbFILE_PATTERN变量是用于匹配bbFILES所在层的正则表达式,可以根据基本框架进行修改。

(5)bbFILE_PRIORITY:层级优先级,当不同层级定义相同配方时,会按照bbFILE_PRIORITY对应的优先级高者为准,使用对应的配方文件。

(6)LAYERVERSION:定义Layer的版本信息。

4. 添加内容。根据层的类型,有些层会添加 machine 和 distro 配置。因此需要在层下的 conf/machine/ 文件中添加 machine 配置,在层的 conf/distro/ 文件中添加 distribution 配置。

创建图层时的一些原则

考虑到创建的Layer便于维护且不会影响其他Layer,因此创建Layer时需要遵循一些原则:

避免覆盖其他层中的配方。换句话说,尽量不要将其他层中的整个配方复制到新建的层并进行修改。而是使用 .bbappend 文件方法仅覆盖需要修改的部分。

避免重复包含文件。对于需要包含文件的配方,请使用 .bbappend 文件或在应用时使用相对于原始层的相对路径,例如:使用 require recipes-core/package/file.inc 而不是 require file.inc。

启用图层

新建层之后需要使能,才能参与系统构建过程。系统构建中用到的层定义在build/conf/bblayers.conf中。对于iMX6ULL,Freescale官方提供了imx-setup-release.sh脚本,修改build/conf/bblayers.conf文件。在初始化Yocto构建目录时,会调用imx-setup-release.sh脚本。因此,修改imx-setup-release.sh脚本如下:

新添加的 echo \”bbLAYERS += \” ${BSPDIR}/sources/meta-bird-imx6ull \”\” >>$BUILD_DIR/conf/bblayers.conf 将新添加的 meta-bird-imx6ull 添加到 build/conf/bblayers.conf 中的 bbLAYERS 变量中。

使用 .bbappend 文件

用于将元数据附加到其他配方的配方称为 BitBake 附加文件。BitBake 附加文件使用 .bbappend 文件类型后缀,而附加元数据的相应配方使用 .bb 文件类型后缀。.bbappend 文件允许创建的层通过附加或覆盖来更改其他层的内容,而无需将其他配方复制到新创建的层。直观地讲,新创建的层中的 .bbappend 文件与需要修改或附加其他内容的 .bb 文件位于不同的层中。

附件文件(.bbappend)必须与对应的配方(.bb)文件名(或文件名加版本号)一致,例如附件文件someapp_2.1.bbappend只对文件someapp_2.1.bb有效,也就是说当文件someapp_2.1.bb升级为someapp_2.2.bb或者其他版本的.bb文件时,对应的附件文件someapp_2.1.bbappend也必须做相应升级,比如someapp_2.2.bbappend。在构建过程中,当BitBake检测到某个.bbappend文件没有对应的.bb文件时,就会报错。

设置图层优先级

每个层都分配有一个优先级。当同一配方出现在不同层中时,将首先使用优先级值较大的层中的配方。优先级值也会影响 .bbappend 文件。例如,bbFILE_PRIORITY_mylayer =“5”。

需要注意的是:版本号较低但优先级较高的配方可能会被优先执行。

图层管理

BitBake提供了Layer管理工具来查看Layer的一些基本信息,使用方法如下:

可以使用以下命令:

添加 COPYING.MIT 和 README 文件

在Layer中建议添加相应的COPYING.MIT文件和README文件。

自定义系统映像文件

在实际的工程应用中,需要根据不同的需求对系统进行定制,本节简单介绍了几种定制系统的方法,首先让您对定制系统的方法有一个整体的了解,后续章节会讲解定制系统的详细步骤。Yocto 提供了几种定制系统的方法,您可以根据实际的应用场景选择不同的方法。

通过 local.conf 添加包

通过直接修改 build/conf 路径下的 local.conf 配置文件来添加软件包是定制系统的最简单的方法之一。同时,由于直接修改 local.conf 文件,因此这种方法一般只适用于向系统映像文件中添加软件包。在使用 local.conf 文件中的变量添加软件包时,需要注意的是,添加的软件包对所有的系统映像文件都有效。例如,在 local.conf 文件中添加以下语句,将会安装生成的系统映像文件中的“strace”软件:

注意:等号和包名“strace”之间的空格是必须的。

同样的,修改local.conf中的IMAGE_INSTALL_append也会影响所有的镜像文件,如果需要让其只对特定的镜像文件生效,可以通过扩展语句来实现,如:

这样,新添加的strace软件只对core-image-minimal系统映像文件有效。

通过IMAGE_FEATURES和EXTRA_IMAGE_FEATURES添加软件包

另外一种添加包的方式是通过 IMAGE_FEATURES 和 EXTRA_IMAGE_FEATURES 变量。虽然这两个变量的用法几乎一样,但在实际使用中,IMAGE_FEATURES 一般用在 recipe 中,而 EXTRA_IMAGE_FEATURES 一般用在 build/conf 路径下的 local.conf 文件中。一般来说,这两个变量最终都是通过修改 IMAGE_INSTALL 变量来实现的,实际使用中并不常用。

通过.bb文件定制系统镜像

自定义系统镜像的常用方法是使用 .bb 文件。您可以创建一个配方来定义需要添加到镜像文件中的软件包。例如,在新建的 .bb 文件中添加以下代码:

还有一种方法就是修改现有的系统镜像文件,比如你想基于 core-image-sato 构建一个系统镜像文件,但是需要添加 strace 包,那么你可以将 /sources/poky/meta/recipes-sato/images/core-image-sato.bb 文件复制一份,命名为新的 .bb 文件,然后在新的 .bb 文件中添加如下代码来添加 strace 包:

推荐使用此方法。

通过软件包组定制系统镜像

对于复杂的应用程序,可以使用软件包组来定制系统映像,例如:/sources/poky/meta/recipes-core/packagegroups/packagegroup-base.bb 文件。

自定义主机名

一般来说,主机名与系统中配置的主机名(/etc/hostname)一致。例如,如果 MACHINE 等于“qemux86”,则写入 /etc/hostnam 的主机名是“qemux86”。您可以通过修改配方基础文件中的 hostname 变量来自定义主机名。例如,您可以在 .bbappend 文件中使用以下代码:

或者,在您的配置文件中使用以下代码:

就是这样。

创建菜谱

Metadata(Layer)由一些 Recipe 组成。从形式上看,Recipes 是 Metadata 文件夹下的一些文件夹(再次强调,按照惯例,它们被命名为 Recipes-xxx)。Recipes-xxx 文件夹中的 Recipe(.bb 文件)是 Yocto 项目最基本的组件。OpenEmbedded 构建系统所使用的软件包和其他组件都定义在 Recipes 中。

创建基本食谱

创建新食谱有两种简单的方法:

本教程主要讲解第二种方法,通常在recipe中定义一些变量来定义要使用的软件包,基本框架如下:

存储和命名食谱

通常,创建完基本配方后,需要按照一定的目录框架将配方放在合适的位置,以保证 OpenEmbedded 在构建系统时能够找到它们。OpenEmbedded 通过 Layer(meta-xxx 文件夹)下 conf/layer.conf 中的变量 bbFILES 来查找构建过程中用到的配方。其典型应用如下:

因此必须保证新建的配方在层中有正确的路径。另外配方文件的命名也要遵循一定的规则,如下所示:

使用小写字符,并且不要包含保留后缀 -native、-cross、-initial 或 -dev。例如:cups_1.7.0.bb、gawk_4.0.2.bb、irssi_0.8.16-rc1.bb 等。

编写菜谱

对于新创建的配方,往往需要不断修改、编译、迭代,才能逐步实现最终的功能。使用 fls-setup-release.sh 脚本初始化 Yocto 构建目录后,会自动进入构建目录。在此路径下,可以使用以下命令编译配方:

其中basename为配方文件名。在编译过程中,OpenEmbedded编译系统会为每个配方建立一个临时文件夹,用于存放解压后的文件、日志文件等。每个配方的临时文件夹组织如下:

例如假设生成的系统架构是qemux86-poky-linux,配方文件是foo_1.3.0.bb,则会生成以下文件:

在此路径下还可以看到image、packages-spilt、temp等文件夹,编译完成后可以检查这些文件夹的内容,判断编译过程是否正确。

获取源代码

构建系统的过程其实就是将一些软件源代码编译成系统镜像文件的过程。因此,recipe的第一步就是定义如何获取相关的软件源代码。在recipe中,软件源代码的位置由SRC_URI变量定义。BitBake编译系统镜像文件的过程可以分为几个任务,逐步完成。其中一个任务do_fetch会根据SRC_URI变量值的前缀,决定使用哪个fetcher以及从哪里获取软件源代码。获取源代码之后,do_patch任务也会根据SRC_URI变量值进行补丁应用。

配方中的 SRC_URI 定义了软件源代码的唯一地址,建议 SRC_URI 变量中定义的软件源代码地址包含 ${PV},这样在获取软件源代码的过程中可以使用配方文件名中定义的版本。同时,后续需要升级软件版本时,只需要升级配方文件名的版本号即可。例如:在 meta/recipes-devtools/cdrtools/cdrtoolsnative_3.01a20.bb 这个配方中,SRC_URI 变量值使用“PV”值。

你也可以通过SCM(Source Control Managers)获取软件源代码,比如Git。对于Git,你还需要在recipe中定义SRCREV和SRCPV变量值,例如:meta/recipeskernel/blktrace/blktrace_git.bb:

其中,SRCPV = \”${@bb.fetch2.get_srcrev(d)}\”

另外,如果 SRC_URI 指向的软件源地址不是来自 SCM,而是远程服务器或其他地址上的软件源包,则需要定义相应的软件源包校验和,以便 BitBake 在编译时通过校验和判断软件包的完整性。例如:

解压源代码

如果源代码是以压缩包的形式获得的,do_unpack任务会在编译过程中对压缩包进行解压。

补丁代码

有时获取软件源代码后,需要打补丁。补丁代码在SRC_URI中,以.patch、.diff或者以这些后缀的压缩包(如:diff.gz)结尾。执行do_patch任务时,会自动打补丁。

执照

在配方中,您需要包含 LICENSE 和 LIC_FILES_CHKSUM 变量。例如:

LICENSE 变量决定了软件所使用的许可证,一般来说,对应软件包的许可证定义可以在软件包的说明中找到,如 COPYING、LICENSE、README 等文件,也可以在软件源代码文件的头部找到相关信息。

配置配方

大多数软件都提供了一些在编译前配置软件的方法。一般来说,使用带有参数选项的脚本或配置文件是一种典型的方法。在 OpenEmbedded 的编译过程中也是如此。其中,软件配置的一大块就是在软件编译过程中检测依赖关系。软件包的依赖关系可以通过配方文件中的 DEPENDS 变量值来指定。这些依赖关系通常在软件包的描述文档中提到。一般来说,软件包的配置项可以分为以下三类:

Autotools:对于提供 configure.ac 文件的软件包,一般会使用 Autotools 工具进行配置,此时直接修改 configure.ac 文件即可,不过需要注意的是,由于使用了 Autotools,所以需要在 Recipe 中引入 autotools 类,而不需要再在 Recipe 中包含 do_configure 任务。

CMake:对于提供CMakeLists.txt文件的软件包,一般会使用CMake工具进行配置,这样的软件包只需要直接修改CMakeLists.txt配置文件即可。同样,由于使用了CMake,因此需要在recipe中引入cmake类,而不需要再recipe中包含do_configure任务。

其他:对于不使用 Autotools 或 CMake 且需要配置的包,需要在 recipe 中提供一个 do_configure 任务,在编译前对包进行配置。当然,如果包不需要任何配置,则例外。

OpenEmbedded编译完成后可以通过log.do_configure文件查看软件包的配置项,判断配置项是否成功。

编写食谱

获取、解压并配置软件源代码后,BitBake会通过do_compile任务自动开始编译配方。

安装应用程序

Linux下安装软件的一般流程如下:

创建安装目录

复制库

复制可执行程序

根据需要有选择地配置和启动服务

在配方编译的do_install任务中,将构建好的文件及其层级结构复制到生成的镜像文件对应位置,实现软件的安装。不同的软件编译方式会有不同的安装方式:

启用系统服务

可以在recipe中添加一些定义,安装一些需要在系统启动时或者后台运行的进程服务。当需要添加系统服务时,可以使用recipe中的do_install_append函数安装相应的服务。当然如果recipe中已经存在do_install函数,在do_install中安装系统服务也是更好的选择。OpenEmbedded提供了两种方式来启动系统服务:

linux嵌入式开发【Linux嵌入式开发用什么语言】和的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

用户评论

陌上蔷薇

刚开始接触linux嵌入式开发,这个标题真是我的心头好!一直想知道要学习哪些语言入门呢?希望文章能详细讲解一下常用语言的优缺点,方便我更好地选择。

    有17位网友表示赞同!

青瓷清茶倾城歌

C和C++这两种语言的确是嵌入式开发的主流选择,性能比较好,可移植性也高。但是我觉得现在的Python也越来越强大,特别是结合框架或者工具的使用,也能在嵌入式领域发挥很重要的作用!

    有8位网友表示赞同!

红尘烟雨

学习嵌入式开发真是一项挑战,虽然我最喜欢C/C++,但也需要掌握shell脚本和一些特定应用领域的语言。感觉总是有很多新的东西要学!

    有12位网友表示赞同!

゛指尖的阳光丶

看了标题还以为会介绍更多一些新的语言呢!毕竟嵌入式领域一直在发展,像Rust这样的语言也开始受到关注了。

    有13位网友表示赞同!

一笑傾城゛

我觉得选语言还是要看具体项目的需求啊!比如,如果要开发一些实时性要求很高的系统,C语言应该是首选;而如果需要快速原型,Python可能更合适。文章有没有提到这个问题?

    有11位网友表示赞同!

追忆思域。

嵌入式开发用什么语言的确是个重要的选择问题!我之前一直在学习ARM架构的编程,感觉C语言比较实用,而且很多资料和工具都围绕着它展开。

    有13位网友表示赞同!

丢了爱情i

刚开始学习linux嵌入式开发的时候,感觉各种语言、工具、概念都让我头晕!不知道从哪里入手好呢?希望这篇文章能给我一些通俗易懂的说明!

    有11位网友表示赞同!

泡泡龙

我觉得除了语言本身外,还要注重相关工具和框架的使用。比如,Yocto、Buildroot这些平台能帮助我们更方便地搭建嵌入式系统。 文章有没有提到这些方面呢?

    有14位网友表示赞同!

无所谓

文章标题说的太少了,Linux嵌入式开发要用到那么多语言!Shell脚本、汇编语言等等都不可或缺啊!

    有10位网友表示赞同!

该用户已上天

选语言其实就是根据项目需求来决定吧!不能一概而论。像我在做一个物联网设备的开发,就偏向使用Python和C++交叉开发比较方便!

    有19位网友表示赞同!

余温散尽ぺ

刚开始接触嵌入式开发不久,对这些语言还不太了解。希望文章能详细讲解一下各自的特点和应用场景,以便我更好地选取合适语言进行学习!

    有12位网友表示赞同!

夏日倾情

其实我觉得嵌入式开发更重要的不是语言本身,而是对于硬件架构、编译原理和实时性控制等的理解。语言只是一种具体的工具而已。

    有11位网友表示赞同!

夏至离别

学习C/C++确实很有挑战性,但掌握了这些语言就相当于打开了嵌入式开发的大门!希望文章能分享一些学习资源,帮助我更快地入门!

    有5位网友表示赞同!

拽年很骚

觉得文章标题太简略了一点,Linux嵌入式开发涉及面广,语言种类繁多。希望能提供更详细的分析和比较。

    有12位网友表示赞同!

┲﹊怅惘。

嵌入式开发的世界 fascinates me! 期待看到更多关于不同语言优缺点的对比分析,这样能更好地帮助我选择适合自身项目的语言。

    有20位网友表示赞同!

人心叵测i

文章能否介绍一些学习嵌入式开发的实战案例?亲身经历案例会比理论讲解更有针对性!

    有17位网友表示赞同!

墨染天下

我关注这个话题挺长时间了。感觉越来越多的企业开始使用开源的嵌入式解决方案,不知道这些开源项目中主要采用哪些语言?

    有14位网友表示赞同!

呆檬

嵌入式开发真是一门综合性的学科啊!除了语言本身还得学习电路设计、软件工程等等。希望这篇文章能带给我一些启发!

    有17位网友表示赞同!

花开丶若相惜

感觉学习Linux嵌入式开发是一个很不错的方向,能开阔眼界,还能提升实践能力。需要先给自己规划一个合理的学习方案,从基础知识入手,逐步深入!

    有20位网友表示赞同!

标签: 公墓资讯
相关资讯
  • ps cs4永久序列号—pscs6永久序列号

    一、PHOTOSHOP1.0(1990)经过Thomas(Photoshop的主要设计师)和其他Adobe工程师的努力,Photoshop版本1.0.7于199

    2025-11-09 09:16:08 公墓资讯 
  • 电脑硬盘分区方法详解

    Windows系统随附的磁盘管理工具非常简单且实用,适合初学者。首先,右键单击“此计算机”或“计算机”,选择“管理”,然后在计算机管理接口的左侧单击“磁盘管理”

    2025-11-09 09:15:56 公墓资讯 
  • fusion-io,fusion-io公司

    NVLink是Nvidia推出的高速互连技术,通过连接系统中的多个GPU组成一个性能更强的“GPU”,比如GB200NVL144系统中72个GPU间的互连就使用

    2025-11-08 18:16:40 公墓资讯 
  • 微信红包退还方法详解

    1。红色信封的返回当未收到24小时内发送的微信红信封时,红色信封的金额将自动返回发件人帐户,而无需任何手动操作。这是微信红信封系统的默认返回机制,旨在确保用户资

    2025-11-08 17:15:46 公墓资讯 
  • ftp 软件-ftp软件

    对于刚刚学习使用FTP的新手,可能初次使用会有些困惑,因为默认情况下Filezilla展示的信息非常多,主界面上就有传输消息日志、本地和远程文件目录树、传输队列

    2025-11-08 15:15:53 公墓资讯 
  • 详解笔记本小键盘关闭方法:轻松操作指南

    具体步骤如下:1。关闭的方法在不同的笔记本上是不同的。今天,我们提供了一些常用的方法。2。按键盘上按“Shift+Numlock”,一般而言,它可以关闭并解决;

    2025-11-08 15:15:49 公墓资讯