先进们好,现在状况是这样的。目前 MCU 端要传 data 给我 AP 开发板端,透过一根
gpio,注册为irq,我这边写了个 driver,当中用到的 API 为 request_threaded_irq。
这个 api 的第二个参数 handler(上半部)为 null,第三个参数为一个 function thread
这个 thread(下半部),会透过 spi_sync 来跟 MCU 要资料,至于什么时候 MCU
会透过 irq 来通知我的 driver? 也就是每 1ms(每秒1000笔) 来通知我,我
每次透过 spi_sync要到的 64 byte 资料,都还会做个 check crc 的错误判断,只要
有错,这64 byte 就作废。录了 7200 秒,crc error 98 笔,大概1%,想要降至0.x%
看了波型,发现错误的时机点几乎都是,MCU发了irq,而我的 driver 却没有马上
进入 thread 发 spi command 来要资料,都是延迟了才要,也就是延迟进入 thread。
我估狗了中断机制,和API查询,发现用 request_threaded_irq 创造的 thread,
会类似于 workqueue 这下半部机制,而且属于 process 上下文。既然属于process
它就会被 kernel 来排班,什么时候执行,是看 kernel 而定。
request_thread_irq 里面有个 irqflags 参数,我给他设定为 IRQF_ONE_SHOT,这个
参数代表表的是 当我这个 thread 执行完毕,才会再把 irq 打开,所以我猜想,
也许就是 kernel 还在处理 thread 的 task,irq 还没被打开,所以 MCU 就算发 irq
我可能会导致延迟去处理,或者甚至不理IRQ(有看过波型也有发生过)。请问有什么可
行的方向来解决我想要即刻去处理中断的问题?
1 我有想过把 thread 要做的内容写在第二个参数的上半部 funcion,既然是上半部
的中断的函式,driver 一定能立即去做处理。可是这又有一个问题,我在网络上
搜寻到,在中断的 context 下,规定他不能睡眠,也不能阻塞,我 spi_sync 似乎
是个阻塞的 function,我除了作 spi_sync 也有做 input_sync 的 function,这看
起来也是个阻塞同步 function。中断函式一定不能加上阻塞的吗? 即使它运作时间
非常短?
2 softirq (下半部机制方法)???
希望能有些资讯能从前辈们获得,万分感激。