【嵌入式Linux程序开发综合实验】-1(附流程图) | ARM开发板 | 测试“Hello World” | Makefile文件 | 实现加法相加

任务:编写在标准输出终端输出“Hello World!”的C语言代码以及输入指定数字相加结果、Makefile,并分别编译出在PC与ARM上运行的可执行程序文件。

设备以及工具

硬件:Linux开发板、PC机、串口连接线

图1 Linux开发板以及串口接线

软件:PC机Linux操作系统、Linux集成开发环境、设备驱动程序、超级终端通讯程序。

流程图

步骤

1.PC机Linux操作系统:Ubuntu16.04LTS

图2 PC机Linux操作系统Ubuntu16.04LTS

2.Linux集成开发环境:

配置交叉配置环境,Ubuntu 自带的gcc 编译器是针对X86 架构的,而要编译的是ARM 架构的代码,所以需要一个在X86架构的PC上运行,可以编译ARM架构代码的GCC编译器,这个编译器叫做交叉编译器。

图3 交叉配置环境/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf

3.设备驱动程序

LMX6U-ALPHA 开发板使用CH340 芯片实现了USB 转串口功能,接下来需要安装CH340驱动器。

图4 CH340启动器安装

4.超级终端通讯程序

使用Xsell作为超级端通讯程序,实现PC机和开发板的串口通信。

图5 超级端通讯程序Xsell

首先在PC机上的Ubuntu系统里编写出能够实现打印“Hello My name is Akaxi”的可执行文件,那么需要编写对应的C程序文件。

这里我先是在目录~/C_Porgram/3.1下新建了一个main.c程序,并且输入程序:

#include <stdio.h>  	  
int main(int argc, char *argv[])  
{  
    printf("Hello! My Name is Akaxi");  
}  

图6 测试程序

然后对其进行cat执行,可以看到在Ubuntu系统下执行打印成功。

图7 cat测试程序

然后看看我们这里的编译环境是什么:

图8 查看gcc版本

可以看到我们在PC机上的编译环境是gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12),这个编译下的可执行文件是不能够在Liunx的开发板上正常运行的。

接下来指定通过gcc编译生成a.out可执行文件,也可以通过指定编译后的可执行文件名称,这里指定可执行文件为main:

图9 测试可执行文件main

通过输入命令./main即可在终端执行可执行文件,如上图可见打印成功。

当我们的被编译文件出现错误时,进行编译就会提示编译错误,这和我们在Vscode里面进行编译报错提示一致,我们将main.c文件故意写错。

图10 错写main文件

由下图可知,在编译时系统终端提示报错了:

图11 编译错误的main文件

将错误改过来之后进行编译,得到可执行文件main后进行执行,输入正确的加法信息可以看到系统终端输出:

图12 执行修改后的main文件

接下来新建工程文件夹3.3,通过键盘输入两个整形数字,然后计算他们的和并将结果显示在屏幕上,在这个工程中有main.c、input.c和calcu.c 这三个C文件和input.h、calcu.h这两个头文件。其中main.c是主体,input.c 负责接收从键盘输入的数值,calcu.h进行任意两个数相加。

图13工程文件夹3.3内容

然后使用gcc 编译器对main.c、calcu.c 和input.c 这三个文件进行编译,编译生成可执行文件main,随机在终端执行可执行文件,输入数字2和7,执行后测试结果为2+7=9,测试结果正确。

指令:gcc main.c calcu.c input.c -o main

图14生成可执行文件main且执行

但是如果每次都执行代码编译文件,并且需要编译的文件如果超多,那么效率就会很低,在这种情况下,可以编写Makefile文件,接下来对我们需要编译的文件编写对应规则,以下是解释:

Makefile中的规则由目标、依赖和命令组成:

main: main.o input.o calcu.o

    gcc -o main main.o input.o calcu.o

这里定义了主目标main,它依赖于三个对象文件main.o、input.o和calcu.o。当所有的依赖都被满足时,执行后面的命令,使用gcc将这三个对象文件链接成一个可执行文件main

main.o: main.c

    gcc -c main.c

这里定义了目标main.o,它依赖于源文件main.c。当源文件被修改或不存在时,执行后面的命令,使用gcc将main.c编译成一个目标文件main.o

同理:

input.o: input.c

    gcc -c input.c

calcu.o: calcu.c

    gcc -c calcu.c

最后,定义了目标clean,它没有依赖。执行make clean命令时,会执行后面的命令,删除所有的目标文件(以.o结尾的文件)和可执行文件main。

clean:

    rm *.o

    rm main

我们通过在终端中运行make命令,Makefile会自动根据文件的依赖关系来编译和链接项目。如果其中的任何源文件被修改,只有受影响的目标文件会被重新编译,而不是整个项目。此外,通过运行make clean命令可以清除生成的目标文件和可执行文件。

Makefile文件:

图15 Makefile文件

代码:

main: main.o input.o calcu.o  
    gcc -o main main.o input.o calcu.o  
main.o: main.c  
    gcc -c main.c  
input.o: input.c  
    gcc -c input.c  
calcu.o: calcu.c  
	gcc -c calcu.c   
  
clean:  
    rm *.o  
    rm main  

接下来测试我们编写的Makefile文件,在终端运行make即可生成编译后的可执行文件main,可以看到如下图所示执行成功。

图16 使用Makefile文件编译文件

接下来测试我们编写的Makefile文件中的清空功能,在终端运行make clean即可清除生成编译后的文件,可以看到如下图所示执行成功。

清空:

图17 使用make clean清除文件

交叉编译:为了在开发板上运行程序,将 Makefile 中的编译器修改为交叉编译器,这样我们在Ubuntu系统下能够指定编译生成的ARM架构可执行文件。

图18 交叉编译Makefile文件

test = main.o  
objects = $(test)  
test = main.o input.o  
test +=calcu.o  
	  
main: $(objects)  
    arm-linux-gnueabihf-gcc -o main $(objects)  
%.o: %.c  
    arm-linux-gnueabihf-gcc -c $<  
	  
.PHONY :clean  
clean:  
    rm *.o  
    rm main  

在终端运行make,可以看到交叉编译后的main文件:

图19 交叉编译Makefile文件

将交叉编译后的mian可执行文件复制到share里,传到windows上,便于之后上传到开发板上。

然后使用笔记本Windows系统下的Xshell软件,通过Usb串口连接到笔记本,将之前的main文件上传到开发板的Liunx系统下。

图20 开发板以及连线图

Xshell软件配置如下:

如下使用lzr软件功能将交叉编译后的main文件上传到Liunx开发板。

图21 上传main文件到开发板

图22 开发板执行文件main测试

在开发板进入指定目录,运行main可执行文件,输入两个数字2 7可以看到运行结果2+7=9,测试成功,结果正确。

2023.12.1

渝北仙桃数据谷

本篇主要讲述进行嵌入式 本篇主要讲述进行嵌入式 本篇主要讲述进行嵌入式 本篇主要讲述进行嵌入式 本篇主要讲述进行嵌入式 本篇主要讲述进行嵌入式 Linux 开发所必备的基础知识, 以实用和够为标准进行介绍开发所必备的基础知识, 以实用和够为标准进行介绍开发所必备的基础知识, 以实用和够为标准进行介绍开发所必备的基础知识, 以实用和够为标准进行介绍开发所必备的基础知识, 以实用和够为标准进行介绍开发所必备的基础知识, 以实用和够为标准进行介绍开发所必备的基础知识, 以实用和够为标准进行介绍开发所必备的基础知识, 以实用和够为标准进行介绍开发所必备的基础知识, 以实用和够为标准进行介绍开发所必备的基础知识, 以实用和够为标准进行介绍开发所必备的基础知识, 以实用和够为标准进行介绍开发所必备的基础知识, 以实用和够为标准进行介绍与嵌入式嵌入式 LinuxLinux 开发不相关的知识都在讲述之列。,特别是 开发不相关的知识都在讲述之列。,特别是 开发不相关的知识都在讲述之列。,特别是 开发不相关的知识都在讲述之列。,特别是 开发不相关的知识都在讲述之列。,特别是 开发不相关的知识都在讲述之列。,特别是 开发不相关的知识都在讲述之列。,特别是 开发不相关的知识都在讲述之列。,特别是 开发不相关的知识都在讲述之列。,特别是 开发不相关的知识都在讲述之列。,特别是 LinuxLinux 命令部分,并没有介绍 命令部分,并没有介绍 命令部分,并没有介绍 命令部分,并没有介绍 命令部分,并没有介绍 全部 的 Linux Linux 命令, 命令, 而仅精选嵌入式 仅精选嵌入式 仅精选嵌入式 仅精选嵌入式 LinuxLinux 开发中的常用命令进行介绍。 开发中的常用命令进行介绍。 开发中的常用命令进行介绍。 开发中的常用命令进行介绍。 开发中的常用命令进行介绍。本篇一共分为 本篇一共分为 本篇一共分为 6章,从 章,从 章,从 LinuxLinux Linux 操作系统开始, 操作系统开始, 操作系统开始, 操作系统开始, 循序渐进 循序渐进 循序渐进 地介绍, 到最后 讲述 嵌入式 嵌入式 Linux Linux 开发环境的构建, 开发环境的构建, 开发环境的构建, 开发环境的构建, 为嵌入式嵌入式嵌入式 Linux Linux 开发做准备。各章 开发做准备。各章 开发做准备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Akaxi-1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值