c - TI-SYSBIOS 中的队列

标签 c

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

相关文章:

无法读取 bash 行生成的文件

c - 内部内核结构无法分配错误?

c - 可能的输出是什么?

谁能在 DAC 的以下场景中帮助我

c++ - C 和 C++ 编译器是否优化与函数调用的比较?

c - 为什么我的程序只调用一次 while 循环? (爱特梅尔 C)

c - 如何在 Linux 中使用 c-api 查找 VRF 设备的路由表 ID

c - 保留内存等于共享内存,但内存从未被保留

C++ 随机字符串返回意外结果

c - 错误: incompatible type for argument