关于 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() 占用了总线通信

时间。

 

你可能感兴趣的:(slave)