我正在使用Silicon Labs EFM tiny-gecko HW,使用4.22手臂工具链运行RTX。 我有RTX的以下配置: - NVIC分组7.1 - System Tick& Pend System服务中断优先级224。 - 两个中断都已启用,我的代码流从不禁用。 - PRIMASK和BASEPRI寄存器均为0。
我项目中的RTX代码已有几年了,我不确定它是哪个版本。
我观察到以下问题:当使用isr_evt_set从RTC中断触发任务时,任务执行被延迟。我发现当RTC中断结束时不会调用“Pend System service”中断。
当从RTC中断调用时,isr_evt_set将“Pend系统服务”置于挂起状态。 RTC中断结束后,“Pend系统服务”中断不会激活。相反,处理器恢复线程模式并执行低优先级(电源管理)任务。
我在RTC中断中将SCB寄存器SLEEPONEXIT位设置为0。 “Pend系统服务”中断最终会在4-10个RTC周期后执行。
我希望在RTC中断后运行“Pend系统服务”中断。 你能解释为什么在RTC中断后皮质会回到Thread模式吗?
答案 0 :(得分:0)
Cortex M3手册指出" Pend System Service"是一个例外,处理器必须返回线程模式才能为它提供服务。
我发现在RTC中断发生之前,负责将系统置于睡眠状态的任务使用tsk_lock()。当从RTC中断调用isr_evt_set时,其请求激活" Pend System Service"只有在处理器恢复线程模式并使用tsk_unlock()之后才进行缓冲和服务,tsk_unlock()会立即为" Pend System Service"设置NVIC挂起标志。使用调试器,我看到在调用tsk_unlock()后不久就会调用PendSV_Handler()。