RTT的IPC机制篇——IPC通信总结

总结1 RTT通信方式总结
2018年12月29日
10:47

IPC:inter process communication

1,RTT的通信机制:
消息队列、邮箱、信号量、互斥量、事件。

2.我又按照其传输的内容分为:数据类和非数据类通信。

数据类,实现线程与线程间、线程与中断间的数据传输:消息队列、邮箱。消息队列传输数据大小用户自己定义,而邮箱只能传输固定大小数据或数据存放地址(4个字节)的邮件。

非数据类,线程间、线程与中断传输非数据类信息,实现线程间同步:信号量、互斥量、事件。而信号量、互斥量是实现一对一的同步。事件可以实现一对多,多对多的同步。而信号量只能实现单一同步,而事件可以实现多个事件同步。

3.另外按照能不能在中断中使用分为:可中断使用,中断中不可使用。
中断中不能用的是:互斥量、阻塞方式的发送邮件、无限等待的发送消息、信号量、事件。
除了互斥量,其他通信在中断中可以使用,但是有限制的:只能发送消息/非阻塞方式的邮件/事件/信号量,而不能接受,为啥不能接受?因为接受不到会阻塞当前线程,在中断中接受你把当前线程给阻塞啥意思?躺枪!

4.它们都是异步通信。不异步不行呀,CPU同一时刻只能运行一个线程。所以你发的时候下个线程不是同时在收的,不能同步的原因在这!

RTT消息队列和邮箱的不同与联系
2018年12月29日
10:47

一、不同
1.当邮箱发送的是个地址时注定这个地址不能是局部变量的地址,所以邮箱发送的邮件不要用局部变量用全局或者静态变量,因为如果用局部变量发送了,那接受时存放的是这个局部变量的指针,发送完了已经把那个局部变量已经给释放掉了,这个时候你再指它,就不对了。
而因为消息队列发送的往往是数据内容而不是指针,这注定消息队列,接受和发送消息可以是局部变量或者全局变量。因为发送消息是将消息的内容是复制到消息队列里面了,接受的时候是从消息队列里面的消息框里再拷出来。
2.大小不一样。邮箱的邮件固定大小就是4字节,刚好可以存放地址。而消息大小是用户自定义的。

总结:(1)不管是邮箱还是消息,当发送的是数据地址的时候,这个数据不能是局部变量,否则这个数据可能已经被释放掉了你再用它指就不对了。
(2)当然如果都是数据内容的话,那当然局部变量和全局变量都可以呀。
(3)邮箱一般传地址的多,所以最好定义全局变量。消息传数据多,不限制局部变量或全局变量,但是也要放心传地址的情况。
总之,它们两个传地址的时候要注意数据不能定义为局部变量。
推而广之:以后传输数据地址的时候,要查看下这个数据是不是局部变量,是的话得当心——如果只是在有效区传那没问题,如果无效区域传那就不对了,比如这个函数里的局部变量的地址在别的函数里就不能用了,因为局部变量只能在其定义的函数中使用。

二、联系
当消息的大小设置为4个字节时,和邮箱几乎没什么分别。
消息可以看成邮箱的进化,消息是邮箱的全集,邮箱是消息的子集。在某一条件下,消息可以转变成邮箱。

三、应用场景剖析
当只需传递的内容4个字节足够的时候,用邮箱就够了。
当传输的内容大过4字节,且非常多的时候、还有紧急内容的时候,用消息。如果没有紧急内容,对于邮箱或是消息可以酌情采用。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值