专栏名称: 嵌入式微处理器
关注这个时代最火的嵌入式微处理器,你想知道的都在这里。
目录
相关文章推荐
51HR派  ·  给外卖员交社保,困境不止一个 ·  14 小时前  
麒麟出海  ·  万亿市场开放!Wayfair首届亚太峰会来袭 ... ·  14 小时前  
雨果网  ·  亚马逊重大调整!FBA分仓政策新规 ·  2 天前  
传媒招聘那些事儿  ·  网易:高级产品运营(音乐人) ·  3 天前  
51好读  ›  专栏  ›  嵌入式微处理器

不要在中断使用互斥锁!

嵌入式微处理器  · 公众号  ·  · 2024-05-21 13:00

正文

“不要在中断使用互斥锁”,这句话的下半句还有—— 不要在进程上下文使用自旋锁。
我最近测试遇到的问题,本来是想买中需要使用定时器,在Linux内核中使用定时器,那就离不开定时器 中断,注意后面多了一个中断,那 要是在定时器中断中使用互斥锁,就面临了我标题中提到的问题。
异常的时候打印下面这样的日志:
引起这样问题的原因:
这个崩溃可能是由于在中断上下文中使用了互斥锁导致的。在中断上下文中, 不能使用会导致睡眠的同步原语,如互斥锁。
在上面遇到的问题中,我们需要使用适用于中断上下文的同步原语—— 如自旋锁。
那你以为自选锁就可以任意使用了吗?
我们来看看下面这个例子,我在工作队列里面加了一个自选锁。
结果打印的内核日志如下:
这个日志表明在原子上下文中进行了调度,这是不允许的。 自旋锁会禁止内核抢占,导致调度器无法调度其他任务 ,从而导致系统响应变慢甚至出现死锁。
在工作队列中,建议使用互斥锁(mutex)或者其他适用于进程上下文的同步机制,例如信号量(semaphore)或者完成变量(completion variable)。这些同步机制允许任务在等待锁时被调度出去,不会导致类似问题。
以前更多的是看一些原理性文章,这次试验对自己理解操作系统还是很深刻的,在工作队列中使用自选锁并不会让系统崩溃,但会不断的打印那句异常日志,而这个异常的日志就明确告诉你了问题。

END

作者:写代码的篮球球痴

来源:嵌入式Linux


版权归原作者所有,如有侵权,请联系删除


推荐阅读

Keil被限制出售中国?







请到「今天看啥」查看全文