FreeRTOS中使用printf重定向后程序卡住问题——解决方法之一
使用这个函数的重定向,HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, 0xFFFF);
·
/**
* @brief 重定吿 fputc 函数,使 printf 可以通过串口输出
* @param ch: 要发送的字符
* @param f: 文件指针 (此处未使甿)
* @retval 返回发鿁的字符
*/
int fputc(int ch, FILE *f)
{
// 调用 HAL 库发送单个字笿
// 参数说明:
// &huart1 : 串口句柄指针
// (uint8_t*)&ch : 数据地址
// 1 : 数据长度
// 0xFFFF : 超时时间 (可根据需要调整,0xFFFF 表示长时间等徿)
HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, 0xFFFF);
return ch;
}
使用这个函数的重定向,HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, 0xFFFF);
导致程序中只要存在printf这个函数,程序就会卡住
解决方法:
勾选上 Use Micro LIB
3. 为什么勾选 "Use MicroLIB" 就好了?
MicroLIB 是 ARM 专门为嵌入式资源受限环境优化的微型库。
- 特点:它去除了所有复杂的隐式初始化逻辑。
- 行为:它不会在启动时自动检查 I/O,也不会尝试加锁。它假设你自己会处理好一切(比如你自己重定义了
fputc)。 - 结果:因为它“什么都不做”,所以不会和 FreeRTOS 冲突,程序就能顺利跑过初始化阶段,直到你真的调用
printf时,才会执行你重定义的fputc。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)