0

我正在研究 Silicon Labs EFM tiny-gecko HW,使用 4.22 arm 工具链运行 RTX。我对 RTX 有以下配置: - NVIC 分组 7.1 - 系统勾选和挂起 系统服务中断优先级 224。 - 我的代码流启用并且从不禁用这两个中断。- PRIMASK 和 BASEPRI 寄存器均为 0。

我项目中的 RTX 代码已经有几年的历史了,我不确定它是哪个版本。

我观察到以下问题:当使用 isr_evt_set 从 RTC 中断触发任务时,任务执行被延迟。我发现 RTC 中断结束时不会调用“挂起系统服务”中断。

当从 RTC 中断调用时,isr_evt_set 将“挂起系统服务”置于挂起状态。RTC 中断结束后,“Pend system service”中断不会被激活。相反,处理器恢复线程模式并执行低优先级(电源管理)任务。

我在 RTC 中断中将 SCB 寄存器的 SLEEPONEXIT 位设置为 0。“挂起系统服务”中断最终会在约 4-10 个 RTC 周期后执行。

我希望“挂起系统服务”中断在 RTC 中断之后运行。你能解释一下为什么在 RTC 中断后皮层会回到线程模式吗?

4

1 回答 1

0
  1. Cortex M3 手册指出“Pend System Service”是一个例外,处理器必须返回到线程模式才能对其进行服务。

  2. 我发现在RTC中断发生之前,负责让系统进入睡眠状态的任务使用了tsk_lock()。当从 RTC 中断调用 isr_evt_set 时,其激活“挂起系统服务”的请求被缓冲,只有在处理器恢复线程模式并使用 tsk_unlock() 后才服务,该函数立即为“挂起系统服务”设置 NVIC 挂起标志。使用调试器我看到 PendSV_Handler() 在 tsk_unlock() 被调用后不久被调用。

于 2018-04-30T06:57:36.827 回答