• 嵌入式学习笔记(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卡中重定位)。

  • 相关阅读:
    P9232 [蓝桥杯 2023 省 A] 更小的数(区间DP)
    如何根据mysql表生成结构体|一个开源小工具的探索之旅
    ③【操作表数据】MySQL添加数据、修改数据、删除数据
    node的http模块
    【左程云算法全讲4】比较器和堆
    高精度时间测量(TDC)电路MS1022
    javascript利用xhr对象实现http流的comet轮循,主要是利用readyState等于3的特点
    Jmeter之接口测试流程详解
    【C++代码】合并区间,最少用箭数,划分字符串,监控二叉树,贪心算法--代码随想录
    java 使用策略模式减少if
  • 原文地址:https://blog.csdn.net/m0_70888041/article/details/132831486