5. 谨防外设故障
最近我刚好有机会把一系列的微控制器驱动移植到其他的微处理器上。制造商和数据手册都表明 PWM 外设在这两个系列的微控制器之间是相同的。然而,实际情况却是在运行 PWM 驱动器的时候两者之间有很大的不同。该驱动程序只能在原来的微控制器工作,而在新系列的微控制器上却无效。
在反复翻看数据手册之后,我在数据手册中一个完全不相关的注脚里发现了 PWM 外设上电时会处于故障状态,需要将一个隐藏在寄存器中的标志位清零。在驱动程序实现的开始,确认外设可能出现的故障并查看其他看似无关的寄存器错误。
04
大牛对于嵌入式驱动开发的建议
1) 为了今后的发展,你除了考虑广度以外,更重要的是注意知识的深度。
譬如,做过网络驱动,那么是不是只停留在会写驱动的表层上,有没有对 Linux 内核的网络结构,TCP/IP 协议作过深入的了解。
2) 在 Linux 下开发很多时候都要利用现成的东西,没必要什么都自己搞。关键是变成自己的驱动后是否了解原作者编写时背后的一些东西。你应该不止是简单的让它工作。写驱动的时候就要考虑它的性能问题,并给出测试的方法(当然可以利用现成的许多工具,譬如测试网络性能的 netperf 等)。
当你写过 Flash 驱动,可能会知道 Flash 的性能有时候有多重要。
3) C 程序的自我修炼,是否考虑到软件工程方面的一些东西,程序的可维护性和扩展性,譬如 LCD 驱动,是不是从 Sharp 到 NEC 的只需要集中修改很少的几个地方?
对于不同品牌的 Flash,如果使得 Flash 的驱动做的更具有灵活性。
4) 如果有时间结余,可以关注 Linux 内核的发展。譬如 LCD 的驱动有没有考虑到 V4L2 通用架构,譬如网络驱动用到了 NAPI 了吗?当然在此之前,假设已经对 LDD3, ULK2 理解的比较熟了。