我正在尝试在我的项目中使用队列。下面是来自 TI 的一个简单示例。
void mailbox_queue(void)
{
MsgObj msg; // create an instance of MsgObj named msg
Msg msgp; // Queues pass POINTERS, so we need a pointer of type Msg
msgp = &msg;// init message pointer to address of msg
msg.val = 1;// set initial value of msg.val (LED state)
while(1){
msg.val ^= 1; // toggle msg.val (LED state)
Semaphore_pend(LEDSem, BIOS_WAIT_FOREVER);// wait on semaphore
Queue_put(queue0, (Queue_Elem*)msgp); // pass pointer to Message
Semaphore_post (qMsgSem); // unblock Queue_get to get msg
}
}
Problem statement:
mailbox_queue 任务在信号量 LEDSem 上挂起。一旦发布了这个信号量, 我将 msg 放在 Queue 上并发布一个信号量以向接收方发送信号。
我遇到的问题是,虽然 msg 对象是本地的,甚至在接收者之前 获取 msg.val 值,msg.val 很有可能被写入一个新值。 此外,Cert-C 强烈建议不要传递局部变量或结构的指针。
我可以解决这个问题的一种方法是将 msg 结构声明为静态的,但这会生成一个副本 占用 RAM 空间。
谁能帮我解决这个问题。
非常感谢。
最佳答案
使用 Mailbox相反,它将输入数据的副本传递给接收函数。
根据我的经验,多线程程序中发生的大多数问题都来自线程之间的内存共享。不要传递指针,将实际数据传递到目的地。如果你传递指针,那么你必须保护内容直到目的地完成它,这意味着加载更多的信号量等。
(阅读有关通信的顺序过程可能很有启发性。)
关于c - TI-SYSBIOS 中的队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35508044/