关于 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() 占用了總線通信
時間。
?
轉載于:https://www.cnblogs.com/aqing1987/p/4423283.html
總結
以上是生活随笔為你收集整理的关于 printk() 对 spi slave 内核驱动程序的性能影响的全部內容,希望文章能夠幫你解決所遇到的問題。