簡體   English   中英

Cortex-M4中的SysTick異常可以自己取代嗎?

[英]Can a SysTick exception in Cortex-M4 preempt itself?

我有一個SysTick異常處理程序,該處理程序對滴答進行計數並調用其他函數(f1,f2,f3),其執行時間可能比SysTick周期長。 這些函數設置並清除其活動狀態(全局變量),因此,如果發生SysTick異常,它可以檢測到過載並返回中斷的函數。

我為SysTick異常分配了固定的優先級(假設16)。 我想以某種方式使SysTick生成一個異常,而不管它的先前活動狀態如何,請轉到SysTickHandler,增加滴答計數器,然后返回中斷的功能。

一種可能有用的解決方案是使用BASEPRI。 可以將其設置為低於SysTick的優先級,以便啟用該異常。 不幸的是,使用BASEPRI令我無所適從,因為什么也沒發生(我將其設置為最大值)。 在更改之前,SysTickHandler中的BASEPRI值為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();
    }
}

對於此問題(沒有返回值)的一個更簡單的示例將是,在處理程序內部具有無限循環時增加刻度計數器。

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

如果中斷在其處理程序已經運行時變為掛起狀態,則處理程序將運行至完成並立即重新進入。 您的滴答聲將是非周期性的,並且如果函數持續花費一個滴答周期更長的時間,則您可能永遠不會離開中斷上下文。

我想可能會增加處理程序中中斷的優先級,以便它可以搶占自己,但是即使該方法起作用了,我也會猶豫地推薦它。

聽起來您真正需要的是RTOS。

抱歉讓您失望,但對我來說似乎是一個整體設計問題。

您為什么不只在SysTick中設置一些標志並在其他地方讀取它?

喜歡:

#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
  }

還有其他地方:

int main() {
  // some init code

  //main loop
  for(;;) {

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

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

或者,如果我們假設每個中斷都會喚醒微控制器,並且需要掉電模式,那么……。 這樣可能有效:

if (flag) {
  f1();
  f2();
  f3();
  flag = false;
}
goToSleep(powerDownModeX); //whatever;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM