您可以将自定义 CAN 中断处理程序附加到 SocketCAN 吗?

Can you attach a custom CAN interrupt handler to SocketCAN?

我有一个应用程序 运行 裸机,它通过 CAN 控制外围设备。在其原始形式中,我的应用程序将消息传递给 CAN“驱动程序”,它实际上是一个缓冲层。传入消息从硬件缓冲区中拉出,并且:

  1. 使用另一个 CAN HAL 由中断处理程序推入队列。
  2. 发送到在 ISR 上下文中运行的紧急辅助处理程序。

现在,我需要用基于 SocketCAN 的外设驱动程序替换缓冲层和 HAL。

+---------------------+                                 |   +---------------------+  
|                     |                                 |   |                     |  
|  Peripheral driver  |              Emergency          |   |  Peripheral driver  |  
|                     |                  ^              |   |                     |  
+----------------^----+                  |              |   +----------------^----+  
      |Queue     |                       |              |         |Queue     |       
      |          |Dequeue                |              |         |          |Dequeue
+-----v---------------+       +---------------------+   |   +-----v---------------+  
|                     |       |                     |   |   |                     |  
| CAN driver (queues) <--------         ISR         |   |   |      SocketCAN      |  
|                     |       |                     |   |   |                     |  
+---------------------+       +----------^----------+   |   +---------------------+  
      | Tx                               |              |                            
      |                                  |              |                            
+-----v---------------+                  |              |                            
|                     |                  |              |                            
|       CAN HAL       |       Rx         |              |                            
|                     |-------------------              |                            
+---------------------+                                 |                            

在原来的设置中,在ISR中处理CAN接收意味着尽快处理紧急消息。我对 SocketCAN 的理解是它(或我不熟悉的套接字世界)处理传入帧的排队,这意味着紧急消息将不得不等到外设驱动程序从队列中取出所有到达的东西在紧急情况之前。

肯定有一种方法可以先处理某些消息。我该怎么做?

我对socketcan不是很熟悉,但你问的通常是通过硬件过滤来完成的。但是,socket-can doesn't support hardware CAN filters 并且在阅读了一些文档之后,我认为您无法获得特定 CAN 消息的过滤器标识符。

但理论上您可以在同一台设备上使用一组单独的过滤器打开第二个 socket-can 并以不同方式处理它们。

我想我一直在寻找的答案是,您必须为套接字设置一个信号和信号处理程序,或者 SIGIO 的处理程序。

拓扑将再次看起来像原始的(图的 left-hand 侧)。