对于我的应用程序(在 STM32L082 上运行),我需要几种类型的中断的准确(相对)时间戳。我通过在 1 MHz 上运行一个计时器并在 ISR 运行后立即计数来做到这一点。它们都被赋予最高优先级,因此它们抢占了不太重要的中断。我面临的问题是,它们可能仍会被具有相同优先级的其他中断和禁用中断的代码延迟,而且似乎没有简单的方法可以知道发生了这种情况。ISR 被延迟是没有问题的,只要我知道特定的时间戳因此不准确。
我目前的方法是让每个 ISR 和每个禁用中断的代码块检查中断是否正在挂起,NVIC->ISPR[0]
并为挂起的 ISR 标记它。每个 ISR 都会检查此标志,并在需要时将时间戳标记为不准确。
虽然这行得通,但感觉它是错误的方式。所以我的问题是:是否有另一种方法可以知道是否立即提供了 IRQ?
有问题的 IRQ 是用于 GPIO 引脚更改的 EXTI4-15 和用于唤醒定时器的 RTC。不幸的是,我无法更改 PCB 布局并在输入引脚上使用 TIM 输入捕获,也无法更改使用的 MCU。
更新
当前设置中精度的基本限制取决于内部 RTC 校准的性质,它会周期性地添加/移除 32kHz 滴答声,从而导致约 31 µs 的抖动。我的目标是尽可能消除(或至少检测)额外的时间戳错误。偶然阻塞中断(例如 50+ µs)很难避免并影响测量,因此至少需要知道何时发生这种情况。
更新 2
澄清一下,我认为这是一个软件问题,询问是否存在特定功能,如果存在,如何使用它。我正在寻找的答案之一是:“是的,有可能,只需检查寄存器 Y 的位 X”,或者“不,这是不可能的,但是 MCU ......确实有这样的功能,称为......”或“不,这样的功能通常在任何平台上都不可用(但常见的解决方法是......)”。这些信息将引导我(和未来的读者)找到软件解决方案,和/或更好的硬件设计要求。