Как войти в режим супервизора на ARM Cortex m4, чтобы отключить прерывания?

Я пытаюсь выяснить, как я могу отключить и включить прерывания на STM32L4x6RG Nucleo?

Немного погуглив, я нашел макросы __disble_irq() и __enable_irq(), но я не уверен, что они отключают прерывания.

После дополнительных исследований оказалось, что инструкция cpsid, на которую сопоставляется этот макрос, действует только тогда, когда она выполняется в контексте супервизора. Таким образом, возникает вопрос, как мне перейти в режим супервизора, чтобы отключить прерывания и обратно??


person err    schedule 22.11.2017    source источник
comment
Почему нет? Какая часть документации вызывает у вас сомнения. Эти макросы как раз и являются частью CMSIS - советую прочитать документацию на сайте ARM вместо того, чтобы убеждаться или нет.   -  person 0___________    schedule 22.11.2017
comment
PS гуглить, когда пытаешься что-то сделать с ARM uC - не самый лучший способ. Интернет полон мифов - лучше прочтите официальную документацию, она неплохая.   -  person 0___________    schedule 22.11.2017
comment
Вам нужно сделать вызов SVC, чтобы войти в привилегированный режим. Затем в обработчике SVC вы можете перейти в привилегированный режим, изменив бит 0 регистра управления. Погуглите, в сети много про это.   -  person Realtime Rik    schedule 22.11.2017


Ответы (2)


Процессор загружается в привилегированном режиме, поэтому, если вы не запускаете свое приложение поверх операционной системы или сами не переключились в непривилегированный режим, вы уже должны быть в привилегированном режиме. Если вы запускаете приложение поверх ОС, вы должны использовать ее службы для обработки прерываний, и если такой службы не существует, вы должны оставить прерывания в покое.

Если вы сами переключились в непривилегированный режим, вы можете использовать инструкцию svc для запуска исключения svc, а обработчик исключения выполняется в привилегированном режиме.

person Johan    schedule 22.11.2017
comment
Я не использую операционную систему, я использую вызовы библиотеки низкого уровня (LL). Итак, предположительно, процессор находится в привилегированном режиме, если загрузочный код ST не устанавливает его в непривилегированный? - person err; 23.11.2017
comment
@err Нет загрузочного кода ST, который переводил бы процессор в непривилегированный режим. Вы пытаетесь решить проблему, которой не существует. - person followed Monica to Codidact; 23.11.2017

Я нашел макросы __disble_irq() и __enable_irq(), но я не уверен, что они отключают прерывания.

Да, если только вы (или используемая вами ОС) явным образом не оставите привилегированный режим с MSR control, Rn или функцию __set_CONTROL(), которая делает то же самое.

Таким образом, возникает вопрос, как мне перейти в режим супервизора, чтобы отключить прерывания и обратно??

Процессор находится в привилегированном режиме после сброса и остается в нем, пока вы не укажете иное. Он также временно входит в привилегированный режим при выполнении обработчика исключений.

Чтобы вызвать обработчик исключений SVC из кода пользователя и запустить некоторый код в привилегированном режиме. Однако существует проблема, заключающаяся в том, что вызов обработчика SVC также будет заблокирован __disable_irq(), поэтому впоследствии не будет возможности повторно включить их. Вместо __disable_irq() можно настроить BASEPRI регистр для выборочного отключения прерываний с более низким приоритетом и установки более высокого приоритета SVC, чтобы он не блокировался.

person followed Monica to Codidact    schedule 22.11.2017