当前位置: 首页 > news >正文

学习中的杂项知识

重定向

问:为什么是改写_writefputc就可以实现重定向printf

答:在C语言标准库的实现中,printf函数的输出行为最终依赖于更底层的I/O函数,这就是为什么通过重写_writefputc能实现printf重定向。

printf:提供格式化功能(如%d%f),但不直接处理硬件输出

vfprintf:解析格式字符串后,调用底层输出函数

_write/fputc:真正执行硬件操作的底层函数

底层函数的实现机制

(1)_write函数(POSIX标准)
  • 作用:所有标准输出(如printfputs)最终都会调用_write

  • 典型重定向实现

    int _write(int fd, char *ptr, int len) {HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, HAL_MAX_DELAY);return len; // 返回实际发送的字节数
    }
  • 参数说明

    • fd:文件描述符(1=标准输出,2=标准错误)

    • ptr:数据指针

    • len:数据长度

(2)fputc函数(C标准库)
  • 作用:字符级输出函数,printf的格式化结果会逐个字符调用它

  • 典型重定向实现

    int fputc(int ch, FILE *f) {HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);return ch;
    }

回调函数

问:是什么?

答:回调函数就是函数指针传递的函数。一个指针变量指向了函数,所以传递这个变量的时候,其实是在传递函数。

假设有两个函数

void A(){…………};

void B(void *func()){…………};

void *p() = A;

则B(p);函数A就是回调函数。

Keil5使用的重定向,其他的没用

int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 10);return ch;
}

http://www.dtcms.com/a/324423.html

相关文章:

  • 在Word和WPS文字一页中实现一栏与多栏混排
  • 打靶日常-upload-labs(21关)
  • MyBatisPlus插件原理
  • Java 虚拟机运行时数据区组成详解
  • 【Vue2与Vue3的核心区别】响应式、运行时、编译器
  • 医学统计(随机对照研究分类变量结局数据的统计策略2)
  • 五种 IO 模型与阻塞 IO
  • Redis一站式指南二:主从模式高效解决分布式系统“单点问题”
  • 对话式BI有什么用?不懂技术也能用对话式BI搞定业务报表
  • 面对信号在时频平面打结,VNCMD分割算法深度解密
  • AMS1117-3.3 低压差线性稳压器 (LDO) 3.3V芯片 引脚图中文资料
  • 【Python 工具人快餐 · 第 4 份】
  • 【LLM】什么是Function Calling以及实现原理
  • Day41--动态规划--121. 买卖股票的最佳时机,122. 买卖股票的最佳时机 II,123. 买卖股票的最佳时机 III
  • 工业相机选择规则
  • 如何将PDF文档进行高效编辑处理!
  • Rust 实战四 | Traui2+Vue3+Rspack 开发桌面应用:通配符掩码计算器
  • Virtio 驱动初始化数据收发流程详解
  • 如何解决线上gc频繁的问题?
  • 《C语言》结构体和联合体练习题--2
  • Excel合并同步工具V1.0
  • 比特币现货和比特币合约的区别与联系
  • 数据结构——哈希表、树、gdb调试、时间复杂度
  • 【走进Docker的世界】Docker环境搭建
  • 自动驾驶控制算法——Stanley 控制器
  • 构建健壮的商品数据采集服务:处理京东 API 限流与错误
  • python洛谷做题27:P5724 【深基4.习5】求极差 / 最大跨度值 / 最大值和最小值的差
  • mcp-go v0.37.0 版本发布:重大变更与新特性解析
  • 利用容器编排完成haproxy和nginx负载均衡架构实施
  • GitLab 零基础入门指南:从安装到项目管理全流程