Изучаем работу приоритетов прерывания

Страница на этапе разработки

В данном уроке мы рассмотрим работу приоритетов прерываний. Мы специально напишем такой код, где два прерывания который имеют одинаковые приоритеты сработают одновременно. Как следствие у нас зависнет программный код.  Мы изменим приоритеты по прерыванию и у нас код перестанет зависать.
Данный программный код не корректный, мы его используем только для изучения работы приоритетов прерывания.
У нас будет два светодиода, один будет быстро моргать в основном коде, а второй включаться на одну секунду в прерывании при нажатии кнопки:

/* USER CODE BEGIN 0 */
  void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin){
  HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin, GPIO_PIN_SET);
  HAL_Delay(1000);
  HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);
}
/* USER CODE END 0 */ 
 
 
/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
HAL_Delay(250);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
HAL_Delay(250);
  /* USER CODE END 3 */

Запустив данный код, мы увидим, что при нажатии кнопки наш программный код зависает. Зависание происходит из за того, что HAL_Delay() который находится внутри прерывания ждет пока увеличится системный тик uwTick (обычно из SysTick IRQ). Но для этого мы должны выйти с нашего прерывания и тогда заработает прерывание для функции HAL_Delay(). В итоге мы не можем выйти с прерывания по нажатой кнопке так как нам нужно, что бы отработало прерывание по системному таймеру. Для исправления данной ситуации нам нужно понизить приоритет прерывания по ножке, что бы прерывание по системному таймеру было в приоритете:

 HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); // SysTick
HAL_NVIC_SetPriority(EXTI2_3_IRQn, 1, 0); // EXTI < SysTick
HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);

Конечно, изменить приоритет можно и в CubeMX при создании проекта, тут уже кому как удобно.
Добавим уровни приоритетов в нашу программу и запустив ее, мы видим, что зависания нет, все работает.  
Как вывод можно сказать, что упустив настройки уровней приоритета даже самая правильно написанная программа может зависнуть или дать сбой. 

SVG to HTML/CSS