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.

[参考译文] EK-TM4C123GXL:如何对代码进行基准测试?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/609444/ek-tm4c123gxl-how-to-benchmark-code

器件型号:EK-TM4C123GXL
主题中讨论的其他器件:TM4C123

编辑:修复了错误、但仍产生相同的结果。

我尝试使用 SysTick 来计时代码段、但我得到的答案是错误的。 我所做的就是:

SysTickPeriodSet (10000000);

SysTickEnable ();

uint32_t numCycles = SysTickValueGet ();

//此处运行的时间密集型代码

numCycles = SysTickValueGet ()- numCycles;

uint32_t clockRate = SysCtlClockGet (); 

然后、我计算 numCycles/clockrate、得到53秒作为我的时间、此时我可以清楚地知道代码在不到一秒的时间内运行。 我是否使用 SysTick 错误/ TM4C123上是否有更好的计时代码? 我需要微秒分辨率。

谢谢。

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

    [引用用户="Laura Brandt"] numCycles/clockrate [/引用]

    您希望这会带来什么结果?

    [引用用户="Laura Brandt"]/TM4C123上是否有更好的计时代码方法? 我需要微秒分辨率。[/引述]

    切换引脚并使用数字存储示波器或设置为包络模式且具有持久性的逻辑分析仪。 您将获得最短和最长的时间以及良好的时间分配体验。 您还应该获得  调度抖动的度量/感觉。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我希望 numCycles /时钟速率返回秒。
    这是因为我认为 SysTick 对时钟周期进行计数。 这是不正确的吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的工作频率是多少? 在16MHz 时、24位系统节拍计数器将在大约一秒钟内溢出。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如另一个(类似)线程所述-海报已超过 SysTick 的24位容量1。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的观看。 我将 SysTick 的周期减少到了10、000、000 (这应该很容易适应24位)、并且仍然会出现完全相同的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    劳拉

    当您第一次获得 SysTick 计数器时、它可以是 SysTick 周期内的任何值、为10、000、000。
    然后您运行代码并再次读取它。 它可能已超过该限制、第二个值可能低于第一个值。
    您的目的变量是一个 uint32_t、"god 只知道"从负值转换的结果。

    但是、正如这里所说的、一种更好的方法是使用 GPIO 并在外部进行测量、但这可能不是那么实用/快速。 您可能希望使用32位计时器而不是24位 SysTick? 但是、如果是翻转、您仍需要创建条件。 或者、由于您使用的是 TM4C123、因此只要一直使用64位计时器、如果我没有弄错、就有6个计时器可用!

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

    如果您(认真)寻求"基准测试"代码段-也许是时候考虑使用其中一个包含"内置"的"Pro" IDE (IAR、Keil)了、 周期计数器"-要求无/零"特殊编码"-并且可被设定为从你指定的任一2个代码点报告"已过的周期"。

    使用"低于原始"的工具-同时"免费"-有效地"以(许多)其他方式收费"-正如您所注意到的...

    较小的工具会迫使您离开中心任务-通常会进入您没有充分练习/经验的领域-这(显然)会降低您的工作效率。

    正如之前的两张海报 Robert (和我)所建议的那样-一对巧妙放置 的"GPIO 切换"(围绕相关代码块)可能会为您带来更快、更轻松的体验。   (和-海报 Robert 关于"信封模式"的建议、从而揭示了"时序变化"(如果这种变化很关键)、可能会提供超出 Pro IDE "周期捕获"的结果。   但是-没有任何东西与周期计数器竞争、可以快速、零工作量、通用基准使用!)

    这正是您所寻求的!

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

    [引用用户="Bruno Saraiva"]但正如这里所说的、一种更好的方法是使用 GPIO 并在外部进行测量、但这可能不是那么实用/快速。 [/报价]

    使用引脚的速度应该比使用计时器更快、并且对程序的影响应该更小。 实际上、它使用 对您的工具箱至关重要的工具、并且依赖于额外的引脚。 您应该努力使用额外引脚的一个原因、但在最坏的情况 下、使用引脚来控制 LED。

    [引用 USER="Bruno Saraiva">您可能想使用32位计时器而不是24位 SysTick 吗? 但是、如果是翻转、您仍必须创建条件

    不适用于 ARM 上的32位计时器(或任何支持 uint32_t C 类型的处理器)。 至少只要您 确定连续读取在2^31的时间内彼此计数(80MHz 时为~26s)。  

    Robert

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

    Robert -"爱"您的灵感启发"Tag"-棒极了。 (您以某种方式"抗拒"MCU 并日期...)

    您对 Bruno 的问题提出质疑:"条件检测翻转"-这种理解是否正确?   (只要测得的"时间"为~26.8S、)

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

    [引用 user="CB1_mobile "]您对 Bruno 的问题提出质疑,即:"条件检测翻转"-这种理解是否正确?

    我是。 这是不必要的、更容易出现错误。

    C/C++保证在我指出的限制范围内的行为正确(我认为这是一项严格的保证)。  它在 ARM 处理器上的组装也是正确的(实际上大多数32位处理器)。

    Robert