工具/软件:Code Composer Studio
我需要一个1294epi 来读取应该时间的数据、如何计算?
我在16位总线模式下使用1294 EPI、读取 AD 数据、当我打开代码优化来测量时间为680ns 8 次时、请关闭 代码优化一次333.3ns。
我觉得问题比较严重、但却找不到问题的位置。 代码优化真的很重要吗?
我的系统以120MHz 的频率运行。
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.
工具/软件:Code Composer Studio
我需要一个1294epi 来读取应该时间的数据、如何计算?
我在16位总线模式下使用1294 EPI、读取 AD 数据、当我打开代码优化来测量时间为680ns 8 次时、请关闭 代码优化一次333.3ns。
我觉得问题比较严重、但却找不到问题的位置。 代码优化真的很重要吗?
我的系统以120MHz 的频率运行。
[引用用户="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)"都提供了"自动测量和显示此类时序"-无需/零代码! (同时"供应商不可知")
非常感谢、如果 您能帮助我欢呼我 测量的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 接口连接到外部 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个时钟周期 的更精确测量、请参见此链接。
不要忘记使用示波器。