嵌入式学习笔记(27)uart stdio的移植

什么是stdio?

(1)#include <stdio.h>

(2)stdio:standard input output

(3)stdio是os定义的默认的输入和输出通道。一般在PC机的情况下,标准输入指的是键盘,标准输出指的是屏幕。

(4)printf函数和scanf函数可以和底层输入、输出函数绑定,然后这两个函数就可以和stdio绑定起来。也就是说我们直接调用printf函数输出,内容就会被从标准输出输出出去。

(5)在本节中,标准输出不是屏幕,而是串口;标准输入也不是键盘,而是串口。

printf函数的工作原理

printf函数工作时内部实际调用了2个关键函数:一个是vsprintf函数(主要功能是格式化打印信息,最终得到纯字符串格式的打印信息等待输出),另一个就是真正的输出函数putc(操控标准输出的硬件,将信息发送出去)

移植printf函数的三种思路

(1)我们希望在我们开发板上使用printf函数进行(串口)输出,使用scanf函数进行(串口)输入,就像在PC机上用键盘和屏幕进行输入和输出一样。因此需要移植printf函数/scanf函数。

(2)我们说的移植而不是编写,我们不希望自己完全重新编写,而是尽量借用已有的代码。(移植)

(3)一般printf函数可以有3个途径获取printf的实现源码:最原始的原本的来源就是linux内核中的printk。难度较大且麻烦;稍微简单些的方法是从uboot中移植printf;更简单的方法是直接使用别人移植好的。

printf移植

(1)修改Makefile

(2)Makefile及gcc的库文件介绍

(3)多文件夹裸机工程的结构解析

(4)编译运行及测试

(5)在移植后的uart stdio项目中添加link.lds链接脚本,指定链接地址为0xd0020010

gcc可变参数及va_arg介绍

(1)printf函数中首先使用了C语言的可变参数va_start/va_arg/va_end;

(2)建议先去百度"C语言可变参数",然后按照别人的教程、博客实际写几个简单的变参的使用示例,先明白可变参数怎么工作,然后再来分析这里。

嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击这里************************************************************************************************************************************************************************************************************************************************************扫码进群领资料************************************************************************************************************************************************************************************************************************************************************,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!

vsprintf函数详解:

printf

vsprintf

number

vsprintf函数的作用是按照我们的printf传进去的格式化标本,对变参进行处理,然后将之格式化后缓存在一个事先分配好的缓冲区中。

printf后半段调用putc函数将缓冲区中格式化好的字符串直接输出到标准输出。

USB下载bin最多96KB,SD卡下载bin文件最多16KB怎么办?

通过USB下载最多也只能下载96KB的bin,如果bin大于96KB肯定SRAM放不下会出错。如果SD卡启动,那么mkv210_image.c决定了bin文件最大不能超过16KB。

解决方法:

第一:在USB下载时,可以先下载一个x210_usb.bin,然后再将裸机程序链接到0x23e00000,然后修改dnw下载地址,将裸机代码下载到0x23e00000运行。(不需要重定位)

第二:在SD卡启动时,将整个裸机工程分为2部分;第一部分大小16KB以内,第二部分放剩下的(放在SD卡后面的某个扇区开始的位置,譬如放在第50个扇区开始的位置),然后在裸机代码中进行重定位(SD卡中重定位)。

相关推荐
早睡冠军候选人13 分钟前
Ansible学习----管理复杂的 Play 和 Playbook 内容
运维·学习·云原生·ansible
LBuffer1 小时前
破解入门学习笔记题四十六
数据库·笔记·学习
Yurko133 小时前
【计网】基于三层交换机的多 VLAN 局域网组建
网络·学习·计算机网络·智能路由器
月下倩影时3 小时前
视觉进阶篇——机器学习训练过程(手写数字识别,量大管饱需要耐心)
人工智能·学习·机器学习
点灯小铭5 小时前
基于单片机的窗帘、灯光、空调智能家居控制系统设计
单片机·嵌入式硬件·毕业设计·智能家居·课程设计·期末大作业
MasterLi80236 小时前
我的读书清单
android·linux·学习
hssfscv6 小时前
JAVA学习笔记——集合的概念和习题
笔记·学习
ha20428941946 小时前
Linux操作系统学习之---初识网络
linux·网络·学习
飞凌嵌入式6 小时前
【玩转多核异构】T153核心板RISC-V核的实时性应用解析
linux·嵌入式硬件·嵌入式·risc-v
怎么就重名了7 小时前
STM32+蓝牙模块+超声波模块+QT
stm32·嵌入式硬件·qt