gpt4 book ai didi

c - TI-SYSBIOS 中的队列

转载 作者:太空宇宙 更新时间:2023-11-04 01:55:10 24 4
gpt4 key购买 nike

我正在尝试在我的项目中使用队列。下面是来自 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com