Как изменить приоритет исключения на процессоре cortex-m4 в Rust?

Я хочу установить приоритеты прерываний для внутренних исключений процессора. Крейт cortex_m обеспечивает легкий доступ к регистрам управления NVIC. В частности, есть метод, позволяющий установить приоритет для каждого прерывания.

let mut p = cortex_m::Peripherals::take().unwrap();
p.NVIC.set_priority(...);

set_priority просит меня передать аргумент, указывающий, для какого прерывания я намерен изменить приоритет. Скажем, я хочу изменить приоритет для PendSV. Однако передача cortex_m::peripheral::scb::Exception::PendSV не будет работать, потому что она не реализует требуемую привязку типажа.

Я разрабатываю на плате STM32F407VGT6, поэтому я также заглянул в крейт stm32f4, но не нашел никакого определения enum, которое могло бы помочь.

Должен ли я написать свой собственный enum, который реализует необходимый трейт, чтобы он мог указывать номера прерываний, или уже есть какой-то существующий крейт, который может заставить его работать?


person Zhiyao    schedule 13.01.2021    source источник


Ответы (1)


Согласно документации InterruptNumber, реализация за эту черту отвечает поставщик PAC (устройства доступа к периферийным устройствам). Глядя на ящик stm32f4, его последний выпуск (0.12.1 на момент написания) все еще зависит от cortex-m >=0.5.8, <0.7, а это означает, что разработчики, вероятно, еще не обновились до нового API.

В старом API используется трейт bare_metal::Nr, на который до сих пор полагаются несколько PAC.

Я нашел пример в cortex-m- краткое руководство, в котором используется старый NVIC API.

Я рекомендую вам следовать требованиям зависимостей вашего PAC и перейти на cortex-m >=0.5.8, <0.7 и следить за обновлениями до stm32f4.

person ChiefGokhlayeh    schedule 14.01.2021
comment
Я не вижу определений прерываний, генерируемых процессором, в stm32f4. В настоящее время он определяет только внешние прерывания. Это правильно? - person Zhiyao; 14.01.2021
comment
Да, вы правы, я пропустил это. PendSV является исключением, и они являются общими для всех устройств cortex-m. В Руководстве пользователя ARM Cortex-M также указано, что исключениями с настраиваемыми приоритетами можно управлять через NVIC. Это может быть просто недосмотр в текущем дизайне API. Вы можете попробовать реализовать трейт Nr самостоятельно. - person ChiefGokhlayeh; 14.01.2021
comment
Вам также может быть интересно это обсуждение github.com/rust-embedded/ cortex-m-rt/issues/44. Хотя он довольно старый, в нем говорится, что исключения должны быть настроены напрямую через SCB API. - person ChiefGokhlayeh; 14.01.2021