我们正在尝试对所有周期性任务、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;
}
