学习中的杂项知识
重定向
问:为什么是改写_write或fputc就可以实现重定向printf?
答:在C语言标准库的实现中,printf
函数的输出行为最终依赖于更底层的I/O函数,这就是为什么通过重写_write
或fputc
能实现printf
重定向。
printf
:提供格式化功能(如%d
、%f
),但不直接处理硬件输出
vfprintf
:解析格式字符串后,调用底层输出函数
_write
/fputc
:真正执行硬件操作的底层函数
底层函数的实现机制
(1)_write
函数(POSIX标准)
作用:所有标准输出(如
printf
、puts
)最终都会调用_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;
}