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.

[参考译文] TMS320F28374S:完全优化与不优化显示时间戳波动

Guru**** 2538930 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1043755/tms320f28374s-full-vs-no-optimization-shows-timestamp-fluctuation

器件型号:TMS320F28374S

我们正在尝试对所有周期性任务、Swi、Hwi 和零延迟中断进行时间戳记、但我们在优化开启时会看到波动。  我在代码库中对 SWI 进行的第一项逻辑测试 显示、优化关闭时、该逻辑在其周期内为1ms +-1us、而优化开启时为1ms +-14us。 我们设置了一些 GPIO。 我在时间戳之后直接设置的值。 在示波器上、当代码被优化而不是被优化时、我看到+-1us。 这似乎表明优化正在对时间戳逻辑执行某种操作。 也许稍后会将其移至逻辑中? 请注意、我已经尝试删除 GPIO 设置/清除操作、但这并不能解决问题。 我们希望尽可能接近"实际"阶段、而不会影响实际完成的工作。

时间戳模块使用完整的定时器周期(0xFFFFFFFF)范围从定时器2运行。 我们的零延迟中断大约为10us、因此这很容易成为导致差异的因素。 大多数情况下、我希望确保在我们的所有线程中首先获取时间戳。

下面是我尝试执行的操作的示例:

static volatile uint32_t lastTimestamp = 0; 
static volatile uint32_t timestamp = 0; 
void swiFunction(void) 
{ 
    timestamp = HWREG(CPUTIMER2_BASE + CPUTIMER_O_TIM); 
    . 
    . 
    . 
    // save the delta between timestamps (CPUTIMER_O_PRD, period = 0xFFFFFFFF) 
    saveDelta(0xFFFFFFFF - timestamp, 0xFFFFFFFF - lastTimestamp); 
    lastTimestamp = timestamp; 
}

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

    这很奇怪。 您可以尝试查看此函数的反汇编、以查看是否确实以可能导致这种情况的方式移动或重新排序。

    您是否还可以尝试将 ISR 和时间戳代码从 RAM 中运行(假设尚未运行)? 我想知道、优化是否会改变闪存中代码的对齐方式、使其足以导致某些影响执行时间的闪存预取/缓存缺失。

    惠特尼

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

    CPUTIMEER2_BASE = 0xC10

    该行的宏扩展是  

    (*((volatile UINT32_t *)(0x00000C10U + 0x0U)))

    这种反汇编对我来说是正确的。 我也将对象.text 移到了 RAM 中、但仍然看到发生了+-14us 移位。 这是基于将系统节拍除以系统频率的计算得出的。 重新计算后、似乎在那里引起了一些误差。 这可能是由意外的精度损耗转换导致的。

    使用低通滤波器计算、中断之间的平均增量时间为 预期值。 在优化关闭的情况下检查这些值表明、它们只是在计算和存储时出现了误差。 现在一切都很好。

    感谢您的帮助!