gpt4 book ai didi

Cortex-M4 中的 SysTick 异常能否抢占自身?

转载 作者:太空宇宙 更新时间:2023-11-04 03:36:32 29 4
gpt4 key购买 nike

我有一个 SysTick 异常处理程序,它计算滴答并调用其他函数(f1、f2、f3),其执行时间可以长于 SysTick 周期。这些函数设置和清除它们的事件状态(全局变量),因此如果发生 SysTick 异常,它可以检测到过载并返回到被中断的函数。

我已将固定优先级分配给 SysTick 异常(假设为 16)。我想以某种方式使 SysTick 能够生成异常,而不管它之前的事件状态如何,转到 SysTickHandler,增加滴答计数器并返回中断函数。

一种可能有用的解决方案是使用 BASEPRI。它可以设置为低于 SysTick 的优先级,以便启用该异常。不幸的是,使用 BASEPRI 使我无处可去,因为什么也没发生(我将其设置为最大值)。在我更改之前,SysTickHandler 中的 BASEPRI 值是 0。当处理器进入处理程序函数时,该值是否应该等于 SysTick 优先级? BASEPRI 中是否自动加载异常优先级?

我还考虑过 NVIC 在抢占已经激活的异常方面存在问题,但在 ARM 文档中没有发现任何相关内容。

此外,当检测到过载时从处理程序返回可以将处理器状态设置为线程模式。让我们暂时忽略它。

void SysTickHandler(void) { 
ticks++;
//set_BASEPRI(max_value);
if (f1_act || f2_act || f3_act) return;
else {
f1();
f2();
f3();
}
}

这个问题的一个更简单的例子(没有返回)是在处理程序内部有一个无限循环时增加滴答计数器。

void SysTickHandler(void) {
ticks++;
set_BASEPRI(max_value);
while(1);
}

最佳答案

如果中断在其处理程序已经运行时变为挂起状态,处理程序将运行完成并立即重新进入。你的滴答将是非周期性的,如果函数持续花费比一个滴答周期更长的时间,你可能永远不会离开中断上下文。

我想可能会增加处理程序中中断的优先级,以便它会抢占自己,但即使这样做可行,我也会犹豫是否推荐它。

听起来您真正需要的是一个 RTOS。

关于Cortex-M4 中的 SysTick 异常能否抢占自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32272262/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com