首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cortex-M4中的SysTick异常可以抢占自身吗?

Cortex-M4中的SysTick异常可以抢占自身吗?
EN

Stack Overflow用户
提问于 2015-08-28 21:29:47
回答 2查看 1.1K关注 0票数 1

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

我已经为SysTick异常分配了固定的优先级(假设是16)。我想以某种方式让SysTick生成一个异常,而不管它之前的活动状态如何,转到SysTickHandler,增加滴答计数器并返回到中断功能。

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

我还考虑过NVIC存在抢占已经处于活动状态的异常的问题,但在ARM文档中找不到任何相关内容。

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

代码语言:javascript
复制
void SysTickHandler(void) { 
    ticks++;
    //set_BASEPRI(max_value);
    if (f1_act || f2_act || f3_act) return;
    else {
        f1();
        f2();
        f3();
    }
}

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

代码语言:javascript
复制
void SysTickHandler(void) {
    ticks++;
    set_BASEPRI(max_value);
    while(1);
}
EN

回答 2

Stack Overflow用户

发布于 2015-08-28 22:19:38

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

我认为有可能提高处理程序中中断的优先级,这样它就会抢占自己,但即使这样做有效,我也会犹豫是否推荐它。

听起来你真正需要的是一个实时操作系统。

票数 1
EN

Stack Overflow用户

发布于 2015-08-28 21:46:38

很抱歉让你失望了,但在我看来这是一个整体的设计问题…

为什么不在SysTick中设置一些标志并在其他地方读取它呢?

像这样:

代码语言:javascript
复制
#include <stdbool.h>

volatile bool flag = false; 
//Consider any form of atomicity here
//atomic_bool or LDREX/STREX instructions here. Bitbanding will also work


void sysTickHandler(void) {
  ticks++;
  if (f1_act || f2_act || f3_act) return;
  else {
    flag = true;  //or increment some counter if you want to keep track of the amount of executions
  }

还有其他地方:

代码语言:javascript
复制
int main() {
  // some init code

  //main loop
  for(;;) {

   foo();//do sth
   bar(x); //do sth else

    if (flag) {
      f1();
      f2();
      f3();
      flag = false;
    }
  }
}

或者,如果我们假设每个中断都会唤醒微控制器,并且需要断电模式,那么。像这样可能行得通:

代码语言:javascript
复制
if (flag) {
  f1();
  f2();
  f3();
  flag = false;
}
goToSleep(powerDownModeX); //whatever;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32272262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档