驱动开发在许多人眼中都是一项极富挑战的任务。然而,当你真正投入开发一个驱动时,也许会发现它并没有那么难。但是对于大多数人来说,驱动开发仍然是一个充满神秘感的话题,增添了难度和兴趣。
驱动作为操作系统控制硬件的接口,直接与硬件和操作系统打交道。
驱动与硬件
驱动通过配置寄存器Q来控制硬件。虽然这个过程可能非常复杂,但并不一定具有挑战性,也没有太多的创造空间。它可能是驱动开发中最枯燥乏味的环节,但一旦忽视,即使配置只有一个小小的问题,硬件可能出现故障,你就不得不重新分析、对比寄存器配置,直到解决问题。
配置寄存器以驱动硬件
配置寄存器时,常参考芯片手册和官方demo。如果芯片手册写得明确,配置过程会减少很多压力;但如果芯片手册晦涩难懂,配置寄存器也会成为一个大难题。也许参考官方demo可以减轻你的压力,但并非所有情况下都有这种条件。
确认配置生效
当寄存器配置完成后,需要调试验证寄存器是否按照代码逻辑正确配置。你常常会先入为主地认为代码中的逻辑没有太大问题,但实际执行结果未必符合预期。即使配置是正确的,也可能无法正常工作,需要考虑编译器优化可能带来的问题。也许你会说使用volatile关键字就可以解决大部分问题,然而这种处理方式并不被推荐。那么你需要研究屏障的使用,搞清楚编译屏障和内存屏障应该在何时使用。唉!连配置一个寄存器都会涉及这么多细枝末节,说到这里我真是长长地叹了口气!
排除硬件问题
完成初始化配置后,可以编写一个简单的中断服务程序进行测试。如果无法正常工作,可以进一步查看引脚波形,使用示波器观察所使用的引脚。通过观察波形,可以找到一些线索,这也是最客观的证据。
其实,更客观的步骤应该是先使用万用表确认引脚连接是否正常,确认没有问题后再用示波器进一步分析。但我们很多情况下并不会这样做。一旦真的遇到问题,可能需要绕好几个圈子才能想起这些问题。