邮箱与信号量相关问题

本文列举了嵌入式操作系统中使用邮箱和信号量时遇到的问题,包括增减操作不匹配导致的数据淤积、邮箱溢出、关中断引起的邮件丢失、二值与计数信号量的选择、死锁以及非法上下文阻塞。针对这些问题提出了相应的解决方案,如调整邮箱定义、避免长时间关中断、理解信号量类型以及避免在非阻塞上下文调用阻塞函数。
摘要由CSDN通过智能技术生成

嵌入式操作系统也会提供邮箱和信号量,用作进程同步、临界区保护、简单的消息传递等。在使用过程中如果设计不当会发生许多问题,本文列举了我在调试过程中遇到的一些相关案例。

1.增减操作不匹配

C6455的SRIO接收到数据时在中断里抛出一个邮件,然后在读函数中等待邮件,当收到邮件时读取一包数据。运行一段时间后发现当系统负载变大时,会有一定概率出现淤包,即接收方很长时间后才能收到数据,有时候停止收发后发现接收方接收包计数小于发送方发送包计数,即有若干包数据未收到。

首先想知道线路上是否有丢包现象。将发送数据包头加入序号,在接收中断中判断数据包头是否连续。结果未发现中间有丢包,并且发送方最后一包在接收中断中也能找到。因此丢包发生在从中断向上层提交的过程中。
继续在读函数中加入对包序号的判断,发现也是连续的,但最后缺少了几包。这进一步证实了上面的猜测。
然后怀疑最后几包是否被覆盖或丢失,通过仿真器跟踪内存中的包,最后发现数据还在内存中,只是未被读走。
再分析接收逻辑,最后发现是pend与post的个数不匹配导致的。

实际上SRIO线上数据会有突发,此时接收模块会收到连续多包数据,为了避免频繁中断CPU导致的性能下降,该模块被设计为间隔一定时间才中断CPU一次。但驱动中对多个数据包只抛送了一个邮件,而接收函数此时会认为只有一个数据包,而下一包数据只有在下一次中断到来时才会处理,累积下来最后就会有最后的若干包数据得不到处理。

这实际上属于对邮件的含义定位不清。中断认为一个邮件代表有数据到来,而接收函数认为一个邮件代表一个数据包到来。修改方法就是对邮件定义明确,要么在中断中抛出多个邮件,要么在接收函数中一次读多个包。最后的修改方案选择了前者,再测试该问题不再出现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值