Embedded RTOS-队列中不同数据的挂起
我正在从TI编写一个板,我希望能够以某种方式将两个不同的ISR的post发送到任务的消息队列。那部分很好用。但是,在接收端,任务是否有任何智能方法挂起其队列,并根据发布的ISR对数据执行不同的操作Embedded RTOS-队列中不同数据的挂起,embedded,message-queue,rtos,isr,Embedded,Message Queue,Rtos,Isr,我正在从TI编写一个板,我希望能够以某种方式将两个不同的ISR的post发送到任务的消息队列。那部分很好用。但是,在接收端,任务是否有任何智能方法挂起其队列,并根据发布的ISR对数据执行不同的操作 基本上,我有一个LCD更新任务,显示来自我的马达的信息。但是,如果我有一个电机传感器ISR和一个按钮按下ISR,它们发送不同的信息进行更新,这可以在一个队列上完成吗?当然。当每个ISR向队列发送消息时,在消息中放入标识发送消息的ISR的内容。然后,当接收方读取队列时,它可以根据标识符决定要采取的操作
基本上,我有一个LCD更新任务,显示来自我的马达的信息。但是,如果我有一个电机传感器ISR和一个按钮按下ISR,它们发送不同的信息进行更新,这可以在一个队列上完成吗?当然。当每个ISR向队列发送消息时,在消息中放入标识发送消息的ISR的内容。然后,当接收方读取队列时,它可以根据标识符决定要采取的操作
ISR1() {
char msg[4];
msg[0] = '1'; // Identify the queue
get_3_ISR1_data_bytes(msg+1); // Get the data
q_send(msg);
}
ISR2() {
char msg[4];
msg[0] = '2'; // Identify the queue
get_3_ISR2_data_bytes(msg+1); // Get the data
q_send(msg);
}
handler() {
char *msg;
q_rcv(msg);
switch (msg[0]) {
case '1':
// Do ISR1 stuff
break;
case '2':
// Do ISR2 stuff
break;
default:
// Something unpleasant has happened
}
}
如果整个
char
太贵,您可以只设置一位(设置为0
或1
)来识别ISR。多么明显!我应该意识到这一点。我知道这是怎么回事;然而,我尽量远离状态机。我想在这种情况下,它工作得很好。非常感谢。只有在你做了几次之后,这才是显而易见的。:-)不过,它不是一台状态机;您只是使用其中一个字节作为标志。有关状态机的示例,请参见。