如何通过Linux内核生成方波

时间:2012-02-01 07:32:50

标签: linux linux-kernel linux-device-driver embedded-linux

我需要使用MIPS平台(这不是i386)开发一个生成方波的Linux驱动程序,周期约为1ms。

我尝试了一些方法,但这些方法都没有成功:

  • 使用计时器/ hrtimer - >但周期是12ms而且不稳定
  • 无法使用实时附加软件包作为RTLinux / RTAI,因为这些软件包不支持MIPS
  • 使用带有永久循环的内核线程和udelay函数 - >它需要太多的CPU资源 - >性能是不可接受的
你帮我吗? 或者你挫败我......?(请帮助!)

谢谢。

3 个答案:

答案 0 :(得分:2)

Unix方式根本不会这样做。也许在单一任务机器的旧时代,你会这样做,但是现在 - 如果你没有硬件电路给出适当的频率,你可能永远不会成功,因为硬件定时器没有必要的分辨率,并且可能总是会发生更重要的任务会占用您的CPU时间。

答案 1 :(得分:1)

正如FrankH所说,最好的解决方案是依靠硬件。您应该检查处理器的参考手册,看看它是否有计时器。

我要补充一点:如果它碰巧有一个输出比较或PWM子系统(我不熟悉MIPS,但它在嵌入式设备中并不常见)你可以只写一些寄存器来设置它up,然后你不需要更多的处理器时间。

答案 2 :(得分:0)

这可能是可能的,但要从Linux中获取,硬件必须具有某些特性:

  1. 你需要一个可编程的定时器设备,它可以以足够高的优先级创建一个中断,以便Linux内核的其他活动(例如调度或其他中断,甚至)不会抢占/阻止中断处理程序,并且具有足够的粒度/频率以满足您的信号稳定性约束
  2. “方波”电气线路也必须是可编程的,并且必须保证切换其状态的操作(寄存器写入?存储器映射寄存器写入?特殊CPU指令?...?)必须比使用的最短周期时间更快上面的计时器(或者你可以得到“频率莫尔”)
  3. 如果是这种情况,那么您的特殊定时器设备驱动程序可以从其高prio中断处理程序中切换线并创建方波。由于它既是中断驱动的,也是与普通定时器中断源/消费者分开的(即不共享 - 没有延迟,因为每个中断可能会调度多个定时器事件),你有更好的准确性。

    由于所有这些(可单独编程的定时器设备的存在)是特定于硬件的,因此您需要从CPU / SoC /板的规格开始,并找出是否有多个独立定时器可用