This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM3352:如何在 Linux 系统开发中优化器件寄存器访问速度?

Guru**** 2466550 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1471513/am3352-how-to-optimize-the-device-register-accessing-speed-under-linux-system-development

器件型号:AM3352

工具与软件:

大家好

对于 Linux 系统下的应用、读取寄存器0x49800288的执行时间为230ns (程序的执行时间通过设置 GPIO 端口的高低电平并抓住示波器来衡量)、这个时间有点出乎意料。 我们如何加快寄存器读取时间?

测试代码如下:

volatile unsigned int DMA_dfd;

TEST_4.12.10_SET Speed_By (0);

DMA_DFD =*(volatile unsigned int *)(0x49800000 + 0x288);
// DMA_DFD =*(volatile unsigned int *)(0x44E07000);

TEST_4.12.10_SET Speed_By (1);

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的建磊:

    函数 TEST_SNAT_SNACT_SNACT_ENSET() Speed_By 函数正在执行什么操作? 它还访问寄存器吗? GPIO 切换之间的时间不仅仅是读取0x49800288寄存器、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bin、

    感谢您的答复。

    如您所描述的,函数 test_307_ Speed_By set()是一个写入寄存器。 当代码如下所示时、测量时间为40ns:

    TEST_4.12.10_SET Speed_By (0);

    TEST_4.12.10_SET Speed_By (1);

     

    当代码如下时、测量时间变为230ns:

    TEST_4.12.10_SET Speed_By (0);

    DMA_DFD =*(volatile unsigned int *)(0x49800000 + 0x288);
    // DMA_DFD =*(volatile unsigned int *)(0x44E07000);

    TEST_4.12.10_SET Speed_By (1);

    切换到其他寄存器会产生相同的结果。我不知道为什么读取寄存器比写入寄存器需要更长的时间。

    期待您的回复

    此致、

    Jianlei

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的建磊:

    [报价 userid="641146" url="~/support/processors-group/processors/f/processors-forum/1471513/am3352-how-to-optimize-the-device-register-accessing-speed-under-linux-system-development/5651676 #5651676"]

    TEST_4.12.10_SET Speed_By (0);

    DMA_DFD =*(volatile unsigned int *)(0x49800000 + 0x288);
    // DMA_DFD =*(volatile unsigned int *)(0x44E07000);

    TEST_4.12.10_SET Speed_By (1);

    [报价]

    您是在 Linux 用户空间还是内核空间中运行此代码? 它似乎不在不直接访问物理地址的内核空间中。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bin、

    抱歉、上一个代码是裸机测试代码。

    不过、Linux 中的测试结果是相同的、读取寄存器的时间也是230ns。 下面是 Linux 下的测试代码、仅用于测试寄存器访问速度:

    static int gpmc_misc_open (struct inode * inode、struct file * filp)

    -   printk("gpmc_misc 已打开\n");
    +   寄存器 uint32_t temp=0;
    +   int i;
    +   int ret;
    +
    +   gGpio0base =(volatile unsigned int*) ioremap(L4_34XX_virt+0x7000,0x195);
    +   assert(NULL!= gGpio0base );
    +
    +   ret = GPIO_request (scose_PIN、"scose_PIN");
    +   if(ret !=0)
    +   {
    +       printk ("scope_PIN 请求失败\n");
    +       GPIO_FREE (SCOVERE_PIN);
    +       ret =-6;
    +       返回;
    +   }
    +
    +   GPIO_DIRECTION_OUTPUT (SCOCE_PIN、1);
    +
    +   while (1)
    +   {
    +   GPIO_SET_VALUE (SCOVERE_PIN、0);//设置低电平
    +   temp =*(gGpio0base);//读取 GPIO 的寄存器
    +   GPIO_SET_VALUE (SCOVERE_PIN、1);//设置高电平
    +   }
    +
    +   printk ("GPMC_MISC 已打开 test%x\n"、temp);
        返回0;
    }

    我真正想知道的是、寄存器读取速度是否仍然可以优化? 谢谢。

    期待您的回复

    此致、

    Jianlei

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的建磊:

    但是、Linux 中的测试结果相同、读取寄存器的时间也是230ns。

    该号码位于正确的球场。 只能优化读取速度。

    您的应用是什么? 为什么这种读数速度是您项目中的一个问题?