我正在尝试在我的项目中使用队列。下面是一个来自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:信号量LEDSem上的mailbox_queue任务挂起。一旦这个信号量被发送,我将把msg放在队列上,并发布一个信号量来通知接收方。
我遇到的问题是,虽然msg对象是本地的,但即使在接收器获得msg.val值之前,msg.val也很有可能被写入新值。此外,Cert-C强烈建议不要传递局部变量或结构的指针。
我可以解决这个问题的一种方法是将msg struct声明为static,但这将创建一个副本,这将消耗RAM上的空间。
有人能帮我解决这个问题吗?
非常感谢。
发布于 2016-02-19 22:56:22
取而代之的是使用Mailbox,它接受输入数据的副本以传递给接收函数。
根据我的经验,多线程程序中出现的大多数问题都来自于线程之间的内存共享。不要传递指针,将实际数据传递给目的地。如果你传递指针,那么你必须保护内容,直到目的地完成它,这意味着加载更多的信号量等。
(阅读有关已通信的顺序进程的内容可能会有所启发。)
https://stackoverflow.com/questions/35508044
复制相似问题