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

news2024/12/23 7:10:00

任务:编写在标准输出终端输出“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

渝北仙桃数据谷

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1275737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络(超详解!) 第二节 物理层(下)

1.信道复用技术 复用 (multiplexing) 是通信技术中的基本概念。 它允许用户使用一个共享信道进行通信&#xff0c;降低成本&#xff0c;提高利用率。 1.频分复用 FDM(Frequency Division Multiplexing) 将整个带宽分为多份&#xff0c;用户在分配到一定的频带后&#xff0c;…

pytorch中Conv1d、Conv2d与Conv3d详解

1 卷积介绍 1.1 什么是卷积 卷积&#xff08;convolution&#xff09;&#xff0c;是一种运算&#xff0c;你可以类比于加&#xff0c;减&#xff0c;乘&#xff0c;除&#xff0c;矩阵的点乘与叉乘等等&#xff0c;它有自己的运算规则&#xff0c;卷积的符号是星号*。表达式…

力扣每日一题(2023-11-30)

力扣每日一题 题目&#xff1a;1657. 确定两个字符串是否接近 日期&#xff1a;2023-11-30 用时&#xff1a;21 m 07 s 时间&#xff1a;11ms 内存&#xff1a;43.70MB 代码&#xff1a; class Solution {public boolean closeStrings(String word1, String word2) {if(word1.…

Kubernetes(K8s)Pod控制器详解-06

Pod控制器详解 Pod控制器介绍 Pod是kubernetes的最小管理单元&#xff0c;在kubernetes中&#xff0c;按照pod的创建方式可以将其分为两类&#xff1a; 自主式pod&#xff1a;kubernetes直接创建出来的Pod&#xff0c;这种pod删除后就没有了&#xff0c;也不会重建 控制器创建…

深搜回溯剪枝优化策略-全排列II

LCR 084. 全排列 II - 力扣&#xff08;LeetCode&#xff09; 这道题的主体思想和之前讲过的全排列是相似的&#xff0c;不同的是思考的角度要侧重于剪枝方向&#xff0c;所以可以通过这道题对剪枝思想的进一步扩展&#xff1b; 通过题意&#xff0c;可以知道&#xff0c;在上一…

智能电表红外线有什么用?

在如今的智能家居时代&#xff0c;智能电表作为电力行业的一项重要创新&#xff0c;正在逐渐取代传统电表&#xff0c;为用户提供更加便捷和智能的用电方式。而在智能电表的技术中&#xff0c;红外线的应用起到了重要的作用。那么&#xff0c;智能电表红外线有什么用呢&#xf…

【Vue3+Ts项目】硅谷甄选 — 搭建后台管理系统模板

一、 项目初始化 一个项目要有统一的规范&#xff0c;需要使用eslintstylelintprettier来对我们的代码质量做检测和修复&#xff0c;需要使用husky来做commit拦截&#xff0c;需要使用commitlint来统一提交规范&#xff08;即统一提交信息&#xff09;&#xff0c;需要使用pre…

【C++笔记】红黑树封装map和set

一、map和set的泛型封装逻辑 map和set的底层都是红黑树&#xff0c;所以我们想要用红黑树封装map和set的第一个问题就来了&#xff0c;因为set是key结构而map是key-value结构&#xff0c;怎样用同一个底层结构去封装出两个不同存储结构的容器呢&#xff1f;难道我们要将红黑树…

Spring Security 6.x 系列(8)—— 源码分析之配置器SecurityConfigurer接口及其分支实现

一、前言 本章主要内容是关于配置器的接口架构设计&#xff0c;任意找一个配置器一直往上找&#xff0c;就会找到配置器的顶级接口&#xff1a;SecurityConfigurer。 查看SecurityConfigurer接口的实现类情况&#xff1a; 在 AbstractHttpConfigurer 抽象类的下面可以看到所有…

【Unity】模型导入和动画

模型下载和格式转换 在模之屋下载了我推&#xff08;&#xff09; https://www.aplaybox.com/ 获得tex纹理文件和.pmx文件 需要转换为Unity可以使用的.fbx文件 下载Blender2.93和CATS插件 Blender2.93下载页面&#xff1a;https://www.blender.org/download/lts/ CATS插件下…

【Python表白系列】这个情人节送她一个漂浮的爱心吧(完整代码)

文章目录 漂浮的爱心环境需求完整代码详细分析系列文章 漂浮的爱心 环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0&#xff08;可选&#xff0c;这个库用于打包&#xff0c;使程序没有python环境也可以运行&#xff0c;如果想发给好朋友的话需要这…

【VMware相关】VMware vSphere存储方案

一、iSCSI存储 参考文档 VMware官方文档&#xff1a;配置iSCSI适配器和存储 华为配置指南&#xff1a;VMware ESXi下的主机连通性指南 1、配置说明 如下图所示&#xff0c;VMware配置iSCSI存储&#xff0c;需要将物理网卡绑定到VMKernel适配器上&#xff0c;之后再将VMKernel适…

Golang数据类型(数字型)

Go数据类型&#xff08;数字型&#xff09; Go中数字型数据类型大致分为整数&#xff08;integer&#xff09;、浮点数&#xff08;floating point &#xff09;和复数&#xff08;Complex&#xff09;三种 整数重要概念 整数在Go和Python中有较大区别&#xff0c;主要体现在…

2021年11月10日 Go生态洞察:Twelve Years of Go

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Python作用域大揭秘:局部、全局,global关键字

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python作用域是编程中关键的概念之一&#xff0c;决定了变量在代码中的可见性和生命周期。本文将深入探讨Python的局部作用域、全局作用域&#xff0c;以及如何使用global关键字来操作全局变量。通过丰富的示例代…

Jmeter测试地图服务性能

一、前言 Jmeter可以用来模拟多用户来访问http&#xff08;s&#xff09;请求&#xff0c;并返回访问结果&#xff0c;而地图服务归根结底仍是个http&#xff08;s&#xff09;请求。所以我们可以使用Jmeter对地图服务进行压力测试。 当然地图服务也有着它的特殊性&#xff0…

AES加密技术:原理与应用

一、引言 随着信息技术的飞速发展&#xff0c;数据安全已成为越来越受到重视的领域。加密技术作为保障数据安全的重要手段&#xff0c;在信息安全领域发挥着举足轻重的作用。AES&#xff08;Advanced Encryption Standard&#xff09;作为一种对称加密算法&#xff0c;自1990年…

算法题--排椅子(贪心)

题目链接 code #include<bits/stdc.h> using namespace std;struct node{int indx;//用来存储数组下标int cnt;//用来计数 };bool cmp(node a,node b){ //判断是否是数字最大的一个就是经过最多谈话人的道return a.cnt>b.cnt; } node row[2010],cow[2010];bool cmp…

C++12.1

三种运算符重载&#xff0c;每个至少实现一个运算符的重载 #include <iostream>using namespace std;class Person {friend const Person operator- (const Person &L, const Person &R);friend bool operator<(const Person &L,const Person &R);f…

TZOJ 1420 手机短号

答案&#xff1a; #include <stdio.h> #include <string.h> int main() {int n 0;scanf("%d", &n);while (n--) //输入n次{char phone[12];scanf("%s", phone);printf("6%s\n", phone 6); //跳过数组前6个元素&#…