我目前有一个负责红外 TX 载波生成的微控制器,但我开始想知道我是否可以处理它,并在 linux 端完成这项工作——从而降低我的嵌入式系统的成本。
我在飞思卡尔 i.mx233 (454MHz ARM9) 上运行,如果我直接通过 访问注册表/dev/mem
,我可以实现相当稳定的 5MHz 触发到 GPIO 引脚。
因为我需要 37kHz,所以我开始寻找减慢它的方法,但似乎至少nanowait()
对于这个目的来说太粗糙了。我找到了一种在 for 循环中调用 rand() 的解决方案,我似乎能够很好地生成 38.4kHz 信号,但是根据示波器有时会出现一些不可接受的抖动。(我知道这样比较浪费资源,但是需要TX的时候,系统真的没有其他任务了)
我的问题:飞思卡尔内核代码(3.8 分支)没有 CONFIG_PREEMPT_RT 补丁,所以这是我应该研究的一件事,但在此之前:
我可以通过编写内核模块从内核内部驱动 GPIO 来获得更准确的性能吗?我确实需要从用户空间读取一些数据(要发送的数据),但除此之外,我只需要在 GPIO 末尾以指定频率触发 LED,因此驱动程序应该非常简单。
我可以强制我的驱动程序的优先级,以便其他任务不会中断这个 gpio 触发吗?(数据发送目前大约需要 400ms,而且很少完成)
有没有更好的方法可以每隔 37kHz 创建一个中断,这样我就不会因为 SW 停止系统?
微控制器非常适合此类任务,但如果可能的话,最好避免这种成本开销......