【嵌入式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

渝北仙桃数据谷

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

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

相关文章

vmware 安装 AlmaLinux OS 8.6

选择系统镜像 选择镜像 选择安装位置和修改名称 可以自定义硬件&#xff0c;也可以不选择&#xff0c;后面可以再设置 自定义硬件可以设置内存和cpu等信息 安装虚拟机系统 密码如果简单的话需要点击两次done 才能保存

特殊二叉树——堆

&#x1f308;一、堆的基本概念 1.堆&#xff1a;非线性结构&#xff0c;是完全二叉树 2.堆分为大堆和小堆。 大堆&#xff1a;树中任意一个父亲都大于等于孩子&#xff0c;根节点值大于等于其所有子孙节点的值。 小堆&#xff1a;树中任意一个父亲都小于等于孩子&#xff0c;…

兼容jlink OB arm仿真器使用(杜邦线过长导致烧写总是失败)

一、兼容jlink OB的使用&#xff1a; 1、设置中要选择jlink&#xff1b; 2、模式选择SWD模式&#xff08;接三根线&#xff09;&#xff1b; 二、杜邦线过长导致stm32的stlink烧写总是失败 用ST-link烧写提示的错误信息有&#xff1a; Error while accessing a target reso…

Redis中的数据结构

文章目录 第1关&#xff1a;Redis中的数据结构 第1关&#xff1a;Redis中的数据结构 这是上篇文章的第一关&#xff0c;只不过本篇是代码按行做的&#xff0c;方便一下大家使用。 代码如下&#xff1a; redis-cliset hello redislpush educoder-list hellorpush educoder-lis…

51单片机制作数字频率计

文章目录 简介设计思路工作原理Proteus软件仿真软件程序实验现象测量误差和范围总结 简介 数字频率计是能实现对周期性变化信号频率测量的仪器。传统的频率计通常是用很多的逻辑电路和时序电路来实现的&#xff0c;这种电路一般运行较慢&#xff0c;而且测量频率的范围较小。这…

【SpringCloud】注册中心和Ribbon负载均衡

SpringCloud 1.Eureka注册中心 1.1 Eureka的作用 注册中心拉取服务负载均衡远程调用 order-service得知user-service实例地址流程&#xff1a; user-service服务实例启动后&#xff0c;将自己的信息注册到eureka-server&#xff08;Eureka服务端&#xff09;&#xff0c;称…

redis主从复制模式和哨兵机制

目录 第一章、主从复制模式1.1&#xff09;Redis 主从复制模式介绍1.2&#xff09;Redis 主从复制实现、 第二章、哨兵机制2.1&#xff09;容灾处理之哨兵2.2&#xff09;Sentinel 配置 第一章、主从复制模式 1.1&#xff09;Redis 主从复制模式介绍 ①单点故障&#xff1a;数…

honle电源维修UV电源控制器EVG EPS40C-HMI

好乐UV电源控制器维修&#xff1b;honle控制器维修&#xff1b;UV电源维修MUC-Steuermodul 2 LΛmpen D-82166 主要维修型号&#xff1a; EVG EPS 60/120、EVG EPS 100、EVG EPS200、EVG EPS 220、EVG EPS 340、EVG EPS40C-HMI、EVG EPS60 HONLE好乐uv电源维修故障包括&#…

申请开通QMT量化需要多少资金?免费开通!

最近量化交易在市场上大火&#xff0c;很多投资者想要参与进来。QMT量化软件是目前市场上一款比较常见并且强大的量化软件。那开通QMT量化交易软件需要多少资金&#xff1f; QMT量化交易软件是一种专门用于量化交易的工具&#xff0c;它能够帮助投资者通过程序化交易策略进行股…

如何解决“该公众号提供的服务出现故障,请稍后再试”

出现“该公众号提供的服务出现故障&#xff0c;请稍后再试” &#xff0c; 或者是出现 “公众号接口出现异常&#xff0c;请加入微信群接收接口报警” 的提问&#xff0c; 出现这个一般是开发者自身服务器出现问题导致的。 本文我来教大家如何排查。 第一步&#xff1a;加入告…

【力扣周赛】第 115 场双周赛(⭐优化背包DP)(TODO)

文章目录 竞赛链接Q1&#xff1a;2899. 上一个遍历的整数&#x1f4a9;&#xff08;阅读理解题&#xff0c;按题意模拟&#xff09;Q2&#xff1a;2900. 最长相邻不相等子序列 I&#xff08;贪心&#xff09;Q3&#xff1a;2901. 最长相邻不相等子序列 II&#xff08;类似 最长…

算法通关村第一关—白银挑战—链表高频面试算法题—查找两个链表的第一个公共子节点

文章目录 查找两个链表的第一个公共子节点&#xff08;1&#xff09;暴力求解法&#xff08;2&#xff09;使用哈希Hash⭐&#xff08;3&#xff09;使用集合⭐ - 与Hash类似&#xff08;4&#xff09;使用栈⭐&#xff08;5&#xff09;仍有更多方法&#xff0c;作者尚未理解&…

【小布_ORACLE笔记】Part11-1--RMAN Backups

Oracle的数据备份于恢复RMAN Backups 学习第11章需要掌握&#xff1a; 一.RMAN的备份类型 二.使用backup命令创建备份集 三.创建备份文件 四.备份归档日志文件 五.使用RMAN的copy命令创建镜像拷贝 文章目录 Oracle的数据备份于恢复RMAN Backups1.RMAN Backup Concepts&#x…

LeetCode | 965. 单值二叉树

LeetCode | 965. 单值二叉树 OJ链接 首先判断树为不为空&#xff0c;为空直接true然后判断左子树的val&#xff0c;和根的val相不相同再判断右子树的val&#xff0c;和根的val相不相同最后递归左子树和右子树 bool isUnivalTree(struct TreeNode* root) {if(root NULL)retur…

Python解释器的安装【侯小啾python领航班系列(一)】

Python解释器的安装【侯小啾python领航班系列(一)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

深入Spring Security魔幻山谷-获取认证机制核心原理讲解(新版)

文/朱季谦 这是一个古老的传说。 在神秘的Web系统世界里&#xff0c;有一座名为Spring Security的山谷&#xff0c;它高耸入云&#xff0c;蔓延千里&#xff0c;鸟飞不过&#xff0c;兽攀不了。这座山谷只有一条逼仄的道路可通。然而&#xff0c;若要通过这条道路前往另一头的…

Vue + Element ui 实现动态表单,包括新增行/删除行/动态表单验证/提交功能

原创/朱季谦 最近通过Vue Element ui实现了动态表单功能&#xff0c;该功能还包括了动态表单新增行、删除行、动态表单验证、动态表单提交功能&#xff0c;趁热打铁&#xff0c;将开发心得记录下来&#xff0c;方便以后再遇到类似功能时&#xff0c;直接拿来应用。 简化的页…

zabbix6.4.0配置邮件及企微机器人群聊告警

一、邮件告警 根据公司邮箱自行配置&#xff0c;电子邮件、用户账号密码填自己的邮箱账号密码 动作本次使用的默认的&#xff0c;如果为了更加美观可自行修改。 二、企业微信机器人告警 首先在企微上创建群聊&#xff0c;之后添加群聊机器人 将地址复制&#xff0c;后面用 …

MATLAB 模型参考自适应控制 - Model Reference Adaptive Control

系列文章目录 文章目录 系列文章目录前言一、参考模型二、扰动与不确定性模型三、直接 MRAC名义模型参数更新间接 MRAC估计器模型和控制器增益参数更新学习修正参考文献 前言 模型参考自适应控制模块计算控制动作&#xff0c;使不确定的受控系统跟踪给定参考被控对象模型的行为…

【LeetCode刷题笔记】102. 二叉树的层序遍历

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…