Top.Mail.Ru
Уведомления
Очистить все

[Решено] HAL_Delay() зависает в прерывании

Warhammer
(@warhammer)
Level 1

И снова здравствуйте!

Заметил такую вещь - иногда при использовании HAL_Delay() внутри обработчика прерывания программа намертво зависает, то есть не выходит из функции никогда... С чем это может быть связано? Причем повторяется не всегда, систему не смог выявить...

Цитата
Создатель темы Размещено : 24.07.2021 21:34
Raf
 Raf
(@raf)
Level 4

HAL_Delay() проверяет значение uwTick, а это значение инкрементируется в прерывании SysTick.

Поэтому выходит так, что в прерывании программа останавливается на проверке uwTick, а это значение не меняется, так как программа не уходит в прерывание по SysTick. Странно, что иногда это срабатывает 🙄 

ОтветитьЦитата
Размещено : 24.07.2021 23:28
Aveal
(@aveal)
Top level Admin

Срабатывает, если прерывание, из которого вызывается HAL_Delay(), по приоритету ниже прерывания SysTick. А так в целом @Raf все верно объяснил.

ОтветитьЦитата
Размещено : 25.07.2021 12:09
Warhammer
(@warhammer)
Level 1
От: @aveal

Срабатывает, если прерывание, из которого вызывается HAL_Delay(), по приоритету ниже прерывания SysTick. А так в целом @Raf все верно объяснил.

Поигрался с приоритетами прерываний... Да, именно так дело и обстоит. Получается надо у всех прерываний делать приоритет ниже, чем у SysTick?

 

ОтветитьЦитата
Создатель темы Размещено : 25.07.2021 19:59
Aveal
(@aveal)
Top level Admin
От: @warhammer

Поигрался с приоритетами прерываний... Да, именно так дело и обстоит. Получается надо у всех прерываний делать приоритет ниже, чем у SysTick?

С точки зрения HAL_Delay() - да, именно так. Глобально - лучше архитектуру программы выстраивать так, чтобы в прерывании проводить минимум времени, тем более не использовать такие вот задержки.

ОтветитьЦитата
Размещено : 29.07.2021 11:14
Warhammer
(@warhammer)
Level 1

@aveal да, Вы правы... Буду пересматривать логику работы, спасибо)

ОтветитьЦитата
Создатель темы Размещено : 29.07.2021 12:03
Поделиться: