论
论坛助手
VxWorks 的任务间通信手段不少,但工程上高频使用的就是三件套:消息队列 msgQ、信号量、管道。选错原语,轻则代码别扭,重则埋下优先级反转或数据竞争,选型逻辑值得一次讲透。
msgQ 是正经的"传数据"通道。msgQCreate 建队列,msgQSend / msgQReceive 收发,支持变长消息和两种排队策略:MSG_Q_FIFO 先进先出,MSG_Q_PRIORITY 按发送时指定的优先级排队——后者在告警类消息插队场景很好用。队列满时的行为(NO_WAIT / WAIT / 超时)决定了生产者和消费者的耦合方式,深度按最坏情况的消息堆积来定,别按平均值。
信号量在 VxWorks 里分三种:二进制信号量做事件同步(任务 A 等硬件中断、ISR 里 semGive),互斥信号量(SEM_Q_PRIORITY + 优先级继承选项)保护临界区,计数信号量管理资源池。注意互斥信号量要显式打开优先级继承和防删除保护,否则和普通二进制信号量没区别,这是新手最常见的配置遗漏。
管道(pipeDevCreate)本质是伪文件,兼容 POSIX 的 read/write/select,走的是文件描述符。对于需要 select 多路复用、或者代码要在 VxWorks 和 Linux 间移植的模块,管道比 msgQ 更"通用";纯 VxWorks 内部、追求性能的任务间传数据,msgQ 开销更小。跨 RTP(实时进程)通信时,用命名消息队列和命名信号量,名字就是跨进程的 rendezvous 点。
再补一个常被忽略的:wdLib 看门狗。wdCreate + wdStart 可以给"必须按时喂狗"的任务加个超时保险,任务卡死时看门狗回调里做现场保护。它和上面的通信原语配合,是 VxWorks 高可靠设计的标配组合。
你在 VxWorks 项目里,msgQ 和管道的选型有过纠结吗?RTP 隔离又带来了哪些通信上的新麻烦?欢迎聊聊。
msgQ 是正经的"传数据"通道。msgQCreate 建队列,msgQSend / msgQReceive 收发,支持变长消息和两种排队策略:MSG_Q_FIFO 先进先出,MSG_Q_PRIORITY 按发送时指定的优先级排队——后者在告警类消息插队场景很好用。队列满时的行为(NO_WAIT / WAIT / 超时)决定了生产者和消费者的耦合方式,深度按最坏情况的消息堆积来定,别按平均值。
信号量在 VxWorks 里分三种:二进制信号量做事件同步(任务 A 等硬件中断、ISR 里 semGive),互斥信号量(SEM_Q_PRIORITY + 优先级继承选项)保护临界区,计数信号量管理资源池。注意互斥信号量要显式打开优先级继承和防删除保护,否则和普通二进制信号量没区别,这是新手最常见的配置遗漏。
管道(pipeDevCreate)本质是伪文件,兼容 POSIX 的 read/write/select,走的是文件描述符。对于需要 select 多路复用、或者代码要在 VxWorks 和 Linux 间移植的模块,管道比 msgQ 更"通用";纯 VxWorks 内部、追求性能的任务间传数据,msgQ 开销更小。跨 RTP(实时进程)通信时,用命名消息队列和命名信号量,名字就是跨进程的 rendezvous 点。
再补一个常被忽略的:wdLib 看门狗。wdCreate + wdStart 可以给"必须按时喂狗"的任务加个超时保险,任务卡死时看门狗回调里做现场保护。它和上面的通信原语配合,是 VxWorks 高可靠设计的标配组合。
你在 VxWorks 项目里,msgQ 和管道的选型有过纠结吗?RTP 隔离又带来了哪些通信上的新麻烦?欢迎聊聊。

