gpt4 book ai didi

linux - kthread和interupt —处理程序—是否可能

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:14 25 4
gpt4 key购买 nike

Linux驱动程序是否可以具有一个kthread,中断句柄和系统调用。
意味着linux Kernel内核是否允许以上三个全部?

中断处理程序将在中断时保存从通信通道接收的数据。
Kthread将数据从通信通道中传输出去。
系统调用可用于配置驱动程序或获取其状态。

另外,如果中断处理程序和kthread使用的是相同的硬件寄存器,那么我们如何保护这一关键部分?

最佳答案

Interrupt handler will save receive data from communication channel on interrupt.


设备驱动程序的中断服务程序ISR通常会处理接收条件,发送条件以及错误和状态事件的中断。曾经有过具有多条中断线的设备,但是如今几乎每台设备都只有一条中断线,并且必须查询一个中断状态寄存器以确定产生中断的条件。
仅使用ISR进行接收是不寻常的。

Kthread will transmit data out of communication channel.


与设备驱动程序关联的线程更有可能是“下半处理”的小任务。这是一种使ISR中的处理时间最小化,同时又对原始数据进行某些处理的技术,尤其是对接收到的数据包/帧。
使用kthread传输数据似乎是非常规的,并且可能会导致问题(例如可避免的关键区域)。如果线程由于没有DMA且没有可用的Tx中断而正在执行轮询的编程I/O,则可以证明这种方案是合理的。

System call can be used to configure driver or get its status.


Linux设备驱动程序已经具有一组定义的入口点: Linux device driver entry points
用户应用通过系统调用间接访问这些入口点中的大多数。
不太可能专门为驱动程序创建系统调用。

Also if Interrupt handler & kthread are using -- same hardware register -- then how can we protect this critical section ?


内核中的关键部分通常受自旋锁保护。
但是,排除锁将增加等待时间,并可能降低系统响应速度。
好的系统设计可以避免创建(不必要的)关键部分。如果将对设备寄存器的访问分为中断级别和任务级别,那么可能仅需要一个备用的自旋锁即可。
因此,一个kthread,一个中断处理程序和系统调用可以与Linux驱动程序相关联,但不一定与您指定的方式相关联。
附录

But in my case i am looking forward to use mmap system call to send & receive data from driver.


您需要使用 mmap阐明您的意思。
如果您要对目标SPI设备上的文件(例如SD卡或闪存)进行 mmap()编码,则文件系统或MTD层将处理“映射”,而设备驱动程序将仅执行普通读取&写操作。

When i receive data packet in interupt handler can i not directly send it to mapped region ? (your suggestion is-- Tasklet for bottom half can be good for received data)


如果目标SPI设备是接收/发送数据包的通信设备,则您的程序可能无法 mmap()该数据的缓冲区。 mmap()功能是对虚拟内存功能的巧妙重塑。虚拟内存功能取代了往来于后备存储(交换区域)的文本和数据交换,而是将虚拟内存功能用于出现在用户空间内存中的特定文件。尽管所有设备都表示为"file",但在 stat()期间,设备文件可能无法通过 mmap()请求。也许可以做到(对于有限的转账),但是我从未尝试过。
如果您指的是驱动程序的fops mmap()函数,那将超出我的范围。实际上,在Linux源代码树的1200多个驱动程序中,只有大约200个设备驱动程序似乎实现了这种特定的操作。

As per your suggestion I will use DMA to transmitt data out of the SPI port, to achieve this do we have to write some function for this & tell address of function to DMA ?


您是否正在为通过SPI或SPI Controller 连接的设备实现驱动程序?
如果它是使用SPI的目标设备,那么您可能会通过标准SPI接口(interface)使用这些 SPI drivers之一。您可能会使用诸如
spi_message_init()
spi_message_add_tail()
spi_sync()
启动和监视I/O操作。使用该交叉引用网站在其他驱动程序中搜索这些功能名称,以获取用法示例。 DMA的使用取决于SPI驱动程序。
如果要为SPI Controller 实现驱动程序,请以其他SPI驱动程序为例。
您似乎对I/O和驱动程序概念持平观,但是Linux中的功能是在不同的层中实现的。
您似乎还打算避免进行复制操作。在“计算”中有大量的数据缓冲和复制。通常,将数据从一个缓冲区复制到另一个缓冲区是解决棘手问题(例如, protected 内存与不 protected 内存)的最简单解决方案。
附录2
也许您应该查看现有的 high-performance MCP2515 CAN driver and the WCCD framework来替换SocketCAN。作者记录了通过优化ISR并最大程度地减少关键区域及其锁的使用而显着改善的性能。

关于linux - kthread和interupt —处理程序—是否可能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13724691/

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