Polarfire SoC Yocto环境下能否解耦UART上的stdout与业务流量?
解决控制台打印与UART业务消息解耦的方法
针对Microchip Polarfire SoC的Yocto系统,你可以通过以下几种方式实现控制台输出和UART业务通信的解耦:
1. 切换系统控制台到其他UART接口
如果你的Polarfire SoC有多个硬件UART,这是最直接的方案:
- 修改Yocto配置:在
local.conf中设置SERIAL_CONSOLE变量,指定新的UART设备,比如原来用ttyS0,现在改成ttyS1:SERIAL_CONSOLE = "115200 ttyS1" - 调整设备树:如果默认控制台绑定在
ttyS0,需要修改设备树文件,将console属性指向新的UART节点,例如:chosen { stdout-path = "serial1:115200n8"; }; - 更新bootargs:确保内核启动参数中的
console项对应新的UART,比如console=ttyS1,115200n8。
这样系统的std::cout/printf输出会被重定向到新的UART,原来的UART就可以专门用于自定义协议的业务通信。
2. 将控制台输出重定向到非UART设备
如果只有一个UART可用,可以把控制台输出转到其他设备:
- 重定向到虚拟终端:修改bootargs为
console=tty1,这样控制台输出会显示在板载的帧缓冲终端(如果有显示模块),UART完全留给业务使用。 - 重定向到syslog或文件:在系统启动后,通过init脚本或systemd服务将
stdout/stderr重定向到syslog,比如在应用启动脚本中添加:
或者直接把输出写到文件:exec 1> >(logger -t your-app-name) 2>&1exec 1>/var/log/app-output.log 2>&1
3. 应用层直接操作UART设备文件
不依赖系统控制台配置,业务程序直接打开UART设备文件进行读写,避免和stdout/stderr共用:
- 在业务代码中,直接打开目标UART设备(比如
/dev/ttyS0),配置波特率、奇偶校验等参数后进行收发:#include <fcntl.h> #include <termios.h> int uart_fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); struct termios options; tcgetattr(uart_fd, &options); cfsetispeed(&options, B115200); cfsetospeed(&options, B115200); options.c_cflag |= (CLOCAL | CREAD); tcsetattr(uart_fd, TCSANOW, &options); // 之后用read/write进行业务消息收发 - 同时可以通过系统配置将控制台输出转到其他地方,比如修改
/etc/init.d/bootmisc.sh或systemd服务,把stdout/stderr重定向到/dev/null或syslog,避免干扰UART的业务通信。
内容的提问来源于stack exchange,提问作者Roberto Ciardi
相关产品推荐
相关产品推荐

