Re: [问题] 关于 kernel driver interrupt ISR

楼主: waterdisney (想要征服的世界)   2017-03-17 22:19:59
分两部份讨论这个问题
1. MCU是否可更改行为, 在buffer水位半满的时候就发interrupt
通知AP 来取资料?
2. MCU不改行为的状况下, 有什么办法可提高spi_sync的优先级?
确保spi_sync尽早完成
现在你的问题应该是卡在2, 有哪些办法可以用?
先分析你目前handle interrupt 的方式
因为spi_sync会sleep,所以在top half中不可直接调用 spi_sync
需要把spi_sync放到 bottom half去做.
因此你透过request_thread_irq时注册了一条kernel thread,
当 top half工作处理完时
会将此条需要 wake up的kernel thread叫起来 ( spi_sync的code在此thread内)
但因为此kernel thread也会被系统 scheduling.
导致spi_sync因为scheduling的关系 无法立即去跟MCU要资料
导致错过timing, spi_sync时取得的资料无用
在这种情况下 如果不修改 (1) MCU的行为及设计
你没有办法从根本解决这个问题
你只能尽量调高kernel thread的priority, 但是仍然无法将错误率降到 0
bottom half的几种能用的手段大概就是
request_thread_irq 不可调priority ,会sleep的环境可用
softirq 不可调priority ,会sleep的环境不能用
tasklet 可调priority, ,会sleep的环境不能用
workqueue 可调priority, ,会sleep的环境可用
也就是说,目前你可以尝试用workqueue,
试试看调整丢进workqueue thread的priority 后(WQ_HIGHPRI)
看掉资料的情况有没有比较好.
如果可以从根本改善设计的话
1. MCU的buffer水位半满就要发interrupt通知AP取资料.
2. 可以在spi_sync()完成后 回个 io_complete 给MCU,
这才是比较完整的作法
作者: NAMESTANLY (Stanley~ New life)   2017-03-25 15:31:00
1.第一个问题 是可以的唷

Links booklink

Contact Us: admin [ a t ] ucptt.com