首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TI-SYSBIOS中的队列

TI-SYSBIOS中的队列
EN

Stack Overflow用户
提问于 2016-02-19 22:48:14
回答 1查看 1.4K关注 0票数 1

我正在尝试在我的项目中使用队列。下面是一个来自TI的简单示例。

代码语言:javascript
复制
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上的空间。

有人能帮我解决这个问题吗?

非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2016-02-19 22:56:22

取而代之的是使用Mailbox,它接受输入数据的副本以传递给接收函数。

根据我的经验,多线程程序中出现的大多数问题都来自于线程之间的内存共享。不要传递指针,将实际数据传递给目的地。如果你传递指针,那么你必须保护内容,直到目的地完成它,这意味着加载更多的信号量等。

(阅读有关已通信的顺序进程的内容可能会有所启发。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35508044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档