понедельник, 20 августа 2012
Как вам должно быть уже известно, Cortex-M4 имеет два режима работы, в отличие от старых версий архитектуры, где оных режимов штук семь:
Thread Mode, то есть режим для обычного кода. Уровень привелегий может быть урезан для исключения доступа к особо важным регистрам.
Handler Mode, который включается в прерываниях и исключениях. Этот режим привелегированный по умолчанию. То есть имеет доступ ко всему, чему угодно.
читать дальшеДля контроля таких вещей есть системный регистр CONTROL. Он содержит три управляющих бита, но бита важных:
Бит 0: nPRIV, уровень привелегий у Thread Mode. 1 - непривелигерованный, 0 - привелигерованный.
Бит 1: SPSEL, выбор указателя стека для Thread Mode. 0 - MSP (Main SP), 1 - PSP (Process SP). В Handler Mode регистр ВСЕГДА будет переключаться на MSP, вне зависимости от настройки данного бита. В том и фишка.
Бит 2: FPCA, включение контекста FPU. То есть будет ли он сохраняться в стеке при исключениях.
Для надёжности, что будет использоваться прям вот новый стек, лучше всего сразу после изменения указателя стека выполнить инструкцию ISB, которая сбросит линию выполнения процессора и все выборки там начнутся заново, с заведомо верным SP. Хотя, если там будет много операций без использования стека, то это не потребуется.
Инструкция MSR (MRS) даёт доступ к системным регистрам. Регистров этих достаточно много: APSR, IPSR, EPSR, IEPSR, IAPSR, EAPSR, PSR, MSP, PSP, PRIMASK, BASEPRI, BASEPRI_MAX, FAULTMASK и CONTROL.
Нам пока понадобятся только два из них:
CONTROL для настройки;
PSP для смены указателя стека при переключении процессов.
Замечу интересный неочевидный момент. Возвращайтесь из прерываний всегда по тому коду, который даёт вам LR. А не по какому вы высмотрели в таблице. Это логично - если процессор сохранит, например, состояние FPU-регистров, но не загрузит их по выходу, потеряется дофига места на стеке. Несколько таких операций и указатель неизвестно куда улетит!
С этим, в общем, всё.
Теперь загрузка указателя стека, например, будет выглядеть так:
Ну и типа того.
Интересное:
nyaos_core.s
system.sПроект.
<< Предыдущее Следующее >>
@темы:
arm,
программизмы,
электроника,
ассемблер,
stm32f4discovery,
stm32