ATmega32 发表于 2008-3-14 14:12:07

操作系统得消息和消息队列得作用是什么?

操作系统得消息和消息队列得作用是什么?

binglin 发表于 2008-3-14 14:30:21

最大的用途:可用于进程、线程间的同步、通信及数据交换。

Gorgon_Meducer 发表于 2008-3-14 14:39:06

为了避免进程与进程之间,或者线程与线程之间以全局变量的形式进行通讯(大的操作系统因为虚拟存储技术的应用,不允许不同进程之间以全局变量进行通讯),所以增加了一个消息队列,所有的进程和线程间通讯,原则上应该以消息的形式进行。

ATmega32 发表于 2008-3-14 14:50:27

关于消息队列几个问题:
1.任务之间传递数据用BUF不就行了,用消息比BUF好在哪里?
这里假设BUF已经包含临界断,可被多个任务操作。

2.消息队列采用什么数据结构好?数组还是链表?
如果用数组,感觉浪费空间,浪费代码,和用BUF没啥两样。
如果用链表,链表是用静态还是动态呢?
如果用静态,消息和消息队列全部要定义成全局或静态变量,定义全局变量太多,程序中使用起来也不方便。
相比直接把要传递的数据定义成全局变量,再加上临界断或者信号量,并没有实质性的改进。
如果用动态,要分配堆空间,并且效率也相对低点。

Gorgon_Meducer 发表于 2008-3-14 14:53:56

楼上需要补充虚拟存储的概念,然后你会发现你说的这些问题都不是问题……
进程之间,虚拟存储空间是相互独立的不同宇宙……是不同次元的……消息队列就是传说中的虫洞……虫洞是由上帝(操作系统)来提供的……我们无法超越所在的次元,要给其他次元通信,只有依靠上帝来代话。消息队列采用什么数据结构对进程来说是透明的。一般来说,操作系统会使用数组+动态内存块的联合结构作为消息队列,其中数组仅仅保存一个大小固定的索引头,而索引头则指向一个动态分配的存储空间,这个空间中保存着所需的数据。当消息传递给对应的次元以后,一般情况下辉进行所谓的次元变换——也就是把动态分配的存储空间重新在新次元中申请一下,然后复制过去(有时候并不进行这样的复制,而只是把动态分配的那块内存直接划给这个次元的动态页表中),这就完成了消息的传递。

ATmega32 发表于 2008-3-14 15:17:27

当然,如果消息队列用动态分配,就方便多了。

但是在小RAM的单片机上,一般是不能用动态分配的。
或者用数组作为消息队列的存储空间。
或者把消息定义成静态变量。

我个人认为,如果用数组作为消息队列的存储空间,不会比用BUF好。
如果将消息都定义成全局变量,使用起来又比较麻烦。



我想给Protothreads加上消息队列,采用把消息队列定义成静态变量的办法,以下是使用消息队列一个简单例子,感觉太麻烦了。


THR_Create(Thread1);
THR_Create(Thread2);
TMR_Create(timer1);

TQueue queue;

uint8 Thread1(Tpt *pt)
{
static TMessage message;
static uint8 count=0;
PT_BEGIN(pt);
    while(1)
    {
      GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_4,~GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_4));
      PT_TIMER_DELAY(&timer1,OS_TICKS_PER_SEC/10);
      
      if(++count>=10)
      {
      count=0;
      message.data='X';      
      MSG_Post(&queue,&message);//每1S向线程2发送一个消息
       }
    }
   PT_END(pt);
}

uint8 Thread2(Tpt *pt)
{
static TMessage *message;
static uint8 data;
   PT_BEGIN(pt);
    while(1)
    {
      MSG_Pend(&queue,&message);   //等待消息
      data=message->data;            //读取消息中的数据
      GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_5,~GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_5));
    }
   PT_END(pt);
}

Gorgon_Meducer 发表于 2008-3-14 15:23:15

恕我直言……8位系统中,如果存储器小于1K,就没有必要使用消息系统……直接用全局变量更干脆……

ATmega32 发表于 2008-3-14 15:31:46

看样子消息队列还是动态分配的好。

lonely88 发表于 2008-8-25 12:50:22

消息队列的讨论,一定要顶起来

hong_hong789 发表于 2012-1-6 18:21:29

看高手过招!偷偷学习!

dongfo 发表于 2013-10-31 17:48:59

正在困惑与消息队列与全局变量的选择

ldj7501 发表于 2022-1-29 10:25:12

顶起来!

SCREA 发表于 2022-8-3 10:56:28

消息队列可以Pend起来。 当任务每次路过去查询该消息,有则处理,没有继续Pend。
常用于异步, 如外设的串口、USB、Ethernet
页: [1]
查看完整版本: 操作系统得消息和消息队列得作用是什么?