Простой ответ: ваш последний абзац неверен. В режиме потока по умолчанию используется 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 становится тогда задачей бездействия.