任务编写标准输出终端输出“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 交叉配置环境/gcclinaro-4.9.4-2017.01-x86_64_armlinuxgnueabihf

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.cinput.ccalcu.c 这三个C文件和input.h、calcu.h这两个头文件。其中main.c主体input.c 负责接收键盘输入的数值calcu.h进行任意两个相加

图13工程文件夹3.3内容

然后使用gcc 编译器对main.ccalcu.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

渝北仙桃数据

原文地址:https://blog.csdn.net/Akaxi1/article/details/134744094

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_23876.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注