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

被折叠的 条评论
为什么被折叠?



