我有一个SysTick异常的处理程序,它计算tick并调用其他函数(f1、f2、f3),这些函数的执行时间可以长于SysTick period。这些函数设置并清除其活动状态(全局变量),以便如果发生SysTick异常,它可以检测到过载并返回到中断的函数。
我给SysTick异常分配了固定优先级(比如说16)。我想以某种方式使SysTick能够生成一个异常,而不管它以前的活动状态如何,转到SysTickHandler,增加勾号计数器并返回中断功能。
一个可能有用的解决方案是使用BASEPRI。它可以设置为低于SysTick的优先级,以便启用该异常。不幸的是,使用BASEPRI没有给我带来任何好处,因为什么都没有发生(我将其设置为max value)。在我更改BASEPRI值之前,它在SysTickHandler中是0。处理器进入处理程序功能时,该值是否应等于SysTick优先级?异常优先级是否自动加载到BASEPRI中?
我也考虑过NVIC对于抢占已经激活的异常有问题,但是在ARM文档中没有找到任何关于这个问题的信息。
此外,检测到oveload时从处理程序返回可以将处理器状态设置为线程模式。让我们暂时忽略这一点。

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

这个问题(不返回)的一个更简单的例子是,当处理程序内部有一个无限循环时,增加tick计数器。
void SysTickHandler(void) {
    ticks++;
    set_BASEPRI(max_value);
    while(1);
}

最佳答案

如果中断在其处理程序正在运行时变为挂起状态,则处理程序将运行到完成并立即重新输入。你的勾号将是非周期的,如果函数持续使用较长的一个勾号周期,你可能永远不会离开中断上下文。
我可能会增加处理程序中中断的优先级,以便它能够抢占自己的位置,但即使这样做可行,我还是会犹豫是否推荐它。
听起来你真正需要的是一个实时操作系统。

10-08 09:22