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

时间。

时间: 2024-08-06 12:05:10

关于 printk() 对 spi slave 内核驱动程序的性能影响的相关文章

在Ubuntu上为Android系统编写Linux内核驱动程序

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6568411 在智能手机时代,每个品牌的手机都有自己的个性特点.正是依靠这种与众不同的个性来吸引用户,营造品牌凝聚力和用户忠城度,典型的代表非iphone莫属了.据统计,截止2011年5月,AppStore的应用软件数量达381062个,位居第一,而Android Market的应用软件数量达294738,紧随AppStore后面,并有望在8月份

在Ubuntu上为Android系统编写Linux内核驱动程序(老罗学习笔记1)

在智能手机时代,每个品牌的手机都有自己的个性特点.正是依靠这种与众不同的个性来吸引用户,营造品牌凝聚力和用户忠城度,典型的代表非iphone莫属了.据统计,截止2011年5月,AppStore的应用软件数量达381062个,位居第一,而Android Market的应用软件数量达294738,紧随AppStore后面,并有望在8月份越过AppStore.随着Android系统逐步扩大市场占有率,终端设备的多样性亟需更多的移动开发人员的参与.据业内统计,Android研发人才缺口至少30万.目前,

Linux内核驱动程序Hello

1.printk打印输出的优先级 #define  KERN_EMERG     "<0>"/*紧急事件消息,系统崩溃之前提示,表示系统不可用*/#define  KERN_ALERT      "<1>"/*报告消息,表示必须立即采取措施*/#define  KERN_CRIT        "<2>"/*临界条件,通常涉及严重的硬件或软件操作失败*/#define  KERN_ERR         &qu

在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序(老罗学习笔记3)

在Android硬件抽象层(HAL)概要介绍和学习计划一文中,我们简要介绍了在Android系统为为硬件编写驱动程序的方法.简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的硬件抽象层中.接着,在Ubuntu上为Android系统编写Linux内核驱动程序一文中举例子说明 了如何在Linux内核编写驱动程序.在这一篇文章中,我们将继续介绍Android系统硬件驱动程序的另一方面实现,即如何在硬件抽象层中增加硬件模块来和内核驱动程序交互.在这篇文章中,我们还将学习到如何在

在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6571210 在前一篇文章中,我们介绍了如何在Ubuntu上为Android系统编写Linux内核驱动程序.在这个名为hello的Linux内核驱动程序中,创建三个不同的文件节点来供用户空间访问,分别是传统的设备文件/dev/hello.proc系统文件/proc/hello和devfs系统属性文件/sys/class/hello/hello/v

CC1110F32 作spi slave 端的配置

1.使用串口0 作spi slave 错误设置如下: U0CSR &= ~(U0CSR_MODE) | U0CSR_SLAVE; 正确设置如下: U0CSR = (U0CSR & ~U0CSR_MODE) | U0CSR_SLAVE; 其中宏的定义在 ioCCxx10_bitdef.h 中,如下示: // U0CSR (0x86) - USART 0 Control and Status #define U0CSR_MODE 0x80 #define U0CSR_RE 0x40 #defi

debian下配置dynamic printk以及重新编译内核

在以前的一篇博文<编译debian内核>已经提过了重新编译内核的方法,但是整个过程花费时间较长,并且生成deb包. 这里我采用稍微简单一些的方法,因为我并没有对内核或者驱动代码做任何修改,仅仅是在内核中选中一些未被选中的调试选项(以便于查看log信息) 先获取内核源码: sudo apt-get source linux-source-3.2 会在当前文件夹下得到几个文件: $ ls linux-3.2.57 linux_3.2.57-3+deb7u2.debian.tar.xz linux_

【转】第一个Linux内核驱动程序

原文网址:http://blog.csdn.net/nexttake/article/details/8181008 刚看 O’REILLY 写的<LINUX 设备驱动程序>时.作者一再强调在编写驱动程序时必须 建立内核树.所谓内核树,我的理解和网上资料说的一致就是内核源码的一种逻辑形式. 先查看自己OS使用的内核版本[email protected]:~$ uname -r2.6.22-14-generic           /*  这是我显示的结果 */如果安装系统时,自动安装了源码.在

imx6 spi slave 数据接收时移位寄存器的工作机理

如上图, 移位寄存器(shift register)及 接收FIFO (RXDATA)对程序来说是透明的. 唯一可访问的 Receive Data Register (ECSPIx_RXDATA) 只能访问 接收FIFO的 top 字.如下: 当把 spi2 配置成为 slave 模式时,外部的主spi 端将数据发送到 spi 的 MOSI 线上,mosi线上的数据是按bit 传输的. 在 bpw 配置为 32时,移位寄存器中 每满 32bit 才可以向 接收FIFO 打一个字. 如果,mosi