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

    时间。

  • 相关阅读:
    可持久化线段树区间查询 + 永久化标记 T^T online judge 2507
    可持久化线段树
    T^T online judge 3441
    食物链
    T^T ONLINE JUDGE 2592
    HDU 6312 GAME
    HDU 1430 魔板
    栈的操作链表+数组版
    Codeforces Round #468 (Div. 2, based on Technocup 2018 Final Round) D. Peculiar apple-tree
    Codeforces Round #468 (Div. 2, based on Technocup 2018 Final Round) C. Laboratory Work
  • 原文地址:https://www.cnblogs.com/aqing1987/p/4423283.html
Copyright © 2020-2023  润新知