Closed ImFovery closed 3 years ago
@KyleChenjh
rk_kprintf 是putc,没有rt_completion_wait。rt_completion_wait只在中断和DMA情况下才有可能使用。所以你说的问题建议再排查下。 @ImFovery
另外rt_kprintf 包括MSH的输出等,只能是putc,也就是轮询,也就是一直要占用CPU。
@KyleChenjh 谢谢指导,我是在rtthread主版本程序中移植了lab_serial的新的串口框架。 不过我看了lab_serial的全部代码,kservice.c中rt_kprintf()函数调用rt_device_write(_console_device, 0, rt_log_buf, length);没有看到调用到putc()呀。
@ImFovery 具体的函数调用栈有些深,你可以简单点,在drv_usart_v2.c
的 stm32_putc()
API上打个断点,然后由最终结果再反推函数调用栈。
另外是比较不好意思的一点,串口V2的文档资料现在还比较少,除了文档中心的使用指南,其他零碎的资料不够细致,后边我会在RTT论坛上整理V2版本的相关的文档资料,以免用户踏坑。
同时,我也整理了串口V1的问题分析指南,有兴趣的话可以去浏览 RTT串口V1版本的使用分析及问题排查指南。
@KyleChenjh 好的谢谢!!
参考了串口V2版本的使用手册,串口控制台默认模式为发送轮询模式、接收中断模式,需要在menuconfig中设置 UART1 TX buffer size 为 0。 https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart
当前lab_serial中串口输出不一直占用MCU,其通过rt_completion_wait()等待实现,但是调用rt_kprintf输出串口日志时会存在以下问题: 1、如果不是在任务中调用rk_kprintf(),则程序会卡死在rt_completion_wait() -> rt_thread_suspend() -> RT_ASSERT(thread != RT_NULL); 示例:程序刚开始运行rtthread_startup() -> rt_show_version() -> rt_kprintf() 2、如果在任务中,位于临界区调用rt_kprintf(),即任务中先调用了rt_enter_critical(),然后再调用rt_kprintf(),则后续使用rt_kprintf()会出现异常。 示例:运行msh命令netstat,打印的数据不完整,并且后续日志打印都异常了。