学习中的杂项知识

重定向

问:为什么是改写_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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值