跳转至

Hello World

本章节将讲解如何使用电脑(上位机)交叉编译一个打印 Hello Word 的小应用,并将其上传到开发板(下位机)上运行起来,打印出 hello word

准备编译环境

这里我们使用编译环境配置章节所安装的虚拟机进行演示。这个虚拟机已经配置好了一些基础的编译工具和交叉编译工具链,使用较为方便。

image-20220714151942356

我们先在文件夹里新建一个文件夹,作为存放项目的文件夹,命名为 WorkSpcae

image-20220714154210921

然后在 WorkSpace 文件夹里新建一个文件夹,存放我们的 helloworld 的代码,命名为 helloworld

image-20220714154536753

至此,编译 helloworld 项目的环境就准备完成了。

编写 HelloWorld 代码

进入 helloworld 文件夹,右键点击空白处可以看到 Open in Terminal 选项

image-20220714154511488

打开命令行,输入 touch main.c 命令,新建 main.c 源文件。

image-20220714154712449

双击打开 main.c 源文件,编写源码并保存

#include <stdio.h>
int main(int argc, char const *argv[])
{
    printf("Hello World\n");
    return 0;
}

image-20220714155106682

交叉编译

交叉编译是指在我们的PC机上编译可以在开发板上运行的可执行程序文件。因为是在上位机上编译,然后在不同体系结构的开发板上跑,所以叫交叉编译。

交叉编译前,你要知道

交叉编译所使用的交叉编译工具链名叫toolchain-sunxi-musl-gcc-830存放在 toolchains\rootfsbuild\arm\ 文件夹里。

image-20220714155441887

而编译使用的 gcc 编译器在 toolchains/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/bin 文件夹里。

image-20220714155818227

当然,光有编译器还不够,还需要提供编译时需要用到的那些库文件,头文件。这些文件存放在 toolchains/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/arm-openwrt-linux-muslgnueabi 文件夹里。

image-20220714160310369

开始交叉编译

首先,指定存放交叉编译需要使用的库文件头文件的文件夹

export STAGING_DIR=~/toolchains/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/arm-openwrt-linux-muslgnueabi

image-20220714160532568

然后就可以使用交叉编译工具链来编译了,可以看到编译出的 helloworld 可执行文件已经生成了。

~/toolchains/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/bin/arm-openwrt-linux-gcc -o helloworld main.c

image-20220714160618124

在开发板上运行

我们可以用 U 盘,adb,nfs,TF卡等等各式各样的方法将文件上传到开发板上,这里就使用 TF 卡把 helloworld 可执行文件上传到开发板上。

首先将 TF 卡插入读卡器并接入电脑,在设备,USB里可以看到有一个 Mass Storage 设备。选中这个设备。

image-20220714161152580

然后就可以在虚拟机里看到这个读卡器了。

image-20220714161502449

helloworld 复制进TF卡

image-20220714161556372

开发板插入 TF 卡

tf

ls /dev 查看下 mmcblk1 有没有出现,可以看到这里是有 mmcblk1

image-20220714161934483

然后挂载 TF 卡,分区是 mmcblk1p1,把它挂载到 /mnt/SDCARD 路径下,然后 cd 进入 /mnt/SDCARD 文件夹,可以用 ls 命令列出文件,可以看到 helloworld 就在这里。

mount /dev/mmcblk1p1 /mnt/SDCARD/

image-20220714162242302

使用 chmod 命令赋予 helloworld 执行的权限,运行 helloworld

chmod a+x helloworld
./helloworld

image-20220714162352478

可以看到 Hello World 被打印到屏幕上了