问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

掌握交叉编译神器GCC,提升嵌入式开发效率

创作时间:
作者:
@小白创作中心

掌握交叉编译神器GCC,提升嵌入式开发效率

引用
CSDN
11
来源
1.
https://blog.csdn.net/xiaoyu_750516366/article/details/124234615
2.
https://blog.csdn.net/probably121/article/details/140484055
3.
https://blog.csdn.net/feihe0755/article/details/136305421
4.
https://blog.csdn.net/liufuchun111/article/details/136740612
5.
https://blog.csdn.net/qq_39642740/article/details/140691334
6.
https://new.qq.com/rain/a/20240614A00T0G00
7.
https://blog.csdn.net/aolitianya/article/details/144563488
8.
https://www.cnblogs.com/hencins/p/18072938
9.
https://cloud.tencent.com/developer/article/2424954
10.
https://www.cnblogs.com/apachecn/p/18172921
11.
http://www.360doc.com/content/24/0220/09/79754478_1114576475.shtml

在嵌入式系统开发领域,掌握交叉编译技术是提升开发效率的关键。使用强大的交叉编译器GCC,可以在资源丰富的主机上为不同的硬件平台生成高效的代码。这不仅节省了目标设备上的计算资源,还大大提高了开发者的迭代速度。通过学习《2024中国开源开发者报告》,你将深入了解如何利用交叉编译工具链来优化你的嵌入式项目,让你的开发工作事半功倍。

01

交叉编译工具链构建原理

交叉编译器实际上是不同工具的集合,这些工具被设置为紧密地协同工作。这些工具以某种级联方式链接在一起,其中一个工具的输出成为另一个工具的输入,最终产生在机器上运行的实际二进制代码。因此,我们称这种安排为“工具链”。当工具链要为运行它的机器之外的机器生成代码时,这被称为交叉工具链。

在工具链中起作用的组件首先是编译器本身。编译器将源代码(用C、C++等语言)转换成汇编代码。选择的编译器是GNU编译器集合,众所周知的gcc。汇编程序解释汇编代码以生成目标代码。这是由二进制实用程序完成的,如GNU binutils。一旦生成了不同的目标代码文件,它们就会聚集在一起形成最终的可执行二进制文件。这称为链接,通过使用链接器来实现。GNU binutils还附带了一个链接器。

到目前为止,我们得到了一个完整的工具链,能够将源代码转化为实际的可执行代码。根据目标上运行的操作系统,我们还需要C库。C库提供了一个执行基本任务的标准抽象层(例如分配内存、在终端上打印输出、管理文件访问……)。有许多C库,每个都针对不同的系统。对于Linux桌面,有glibc或eglibc甚至uClibc,对于嵌入式Linux,您可以选择eglibc或uClibc,而对于没有操作系统的系统,您可以使用newlib、dietlibc,甚至根本不使用。还有一些其他的C库,但它们没有被广泛使用,并且/或者是针对非常特殊的需求(例如,klibc是C库的一个非常小的子集,旨在构建受约束的初始ramdisks)。

在Linux下,C库需要知道内核的API,以决定存在什么特性,如果需要的话,为缺失的特性包含什么模拟。该API由内核头文件提供。注意:这是特定于Linux的(可能还有极少数其他操作系统),其他操作系统上的C库不需要内核头文件。

GCC还有一些先决条件。它依靠一些外部库来执行一些重要的任务(比如处理常数中的复数……)。构建这些库有几种选择。首先,人们可能会认为依靠Linux发行版来提供这些库。唉,直到最近,它们才被广泛使用。因此,如果发行版不是太新的话,我们很有可能必须构建这些库(我们将在下面进行构建)。受影响的库包括:

  • GNU多精度算术库——GMP(GNU Multiple Precision Arithmetic Library);
  • 具有正确舍入的多精度浮点计算的C库——MPFR(Multiple-Precision Floating-point-computations with correct Rounding);
  • 复数算术的C语言库——MPC。
02

GCC在嵌入式开发中的应用场景

GCC提供了内嵌汇编功能,允许开发者在C/C++代码中直接插入汇编代码,从而实现更高效的代码生成。GCC支持两种格式的内嵌汇编:基本asm汇编和扩展asm汇编。推荐使用扩展asm汇编,但也有些场景必须使用基本asm汇编。

基本asm汇编语法如下:

asm [ volatile ] ( AssemblerInstructions )

扩展asm汇编语法如下:

asm [volatile] ( AssemblerTemplate
                : OutputOperands
                [ : InputOperands
                [ : Clobbers ] ])
asm [volatile] goto ( AssemblerTemplate
                    :: InputOperands
                    : Clobbers
                    : GotoLabels)

下面是一个ARM平台使能中断的asm汇编实现示例:

void enable_interrupts (void)
{
    unsigned long temp;
    __asm__ __volatile__("mrs %0, cpsr\n"
                         "bic %0, %0, #0x80\n"
                         "msr cpsr_c, %0"
                         : "=r" (temp)
                         :
                         : "memory");
}
03

嵌入式开发最新趋势

随着技术的不断发展,嵌入式开发正朝着以下几个方向发展:

  1. 人工智能与机器学习:将AI算法和机器学习模型融入嵌入式设备,支持语音识别和图像分析等高级应用。
  2. 物联网(IoT):通过传感器和通信技术嵌入,促进设备间互联与数据交换。
  3. 边缘计算:将计算力置于设备附近,减少延迟并降低对云端依赖。
  4. 安全性与隐私保护:重视系统安全和用户隐私数据保护。
  5. 绿色嵌入式系统:采用节能设计策略,减少能耗与环境影响。
  6. 软硬件融合:追求硬件与软件的深度整合,实现更高效能与灵活性。
04

GCC交叉编译最佳实践

Golang(Go)作为一种现代化的编程语言,具有出色的跨平台支持,通过其强大的多架构编译功能,可以轻松实现在各种操作系统和硬件架构上的部署。本文将深入探讨 Golang 多架构编译的原理、方法以及示例。

Golang 的多架构编译功能依赖于两个关键的环境变量:GOOS和GOARCH。其中,GOOS表示目标操作系统,而GOARCH表示目标架构。通过设置这两个环境变量,我们可以告诉 Go 编译器在编译过程中要生成的目标平台。

以下是一个示例,你可以使用环境变量 GOOS 和 GOARCH 来为不同的平台编译你的程序,并生成适用于不同操作系统和架构的可执行文件:

代码语言:javascript
复制

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

使用以下命令,我们可以将这个简单的 Go 程序编译为多个目标平台的可执行文件:
代码语言:javascript
复制

# 编译为 Linux 64 位可执行文件
GOOS=linux GOARCH=amd64 go build -o hello-linux-amd64 main.go

# 编译为 Windows 64 位可执行文件
GOOS=windows GOARCH=amd64 go build -o hello-windows-amd64.exe main.go

# 编译为 ARM 64 位可执行文件
GOOS=linux GOARCH=arm64 go build -o hello-linux-arm64 main.go

# 编译为 macOS 64 位可执行文件
GOOS=darwin GOARCH=amd64 go build -o hello-darwin-amd64 main.go

通过以上命令,我们可以在不同的操作系统和架构上编译出相应的可执行文件,使得我们的应用程序能够在各种环境中运行。

为了方便编译多个架构,可以编写一个脚本来自动编译多个目标平台。创建build.sh脚本:

代码语言:javascript
复制

#!/bin/bash

OUTPUT_DIR="build"
PLATFORMS=("linux/amd64" "linux/arm64" "windows/amd64" "darwin/amd64")

mkdir -p $OUTPUT_DIR

for PLATFORM in "${PLATFORMS[@]}"; do
    OS=$(echo $PLATFORM | cut -d'/' -f1)
    ARCH=$(echo $PLATFORM | cut -d'/' -f2)
    OUTPUT_NAME=$OUTPUT_DIR/hello-$OS-$ARCH

    if [ $OS = "windows" ]; then
        OUTPUT_NAME+='.exe'
    fi

    echo "Building for $OS/$ARCH..."
    GOOS=$OS GOARCH=$ARCH go build -o $OUTPUT_NAME main.go
done

使脚本可执行:
代码语言:javascript
复制

chmod +x build.sh

运行脚本:
代码语言:javascript
复制

./build.sh

这个脚本会在build目录中生成多个目标平台的可执行文件。

对于一些架构,例如 ARM,你可能需要安装特定的交叉编译工具链。例如:在 CentOS X86 架构的环境上,编译 ARM 架构的应用。目前,CentOS 官方仓库不直接提供 gcc-arm-linux-gnu 和 gcc-aarch64-linux-gnu 包。因此,我们可以从开发者网站(如 ARM 官方或 Linaro)下载预编译的工具链。下面示例展示如何安装 Linaro 提供的 ARM 工具链。

  1. 下载 Linaro 64 位 ARM 工具链
    代码语言:javascript
    复制
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
  1. 解压并安装工具链
    代码语言:javascript
    复制
sudo tar -C

通过学习和掌握这些技术和工具,开发者可以更高效地开发和部署嵌入式系统,满足不同应用场景的需求。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号