在Linux内核中实现正确的模块间同步

在Linux内核中实现正确的模块间同步,第1张

概述我正在为某个基于ARM的 Linux板(实际上是一个自定义UART驱动程序)实现自定义串行总线驱动程序.该驱动程序应通过自定义协议启用与总线另一端的某个MCU的通信.驱动程序不会(实际上不能)将其任何功能暴露给用户空间,也不可能在用户空间中实现它(因此,需要自定义驱动程序而不是使用库存TTY子系统). 驱动程序将实现通信协议和UART读/写,并且必须将一组更高级别的函数导出到其用户以允许它们与MC 我正在为某个基于ARM的 Linux板(实际上是一个自定义UART驱动程序)实现自定义串行总线驱动程序.该驱动程序应通过自定义协议启用与总线另一端的某个MCU的通信.驱动程序不会(实际上不能)将其任何功能暴露给用户空间,也不可能在用户空间中实现它(因此,需要自定义驱动程序而不是使用库存TTY子系统).

驱动程序将实现通信协议和UART读/写,并且必须将一组更高级别的函数导出到其用户以允许它们与MCU通信(例如read_register(),drive_gpios(),所有这些东西) .该模块只有一个用户.

调用模块必须等待 *** 作的完成(前面提到的read_register()和其他).我正在考虑使用信号量:用户模块将调用我的驱动程序的函数,它将启动传输并等待信号量;我的驱动程序的IRQ处理程序将向MCU发送请求并读取答案,并在完成后发布到信号量,从而唤醒调用模块.但我对内核编程并不熟悉,而且我对众多可能的替代实现(tasklets?等待队列?)感到困惑.

问题是:我的基于信号量的方法是好还是太天真了?有哪些替代方案?我可能会遗失任何陷阱吗?

解决方法 传统上linux中的IRQ处理分为两部分:

>所谓的“上半部分”实际上在IRQ上下文中工作(IRQ处理程序本身).这部分必须尽快退出.所以它基本上检查中断源,然后从下半部分开始.
>“下半场”.它可以实现为工作队列.这是实际工作的地方.它在正常的上下文中运行,因此它可以使用阻塞函数等.

如果您只想在工作线程中等待IRQ,最好使用称为完成的特殊对象.它完全是为此任务创建的.

总结

以上是内存溢出为你收集整理的在Linux内核中实现正确的模块间同步全部内容,希望文章能够帮你解决在Linux内核中实现正确的模块间同步所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1047538.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存