【问题标题】:RTX isr_evt_set service is delayedRTX isr_evt_set 服务延迟
【发布时间】:2018-10-07 23:57:28
【问题描述】:

我正在开发 Silicon Labs EFM tiny-gecko 硬件,使用 4.22 arm 工具链运行 RTX。 我对 RTX 有以下配置: - NVIC 分组 7.1 - System Tick & Pend 系统服务中断优先级 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 中断后皮层会回到线程模式吗?

【问题讨论】:

    标签: embedded keil cortex-m3 rtx


    【解决方案1】:
    1. Cortex M3 手册指出“挂起系统服务”是一个异常,处理器必须返回到线程模式才能对其进行服务。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 2019-10-09
      • 2014-04-09
      • 2017-07-26
      相关资源
      最近更新 更多