关于 printk() 对 spi slave 内核驱动程序的性能影响
调试 imx6 的 spi slave 内核驱动,前期调试总免不了得要追一下寄存器的设置,过程函数的调用。
采用了 printk() 打印语句。
1、采用的硬件方法是:
分析 imx6 spi slave 的各路引脚主要是 clk, cs, mosi, miso, gnd, vcc,连接至spi 主端(CC1110f32 MCU)
的各路对应引脚。对应如下:
imx6 spi 从机 | cc1110f32 spi 主机 |
vcc | vcc |
gnd | gnd |
clk | clk |
cs | cs |
mosi | mosi |
miso | miso |
2、采用的软件方法是:
1)官方的补丁程序 https://community.freescale.com/docs/DOC-97380
2)不能直接打补丁,照着修改之后,参考spi datasheet 进行源码分析,使用printk() 跟踪数据流
3)确保主从端使用的 cpol, cpha, cs, sclk 的配置一致
3、最终结果:
spi slave 端只能正确接收从spi 主端发出的单个字节的数据,接收多个数据后数据发生丢字节情况。
在每个片选之间加 类似于
for (i=0; i < 10000; i++);
的延时后发现,当i < 10000时,多个字节数据接收正确,当 i < 5000 时,多个字节数据只接收了一半正确数据。
比如 0 1 2 3 4 5 6 7 8 9 在 i < 10000 时,spi slave 端接收到的是 0 1 2 3 4 5 6 7 8 9
在 i < 5000 时, spi slave 端接收到的是 0 2 4 6 8
在 i < 2000 时,spi slave 端接收到的甚至是 0 4 8
于是,将内核中的 printk() 去掉之后,发现只要在每次片选之间添加不到100us 的延时,接收端即可正确接收
主spi 端发来的数据,而无数据丢失。
至此,得出一个结论:在涉及通讯类总线的调试时,前期在 printk() 的情况下进行单字节的发送接收是可以的。
一旦面临快速发送接收的时候,printk() 这样的调试语句将严重影响总线的性能,毕竟 printk() 占用了总线通信
时间。