gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:33:14 25 4
gpt4 key购买 nike

我正在为某个基于 ARM 的 Linux 板(实际上是自定义 UART 驱动程序)实现自定义串行总线驱动程序。该驱动程序应能够通过自定义协议(protocol)与总线另​​一端的某个 MCU 进行通信。驱动程序不会(实际上绝不能)将其任何功能暴露给用户空间,也根本不可能在用户空间中实现它(因此,需要自定义驱动程序而不是使用库存 TTY 子系统)。

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

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

问题是:我的基于信号量的方法是否可行,还是太天真了?有哪些可能的选择?有没有我可能遗漏的陷阱?

最佳答案

传统上,Linux 中的 IRQ 处理分为两部分:

  1. 所谓的“上半部分”实际上是在 IRQ 上下文(IRQ 处理程序本身)中工作。这部分必须尽快退出。所以它基本上检查中断源然后开始下半部分。

  2. “下半部分”。它可以实现为工作队列。这是完成实际工作的地方。它在正常上下文中运行,因此可以使用阻塞函数等。

如果您只想在工作线程中等待 IRQ,最好使用名为 completion 的特殊对象。它正是为此任务而创建的。

关于c - 在 Linux 内核中实现正确的模块间同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9975043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com