Какой стек используется после сброса в ARM Cortex-M, MSP или PSP? - PullRequest
0 голосов
/ 25 августа 2018

Я читал различные разделы в Информационном центре ARM, чтобы попытаться найти свой ответ, однако я пришел к тому, что документация смутила меня, поэтому я надеюсь, что кто-то здесь может помочь.

Iпонимать, что в процессорах Cortex-M есть два стека:

  • MSP (указатель основного стека)
  • PSP (указатель стека процессов)

I 'Я пытаюсь выяснить, как каждый из них используется ядром ARM.

Документация в Информационном центре ARM при обсуждении Cortex-M3 гласит следующее:

Основной стекиспользуется при сбросе и всегда используется в режиме обработчика (при вводе обработчика исключений).Указатель стека процессов доступен только в качестве текущего указателя стека в режиме Thread.

Хорошо, это говорит мне о том, что MSP используется при сбросе.Однако в документации также говорится следующее:

Режим потока

Используется для запуска прикладного программного обеспечения.Процессор переходит в режим Thread при выходе из сброса.

Режим обработчика

Используется для обработки исключений.Процессор возвращается в режим Thread, когда он завершил всю обработку исключений.

Хорошо, вот что меня смущает.Если MSP используется при сбросе и всегда используется в режиме обработчика, а PSP используется в режиме потока, то как можно использовать MSP при сбросе, если процессор находится в режиме потока при сбросе?

1 Ответ

0 голосов
/ 25 августа 2018

Простой ответ: ваш последний абзац неверен. В режиме потока по умолчанию используется MSP.

Вы не говорите, какой процессор используете, поэтому давайте предположим Cortex-M3.Ознакомьтесь с описанием регистра CONTROL внизу этой страницы : бит SPSEL контролирует, какой стек используется, по умолчанию используется MSP как для потокового режима, так и для режима обработчика, и доступен для записи только вРежим потока.

Кроме того, хотя это не было частью вашего вопроса, режим потока также является привилегированным по умолчанию.Установка бита nPRIV в том же регистре делает режим Thread непривилегированным.

В итоге: режим обработчика всегда является привилегированным и всегда использует MSP.По умолчанию то же самое верно для режима Thread, но регистр CONTROL позволяет это изменить.

Немного больше контекста ...

Если вынапример, когда писали небольшую операционную систему, было бы типично хотеть, чтобы код режима Thread был непривилегированным.Это также значительно упрощает переключение задач, если код режима потока использует PSP, потому что тогда код переключения задач, который неизбежно будет работать в режиме обработчика (обычно в обработчике PendSV на Cortex-M), может использовать свой собственный стек безвлияя на стеки задач, которые он пытается переключить.

Чтобы сделать это, код инициализации операционной системы обычно должен (в таком порядке):

  • Зарезервировать некоторое пространство длястек неиспользуемой задачи и используйте инструкцию MSR, чтобы заставить PSP указывать на вершину этого региона (это требует привилегий, но также должно выполняться в режиме потока, поскольку SPSEL игнорирует записи в режиме обработчика)
  • Используйте другую инструкцию MSR, чтобы установить бит SPSEL в регистре CONTROL, переключив рабочий код на использование PSP и только что подготовленное пространство стека
  • . Введите команду ISB, чтобы убедиться, чтовсе следующие инструкции используют PSP по мере необходимости
  • . Используйте MSR еще раз, чтобы установить бит nPRIV вРегистр CONTROL, немедленно удаляющий привилегию из режима Thread

Код режима работы Thread становится тогда задачей бездействия.

...