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.

[参考译文] CCS/TM4C1294NCPDT:关于 TM4C1294中 EPI 从 AD 读取数据的时间

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/585810/ccs-tm4c1294ncpdt-about-the-time-of-reading-data-from-ad-by-epi-in-tm4c1294

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

我需要一个1294epi 来读取应该时间的数据、如何计算?

我在16位总线模式下使用1294 EPI、读取 AD 数据、当我打开代码优化来测量时间为680ns 8 次时、请关闭 代码优化一次333.3ns。

我觉得问题比较严重、但却找不到问题的位置。  代码优化真的很重要吗?

我的系统以120MHz 的频率运行。

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

    我不清楚您的问题。 是否要测量访问 EPI 所需的时间? 您说您在打开/关闭优化时会得到不同的结果吗?

    下面是伪代码、还是您尝试测量访问 EPI 所需时间的类似内容?

    x = SysTickValueGet ();
    对于(i=0;i<8;i++){
    ACCESS_EPI ();

    Y = SysTickValueGet ();
    差值= y-x;

    如果以上内容用于测量8次访问 EPI 所需的时间、则结果将受到代码优化的影响。 上述代码序列包括对 ACCESS_EP()的函数调用以及其它所有内容。 不同的编译器优化设置可能会影响最终代码序列。 例如、通过优化、编译器可能能够展开 for 循环以获得某种速度、但会牺牲代码大小。

    如果只想测量它只在 ACCESS_EP()中执行的时间,那么您需要从某种程度上删除 CPU 执行与其它所有内容相关的代码所花费的时间。 请注意 ACCESS_EP()是一个伪函数,我将用它来说明。 代码优化也会影响 ACCESS_EP()本身,除非它已经是一个库函数。

    为了消除所有其他问题、我建议采用双通方法。 在第1遍中、您执行上面列出的代码序列。 在第二次传递中,您将按如下方式修改上述代码,只需添加另一个 ACCESS_EP()即可。

    x = SysTickValueGet ();
    对于(i=0;i<8;i++){
    ACCESS_EPI ();
    ACCESS_EPI ();

    Y = SysTickValueGet ();
    time_difference = y-x;

    现在、您将同时从 pass1和 pass2记录"time_differy"。 取这两个'time_different'之间的差异,您将获得八次执行 ACCESS_EP()的时间。 要获得一个 ACCESS_EP()中的时间量,只需除以8即可。

    其他社区成员可能还可以分享其他巧妙的方法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Charles Tsaaa"]其他社区成员可以分享其他巧妙的方法。

    虽然(避免)任何"巧妙"的主张/表述-" for loop"(w/in pass 2)不会在测量中添加"可避免的"时间负担(循环的执行时间)?

    以下哪项可以改善测量?

    x = SysTickValueGet ();

    ACCESS_EPI ();
    ACCESS_EPI ();
    ACCESS_EPI ();
    ACCESS_EPI ();
    ACCESS_EPI ();
    ACCESS_EPI ();
    ACCESS_EPI ();
    ACCESS_EPI ();

    y = SysTickValueGet (); // 此函数会增加此序列的总体执行时间

    time_difference = y-x; //在"y-x 减法"之后、采用8、16或32个"背靠背" EPI 序列-简单的"移位"(3、4或5)-无需进行分频。

    如果一个唯一的 EPI 地址位可与最后的"access_epi()"-该位可由计时器锁存-从而消除 SysTickValue Get()引入的时间损失。  该同一个计时器将通过指令"清除并启用"-就在"EPI barrage"之前-从而替换第一个(顶部)"SysTickValue Get()"。  (即、清零和使能定时器优先-执行 EPI 序列-在出现唯一的 EPI 地址位时停止。)  再说一次-我们不知道或使用129x -但我知道这种方法适用于其他 ARM Cortex M4和 M7……

    由于两个公司/我都不使用129x -我不知道"访问"(即可能不使用地址增量/减量)是否如此简单(并重复)、提供/反映了"真实世界"时序...  

    让记录显示"Pro IDE (IAR、Keil)"都提供了"自动测量和显示此类时序"-无需/零代码!  (同时"供应商不可知")

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

    让我定义如下:

    a =执行一个 SysTickValueGet 的时间;
    b =执行 for 循环和分支返回的时间
    C =执行一个 ACCESS_EPI ()的时间

    在 pass 1中、总时间为 a + 8 *(b + c)+ A
    在 pass 2中、总时间为 a + 8 *(b + c + c)+ A

    这两次通过之间的差异将是8 * C。如果除以8、则只能得到 c 的时间、即执行一个 ACCESS_EP()的时间。 通过这种方法,您可以消除与 for 循环和两个 SysTickValueGet ()相关的开销。 我认为,如果迭代次数增加,精度可能会更好,即 for 循环中从8次增加到16次,然后除以16以获得一个 ACCESS_EP()。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、我以您的方式测量了数据[7]=ui32MAPPINGAD[0x00000]、我发现它是100ns、但它是正常的吗?

    EPI 需要多长时间才能读取 SRAM?

    另一个问题是、我觉得我的1294没有在120MHz 下运行、因为   一条语句的执行时间和 我计算的时间之间的间隔太大、这是什么原因?

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

    您好!

    如何使用与一个通道上的 EPI 时钟同步的良好示波器进行测量?

    这是显示实际持续时间的唯一工具。

    此外、有关连接到 EPI 的器件的更多信息也很有用。

    工作波形位于用户手册中、也请检查它们。

    将 driverlib 中的函数替换为 ROM_VER版本。

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

    非常感谢、如果 您能帮助我欢呼我 测量的3个信号波、那么我想帮助我欢呼;信号1是 ADC 的忙线、信号2是 ADC 读取 处理程序中的 LED I 指示灯。信号3 是计时器处理程序中的 LED I 指示灯、我发现边沿1和边沿2之间的时间是 大约500ns、我设置中断上升沿、但为什么它需要这么长的时间?

    高级别时间为3.9us (黄色)、900ns (蓝色)、800ns (粉色)、代码如下:

    无效
    Timer0IntHandler (空)

    ROM_TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);

    ROM_GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_6、GPIO_PIN_6);

    ROM_GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_4、0);//CONVSTA=0
    ROM_GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_4、GPIO_PIN_4);//CONVSTA=1

    if (intflag=0)

    GPIOIntRegister (GPIO_PORTF_BASE、ADReadIntHandler);
    ROM_GPIOIntTypeSet (GPIO_PORTF_BASE、GPIO_PIN_1、GPIO_RISE_EDGE);
    ROM_IntEnable (INT_GPIOF);
    ROM_GPIOIntEnable (GPIO_PORTF_BASE、GPIO_PIN_1);
    intflag=1;

    ROM_IntMasterDisable();
    ROM_GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_6、0);
    ROM_IntMasterEnable();

    空 ADReadIntHandler (空)

    ROM_GPIOIntClear (GPIO_PORTF_BASE、GPIO_PIN_1);

    ROM_GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_5、GPIO_PIN_5);
    // SysCtlDelay (120000000 /100000000 / 3);
    DATA[0]=ui32MAPPINGAD[0x000000];
    DATA[1]=ui32MAPPINGAD[0x000000];
    DATA[2]=ui32MAPPINGAD[0x000000];
    DATA[3]=ui32MAPPINGAD[0x000000];
    DATA[4]=ui32MAPPINGAD[0x000000];
    DATA[5]=ui32MAPPINGAD[0x000000];
    DATA[6]= ui32MAPPINGAD[0x000000];
    DATA[7]=ui32MAPPINGAD[0x000000];
    G_pui8USBTxBuffer[0]=数据[ADCMChannel]&0xFF;
    G_pui8USBTxBuffer[1]=(DATA[ADCChannel]>8)&0xFF;
    STATUSReg=0x00FF;
    ROM_IntMasterDisable();
    ROM_IntMasterEnable();
    ROM_GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_5、0);

    我不知道为什么时间 这么长、它 是否与设置相关?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Wei、
    您似乎提出了与 EPI 无关的另一个问题、这是正确的吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Wei、

    这里有几个想法:

    -在120MHz 时,处理器上的每个时钟周期花费8.3ns -我们无法做任何事情。 一组需要10个周期的指令需要83ns 的周期。
    -是的、同样:优化可以改变"整个过程"发生的时间-优化主要在循环结构、变量放置(寄存器/存储器)等上工作...
    -如果您停止处理并查看 ISR 的汇编代码,则可以对周期数进行"评估"。 然后、您可以查找 ARM 文档来查看每个指令所需的周期数、或者使用 CB1建议的"资源更丰富的 IDE"。

    100ns 约为12个周期、不是太多... 您真的需要比这更快的速度吗? 在这种情况下、这可能不适合您。 请注意、如果在处理另一个中断时发生中断事件、您仍需要等待该中断完成、然后才能开始处理新中断、因此需要更长时间。

    最后、请使用 用于发布代码的按钮(位于"丰富格式"内)。 如果您只是没有格式化、那么很难阅读论坛消息中的代码。

    谢谢

    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、但现在似乎您和 Bruno 以及 CB1_MOBILE 已经解决了我的问题。 非常感谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢、我很长时间都很困惑、但我会将其更改为注册表单并修改我的代码、这是我第一次在博客上输入代码、所以我没有注意到我没有使用 非常感谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉!我还有另外一个问题:
    使用 EPI 将数据从外部 SRAM 读取到内部 RAM 需要多长时间?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Wei、

     很抱歉、我没有此数据。 我认为您可以比我更快地完成此基准测试、因为我目前没有一个板、它的 EPI 接口连接到外部 SRAM。 还记得我建议的测量 EPI 的方法。 我相信您可以将相同的方法用于双通方法。 您将从 SRAM 读取存储在内部 RAM 中的内部变量。 2次传递之间的差异是对内部变量读取8倍外部 SRAM 所需的周期数。 除以8、您应该得到一个从外部 SRAM 到内部 RAM 读取的迭代。 当从 SRAM 读取数据时、数据必须从 EPI 模块和某些互连(将系统连接在一起的结构)传输、然后才能加载到 CPU 寄存器中。 然后、需要将数据从寄存器写入 RAM。  

    // pass1 
    SRAM_CONFIG ();//出于说明目的配置 EPI 以访问 UINT32数据; x = SysTickValueGet (); for (i=0;i<8;i++){ data =*(SRAM_LOCATION); } y = SysTickValueGet (); time_difference = y-x;
    /pass2. 
    SRAM_CONFIG ();//出于说明目的配置 EPI 以访问 UINT32数据; x = SysTickValueGet (); for (i=0;i<8;i++){ data =*(SRAM_LOCATION);
    数据=*(SRAM_LOCATION); 

    Y = SysTickValueGet ();
    time_difference = y-x;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、粘贴的代码有点混乱。 希望您仍能阅读并理解我的意思。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    EPI 专为访问低速外设而设计、包括 SRAM -因此、如果您想获得问题的答案、请告诉我们(来自数据表) 您的设备的访问时间是多少?您是如何配置的-因为您可能会添加一些等待状态以使设备具有良好的行为。 请勿使用默认值、因为它们与您的设备不匹配。

    此外、考虑到 SysTick 中断无法提供有用的数据-这取决于它的配置方式、但无论如何、它不适合毫微秒周期、分辨率始终是单个 SysTick、这可能是错误的、并且可能会使您的微控制器承受压力(通常是中断)。 要获得分辨率为1个时钟周期 的更精确测量、请参见此链接。

    不要忘记使用示波器。