如何在STM32F103RB中使用HAL实现抢占式调度

时间:2019-04-25 06:45:35

标签: c arm embedded stm32

我编写了程序,该程序使用两个按钮和外部中断来打开每个LED。我想通过优先级使用抢占式调度。但我使用的HAL程序仅运行尾链中断mod。有没有办法实现抢占式调度?

int main(void) {
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();

  while (1) {
    if(flag_Sw1 == 1) {
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6,  GPIO_PIN_SET);
      flag_Sw1=0;
      HAL_Delay(200);
    } else if (flag_Sw2 == 1) {
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_SET);
      flag_Sw2=0;
      HAL_Delay(200);
    }
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);
  }
}

.
.
.
// in the MX_GPIO_Init(void)

  HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);

  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 1, 0);
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

.
.
.

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_PIN) {
    if(GPIO_PIN == GPIO_PIN_8) {
        flag_Sw1 = 1;
        flag_Sw2 = 0;
    }
    else if(GPIO_PIN == GPIO_PIN_13) {
        flag_Sw1 = 0;
        flag_Sw2 = 1;
    }
}

2 个答案:

答案 0 :(得分:0)

如果您看到的是尾链而不是抢占,则可能未按预期配置NVIC优先级分组-因此将两个中断配置为优先级组0和1不会对中断抢占产生影响。

答案 1 :(得分:0)

最简单的方法是使用STM CUBE支持的freeROS。编写调度程序只是工作的一部分。您还需要同步机制