Главная » Статьи » Секреты Cortex-M3 – режимы работы ядра

Секреты Cortex-M3 – режимы работы ядра

Ядро Cortex-M3 может работать в режиме нормального выполнения программы (режим Thread — TM) или обслуживания прерываний (режим Handler — HM). Это различие имеет решающее значение для приложений написанных на основе операционных систем.

Кроме того, различают два уровня с разными правами доступа к ключевым областям адресного пространства:

  • привилегированный режим (Privileged Level – RU),
  • пользовательский режим (Unpriviledged/User Level – UL).

Рис. 1. Иллюстрация режимов работы ядра Cortex-M3

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

Рис. 2. Микроконтроллер, работающий с прерыванием, всегда работает в привилегированном режиме (PL)

При работе с прерыванием микроконтроллер всегда работает в привилегированном (PL) режиме, даже если пользовательский режим (UL) установлен во время нормального выполнения программы.

Это соотношение показано на рис. 2, а на рис. 3 показана работа микроконтроллера с включенным режимом пользователя. Здесь видно, что ядро ​​Cortex-M3, работающее в режиме UL, при входе в службу прерываний переключается в режим PL, а при завершении службы прерываний возвращается в привилегированный (пользовательский) режим.

Рис. 3. Работа микроконтроллера в активном пользовательском режиме

Этот механизм повышает стабильность микропроцессорной системы, поскольку приложение пользователя, которое по своей природе с большей вероятностью генерирует ошибочное поведение, имеет ограниченный доступ к ключевым ресурсам (например, NVIC и SysTick) и, таким образом, не может напрямую повлиять на стабильность микроконтроллера. После старта микроконтроллер всегда запускается в привилегированном режиме.

Переход из режима пользователя в привилегированный режим невозможен напрямую. Приложение, работающее в операционной системе, не может отключить пользовательский режим, поскольку оно не имеет доступа к специальному управляющему регистру CONTROL. Запись в него с уровня приложения игнорируется. Изменения могут быть сделаны только во время обслуживания прерывания, которое осуществляется в режиме полной авторизации — PL. Внешний вид всего регистра CONTROL (со значениями по умолчанию показан на рис. 4.

Рис. 4. Строение регистра CONTROL

Операционная система, которая занимается переключением контекстов задач и контролирует правильную работу всей системы, может изменять (работая в прерываниях) статус разрешений. Другими словами, чтобы перейти в привилегированный (PL) режим выполнения программы, вам необходимо изменить настройки специального регистра управления CONTROL в функции обработки прерываний, то есть сбросить младший бит.

Стек

Стек — это физически область памяти, к которой обращается специальный регистр индикатора. Информация в стеке вводится в режиме LIFO (Last In First Out), это означает, что для чтения скрытых данных сначала необходимо загрузить новые данные из стека (рис. 5).

Рис. 5. Стековая адресация с использованием регистра R13

Доступ к стеку осуществляется с помощью команд удаления (POP) и вставки (PUSH) в стеке. После каждой операции PUSH регистр указателя (в случае ядра Cortex это регистр R13) уменьшается, то есть указывает на младший адрес. Аналогично, операция POP увеличивает регистр указателя стека. Микроконтроллеры STM32 являются 32-битными, поэтому стек увеличивается (или уменьшается) всегда на 4.

Оставить комментарий

Ваш email нигде не будет показанОбязательные для заполнения поля помечены *

*