正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-19.1讲 串口格式化输出printf

前言:

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

引用:

正点原子IMX6U仓库 (GuangzhouXingyi) - Gitee.com

《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf》

正点原子资料下载中心 — 正点原子资料下载中心 1.0.0 文档

正文:

本文是 “正点原子[第二期]Linux之ARM(MX6U)裸机篇--第19 讲” 的读书笔记。第19讲主要是介绍I.MX6U处理器的UART串口并实现串口UART的字符格式化打印实验。本节将参考正点原子的视频教程第18讲和配套的正点原子开发指南文档进行学习。

0. 概述

上一章实验我们实现了 UART1 基本的数据收发功能,虽然可以用来调试程序,但是功能太单一了,只能输出字符。如果需要输出数字的时候就需要我们自己先将数字转换为字符,非常的不方便。学习 STM32 串口的时候我们都会将 printf 函数映射到串口上,这样就可以使用printf 函数来完成格式化输出了,使用非常方便。本章我们就来学习如何将 printf 这样的格式化函数移植到 I.MX6U-ALPHA 开发板上。

1. 串口格式化函数简介

格式化函数说的是 printf, sprintf 和 scanf 这样的函数,分为格式化输出和格式化输入两类函数。学习C语言的时候常常会通过 printf 函数在屏幕上显示字符串,通过 scanf 函数从键盘获取输入。这样就用了输入和输出了,实现了最基本的人机交互。学习STM32的时候会将 printf 映射到串口上,这样即使没有屏幕,也可以通过串口和开发板进行交互。在 I.MX6U-ALPHA 开发板上也可以使用此方法,将  printf 和 scanf 映射到串口上,这样就可以使用 SecureCRT 作为开发板的终端,完成与开发板的交互。也可以使用 printf 和 sprintf 来实现各种各样的格式化字符串,方便我们后续的开发。串口驱动我们上一章已经编写完成了,而且实现了最基本的字节收发,本章我们就通过移植网上别人已经做好的文件来实现格式化函数。

2. 硬件原理分析

本章所需的硬件和上一章相同

3. 实验程序编写

本章实验所需要移植的源码已经放到了开发板光盘中,路径为: 1、例程源码->5、模块驱动源码->2、格式化函数源码->stdio,文件夹 stdio 里面的文件就是我们要移植的源码文件。本章实验在上一章例程的基础上完成,将 stdio 文件夹复制到实验工程根目录中,如图 22.3.1 所示:

stdio 里面有两个文件夹: include 和 lib,这两个文件夹里面的内容如图 22.3.2 所示:

图 22.3.2 就是 stdio 里面的所有文件, stdio 里面的文件其实是从 uboot 里面移植过来的。后面学习 uboot 以后大家有兴趣的话可以自行从 uboot 源码里面“扣”出相应的文件,完成格式化函数的移植。这里要注意一点, stdio 中并没有实现完全版的格式化函数,比如 printf 函数并不支持浮点数,但是基本够我们使用了。

将正点原子提供的示例源码中的"stdio"文件夹放到本实验的 "14_printf" 目录中,然后修改Makefile 将移植的"stdio"目录放到编译源文件里。

3.1 Makefile编译错误1

执行 "make" 命令进行编译,此时编译器报如下错误提示:

 在正点原子的视频教程和指导文档里说明了解决此编译错误的方法是修改Makefile,在Makefile编译命令里加上如下编译选项 "-Wa,-mimplicit-it=thumb"【ARM 嵌入式 编译系列 2.3 -- GCC 编译参数学习 -Wa,-mimplicit-it=thumb 使用介绍】-CSDN博客文章浏览阅读750次,点赞12次,收藏8次。在使用编译 ARM 架构代码时,你可能会碰到一些控制汇编器行为的编译器选项。-wa是一个 GCC 编译器选项,用于向汇编器传递参数。-wa。_-wa,-mimplicit-it=thumbhttps://blog.csdn.net/sinat_32960911/article/details/135645189

$(COBJS) : obj/%.o : %.c
	$(CC) -Wall -nostdlib -fno-builtin -Wa,-mimplicit-it=thumb $(INCLUDE) -O2 -c -o $@ $<

 3.2 Makefile编译错误2

执行 "make" 命令进行编译,此时编译器报如下错误提示:

"__aeabi_uidiv" 用来实现ARM无符号数除法,编译链接器报错的是因为 ARM 是RISC精简指令集没有算术除法指令,所以在ARM裸机开发(也包括Uboot)里面的除法运算需要使用到 GCC 编译器提供的 libgcc.a 库里提供的ARM汇编除法函数实现。一般从uboot或者Kernel内核里能够找到ARM汇编除法函数的实现 "__aeabi_uidiv" 。

LIBPATH		:= -lgcc -L /home/dimon/I.MX6U/tool/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf/lib/gcc/arm-linux-gnueabihf/4.9.4/
#LIBGCCA		:= /home/dimon/I.MX6U/tool/gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf/lib/gcc/arm-linux-gnueabihf/4.9.4/libgcc.a


$(TARGET).bin : $(OBJS)
	echo $(LD) $(TARGET).elf
#	$(LD) -Timx6u.lds  $(LIBPATH) -o $(TARGET).elf $^ $(LIBGCCA) 
	$(LD) -Timx6u.lds  -o $(TARGET).elf $^ $(LIBGCCA) $(LIBPATH)
	$(OBJCOPY) -O binary -S $(TARGET).elf $(TARGET).bin
	$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis
#	$(OBJDUMP) -d -s -m arm $(TARGET).elf > $(TARGET).dis

注意这里经过我的测试发现 "$(LIBPATH)" 需要写在链接命令的最后,刚开始我将"$(LIBPATH)" 写在了链接命令的中间部分链接的时候编译器一直报错,即使我们修改Makefiel指定了链接路径。

div64.c:(.text+0x22): undefined reference to `__aeabi_uidiv'
make: *** [printf.bin] Error 1

 这里"$(LIBPATH)"在链接命令里先后顺序影响到最终链接结果是否成功的原因是和GCC LD 连接器的文件链接顺序机制有关系。在《程序员的自我修养-链接装载与库》中好像介绍过这一部分,印象中好像是先在链接.o文件的时候发现找不到某个符号,然后去搜索 "-Lxx -lxx" 指令的库文件中去搜索未定义的符号,如果先在链接命令里指定了"-Lxx -lxx"此时没有未定义符号的话就忽略掉了,记得号向是这样解释的。

好了,这里注意 "$(LIBPATH)" 需要写在链接命令的最后。

4. prinf格式化源码编写

移植好以后就要测试相应的函数工作是否正常,我们使用 scanf 函数等待键盘输入两个整数,然后将两个整数进行相加并使用 printf 函数输出结果。在 main.c 里面输入如下内容。

#include "cc.h"
#include "bsp_clk.h"
#include "bsp_led.h"
#include "bsp_delay.h"
#include "bsp_beep.h"
#include "bsp_gpio.h"
#include "bsp_key.h"
#include "bsp_int.h"
#include "bsp_exti.h"
#include "bsp_epittimer.h"
#include "bsp_keyfilter.h"
#include "bsp_delay.h"
#include "bsp_uart.h"
#include "stdio.h"


char *banner = 	"========================================================\r\n"
				"正点原子I.MX6ULL ALPHA/Mini开发板Linux驱动之ARM逻辑开发\r\n" \
				"--Date: 	2024/05/21\r\n" \
				"--Author: 	ChenHaoxu, Dimon.chen, 11813202388@qq.com\r\n" \
				"========================================================\r\n";



int main(void)
{

	static uint8_t led_state = OFF;
	// static uint8_t beep_state = OFF;

	int_init();			/* 中断初始化 */
	imx6u_clkinit();	/* 时钟主频初始化,PLL1, PLL2, PLL3 */
	clk_init();			/* 使能所有外设时钟 */
	led_init();			/* led gpio 初始化 */
	beep_init();		/* beep gpio 初始化 */
	//key_init();			/* key gpio 初始化 */
	exti_init();		/* gpio外设中断初始化 */

	//epittimer_init(0, 0, 33000000);	/* EPIT分频frac=0 1分频,EPIT1时钟源66MHz,EPIT1->LR加载值计数器=33MHz,定时周期为500ms */
	//epittimer_init(1, 0, 66000000/20);	/* EPIT分频frac=0 1分频,EPIT1时钟源66MHz,EPIT1->LR加载值计数器=33MHz,定时周期为1000/20=50ms */

	keyfilter_init();
	delay_init();
	uart_init();		/* UART初始化 */


	led_switch(LED_0, ON);


	beep_switch(ON);
	delay(200);
	beep_switch(OFF);
	delay(200);
	beep_switch(ON);
	delay(200);
	beep_switch(OFF);

	printf("%s", banner);

	unsigned int a = 10;

    while(1){
		led_state = !led_state;
		led_switch(LED_0, led_state);

		printf("Hello World\r\n");
		printf("a=%d hex=%x\r\n", a, a);

		scanf("%u", &a);
    }

    return 0;
}

5. 编译烧写SD卡验证实验结果

译修改主频后源码烧录SD卡验证本节的 I.MX6U UART串口实验。预期烧录SD卡后正点原子I.MX6ULL ALPHA/Mini 开发板后,UART串口可以在串口工具,如SecureCRT或者Xshell上打印字符串输出。

我本地验证的结果是基于GPT定时器的高精度延时实验结果正常,UART串口可以在串口工具XShell上打印字符串。

6. 总结和实验遇到的问题记录

本节移植了正点原子示例源码中的 printf 格式化打印函数,之后就可以在串口中实现字符串格式化打印来调试I.MX6U ARM 裸机开发板了,这样会方便很多。本节实验里遇到的问题主要是移植 printf 函数时的编译报错问题,需要修改Makefile解决,makefile修改方法在正点原子的教程里和网上博客里有多用说明,本文也记录了解决问题的详细步骤。

7. 结束

本文至此结束。


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM(5):虚拟机性能分析和故障解决工具概述

1 工具概述 作为一个java程序员&#xff0c;最基本的要求就是用java语言编写程序&#xff0c;并能够在jvm虚拟机上正常运行&#xff0c;但是在实际开发过程中&#xff0c;我们所有的程序由于各种各样的原因&#xff0c;并不是总能够正常运行&#xff0c;经常会发生故障或者程序…

cocos 写 连连看 小游戏主要逻辑(Ts编写)算法总结

cocos官方文档&#xff1a;节点系统事件 | Cocos Creator 游戏界面展示 一、在cocos编译器随便画个页面 展示页面 二、连连看元素生成 2.1、准备单个方块元素&#xff0c;我这里就是直接使用一张图片&#xff0c;图片大小为100x100&#xff0c;描点围为&#xff08;0&#xf…

某钢铁企业数字化转型规划案例(114页PPT)

案例介绍&#xff1a; 该钢铁企业的数字化转型案例表明&#xff0c;数字化转型是钢铁企业应对市场竞争、提高生产效率、降低成本、优化资源配置和降低能耗排放的重要手段。通过引入先进的技术和管理理念&#xff0c;加强员工培训和人才引进&#xff0c;企业可以成功实现数字化…

数据挖掘实战-基于内容协同过滤算法的电影推荐系统

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

轻松上手ClickHouse:ClickHouse入门

引言 在数字化时代&#xff0c;大数据处理和分析已经成为了各行各业不可或缺的一环。而ClickHouse&#xff0c;作为一款高性能的列式数据库管理系统&#xff0c;以其卓越的查询性能和灵活的扩展性&#xff0c;赢得了众多企业和开发者的青睐。本文将带领大家走进ClickHouse的世…

【数组】Leetcode 452. 用最少数量的箭引爆气球【中等】

用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地…

初识java——javaSE(6)抽象类与接口【求个关注!】

文章目录 前言一 抽象类1.1 抽象类的概念1.2 抽象类的语法&#xff1a;1.3 抽象类与普通类的区别&#xff1a; 二 接口2.1 接口的概念2.2 接口的语法2.2.1 接口的各个组成2.2.2 接口之间的继承 2.3 接口的实现接口不可以实例化对象 2.4 接口实现多态 三 Object类3.1 Object类是…

HCIP【VRRP、MSTP、VLAN综合实验】

目录 一、实验拓扑图&#xff1a; ​编辑二、实验要求 三、实验思路 四、实验步骤 &#xff08;1&#xff09; eth-trunk技术配置 &#xff08;2&#xff09;vlan 技术配置 &#xff08;3&#xff09;配置SW1、SW2、AR1、ISP的IP地址 &#xff08;4&#xff09;在交换机…

Jetbrains插件AI Assistant,终于用上了

ai assistant激活成功后&#xff0c;如图 ai assistant获取&#xff1a;https://web.52shizhan.cn/activity/ai-assistant 主要功能如下

kubernetes(k8s) v1.30.1 helm 集群安装 Dashboard v7.4.0 可视化管理工具 图形化管理工具

本文 紧接上一篇&#xff1a;详细教程 Centos8.5 基于 k8s v1.30.1 部署高可用集群 kubeadm 安装 kubernetes v1.30.1 docker集群搭建 延长证书有效期-CSDN博客 1 Dashboard 从版本 7.0.0 开始&#xff0c;不再支持基于清单的安装。仅支持基于 Helm 的安装. #Helm 下载安装 …

PCIe协议之-Flow Control基础

✨前言&#xff1a; Flow Control即流量控制&#xff0c;这一概念起源于网络通信中。PCIe总线采用Flow Control的目的是&#xff0c;保证发送端的PCIe设备永远不会发送接收端的PCIe设备不能接收的TLP&#xff08;事务层包&#xff09;。也就是说&#xff0c;发送端在发送前可以…

Java设计模式(23种设计模式 重点介绍一些常用的)

创建型模式&#xff0c;共五种&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式&#xff0c;共七种&#xff1a;适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式&#xff0c;共十一种&#xff1a;…

限制U盘使用:企业数据安全的软件解决方案

在当今数字化办公环境中&#xff0c;U盘作为一种便捷的数据传输工具&#xff0c;其使用在企业内部非常普遍。然而&#xff0c;U盘的不当使用也给企业数据安全带来了巨大风险。为了防止数据泄露和病毒传播&#xff0c;企业需要采取有效的软件解决方案来限制U盘的使用。本文将探讨…

【qt】初识模型和视图

模型和视图 一.模型和视图的概念1.关系2.模型3.数据4.视图5.特点 二.文件系统模型1.那种数据&#xff1f;2.界面拖放3.创建模型4.模型设置数据5.视图设置模型6.模型索引7.模型操作数据①文件名②文件大小③文件类型④是否是目录⑤文件路径 三.字符串链表模型1.那种数据&#xf…

微信小程序开发 tabbar组件常见问题

一、 tabbar不显示问题 问题 刚开始我在app.json中配置了下面的代码&#xff0c;但tabbar并没有显示。代码如下&#xff1a; "tabBar": {"custom": true,"color": "#7A7E83","selectedColor": "#3cc51f","…

宠物空气净化器性价比大对决:小米、希喂、华为测评哪款最好用

在养宠的过程中中&#xff0c;我们经常会面对一些挑战&#xff0c;其中最为常见且令人困扰的就是宠物的掉毛问题。家中的猫猫们仿佛行走的大型蒲公英&#xff0c;不经意间就将毛发散落在各个角落&#xff0c;无论是家居摆设、舒适的沙发&#xff0c;还是我们心爱的衣物&#xf…

基于网络爬虫技术的网络新闻分析(四)

目录 4.2 系统异常处理 4.2.1 爬虫异常总体概况 4.2.2 爬虫访问网页被拒绝 5 软件测试 5.1 白盒测试 5.1.1 爬虫系统测试结果 5.1.2 中文分词系统测试结果 5.1.3 中文文章相似度匹配系统测试结果 5.1.4 相似新闻趋势展示系统测试结果 5.2 黑盒测试 5.2.1 爬虫系统测…

CTF实战分享 | RWZIP

前言 首先我们要了解&#xff0c;压缩包本身并不具备隐藏信息的功能&#xff0c;但由于在CTF竞赛中&#xff0c;经常出现压缩包与隐写术结合在一起的题目&#xff0c;所以我们需要掌握在CTF竞赛中有关 ZIP 压缩包题目的常见题型及分析手段。 读者福利 | CSDN大礼包&#xff1a…

Python面向对象数据库之ZODB使用详解

概要 ZODB(Zope Object Database)是一个纯Python的面向对象数据库。它允许程序员将Python对象以透明的方式存储在数据库中,无需将对象模型转换为关系模型,极大地简化了Python应用的数据持久化工作。 安装 安装ZODB非常简单,可以通过Python的包管理器pip进行安装: pip …

2024电工杯数学建模B题Python代码+结果表数据教学

2024电工杯B题保姆级分析完整思路代码数据教学 B题题目&#xff1a;大学生平衡膳食食谱的优化设计及评价 以下仅展示部分&#xff0c;完整版看文末的文章 import pandas as pd df1 pd.read_excel(附件1&#xff1a;1名男大学生的一日食谱.xlsx) df1# 获取所有工作表名称 e…