You are here

Поддержка модуля защиты памяти (MPU)

Перевод может содержать ошибки. Читайте первоисточник: Memory Protection Unit (MPU) Support

Назад: [Более подробно...] Вверх: [Более подробно...] Вперёд: [Более подробно...]

 

FreeRTOS-MPU

В дистрибутив FreeRTOS включены два отличающихся порта для микроконтроллеров на базе ARM Cortex-M3 и два для МК на базе ARM Cortex-M4. Отличия заключаются в поддержке защиты памяти. Один порт стандартный, а второй использует FreeRTOS-MPU.

Использование модуля защиты памяти (MPU) может защитить приложение от ряда потенциально возможных ошибок, начиная с невыявленных ошибок программирования, и заканчивая системными и аппаратными сбоями. FreeRTOS-MPU может быть использован для защиты самого ядра ОС от недопустимых действий задач и для защиты данных от повреждения. Он также может защитить системные периферийные устройства от непреднамеренного изменения задачами и гарантирует обнаружение переполнения стека задач.

Издание FreeRTOS eBook для LPC17xx содержит главу, посвящённую использованию FreeRTOS-MPU. Демонстрационный проект находится в каталоге FreeRTOS/Demo/CORTEX_MPU_Simulator_Keil_GCC. Он использует для сборки и симуляции либо Keil uVision, либо GCC, и предоставляет работающий пример.

Примечание: демонстрационные проекты для FreeRTOS-MPU, расположенные в каталогах FreeRTOS/Demo/CORTEX_MPU_LPC1768_GCC_RedSuite и FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley, были удалены из дистрибутива FreeRTOS начиная с версии v9.0.0.

 

Особенности FreeRTOS-MPU

  • Совместимы со стандартными портами для микроконтроллеров на базе ARM Cortex-M3 и Cortex-M4F.
  • Задачи могут быть созданы для запуска либо в привилегированном, либо в пользовательском режиме. В пользовательском режиме задачи имеют доступ только к своему стеку и максимум к трём настраиваемым регионам памяти (по три на каждую задачу). Определяемые пользователем регионы назначаются задачам в момент создания задач, и могут быть переконфигурированы во время выполнения, если возникнет такая необходимость.
  • Определяемые пользователем регионы памяти могут быть настроены индивидуально. Например, некоторые регионы могут быть доступны только для чтения, в то время как другие могут быть настроены для запрета выполнения (execute never, или просто XN, в терминологии ARM), и т.д..
  • По-умолчанию память данных не может быть общей для задач в пользовательском режиме, но задачи в пользовательском режиме могут передавать друг другу сообщения, используя стандартные механизмы очередей и семафоров. Есть возможность явно указать общую память с помощью определяемых пользователем регионов памяти, но этот способ использовать не рекомендуется.
  • Задачи могут самостоятельно переключаться из привилегированного режима в пользовательский, но перевести себя обратно из пользовательского в привилегированный задачи не могут.
  • Функции API FreeRTOS расположены в области flash-памяти, которая доступна микроконтроллеру только в привилегированном режиме (вызов функций API вызывает временное переключение в привилегированный режим).
  • Данные, поддерживаемые ядром ОС (все данные, не относящиеся к стеку, которые являются приватными для исходных файлов FreeRTOS), располагаются в регионе ОЗУ, доступ к которому возможен только когда микроконтроллер находится в привилегированном режиме.
  • Доступ к системным периферийным устройствам возможен только когда микроконтроллер находится в привилегированном режиме. Стандартные периферийные устройства (UART и т.п.) доступны из любого кода, но могут быть явно защищены с помощью определяемых пользователей регионов памяти.

 

Создание защищённых (ограниченных) задач

Задачи, не использующие MPU могут создаваться с использованием стандартной функции API xTaskCreate(). Создаваемые задачи могут выполняться либо в привилегированном, либо в пользовательском режиме. В привилегированном режиме задача имеет доступ ко всей карте памяти, а в пользовательском режиме только к своему собственному стеку. В обоих случаях MPU не будет автоматически контролировать переполнение стека, хотя стандартные способы определения переполнения стека по прежнему можно использовать. Дополнительную информацию можно найти в документации по функции API xTaskCreate().

Если задача хочет использовать MPU, необходимо предоставить дополнительную информацию:

  • Адрес стека задачи.
  • Начало, размер и параметры доступа для пользовательских регионов памяти (до трёх на каждую задачу).

Таким образом, общее количество параметров, необходимое для создания задачи, весьма велико. Для упрощения создания  задачи с поддержкой FreeRTOS-MPU используется вызов xTaskCreateRestricted(). Это позволяет определить все параметры, кроме одного, в константной структуре, и передать её по ссылке в xTaskCreateRestricted() как один параметр.

Задачи, создаваемые с помощью xTaskCreateRestricted() также могут быть созданы для запуска либо в привилегированном, либо в пользовательском режиме - но на этот раз в пользовательском режиме задачи имеют доступ не только к своему стеку, но и к определяемым пользователем регионам памяти. Задача, запущенная в привилегированном режиме может вызвать portSWITCH_TO_USER_MODE() для переключения в пользовательский режим. Задача, запущенная в пользовательском режиме не может переключить себя в привилегированный режим.

Области памяти, выделенные задаче могут быть изменены с помощью vTaskAllocateMPURegions(). Смотрите дополнительную информацию в документации на функции API xTaskCreateRestricted() и vTaskAllocateMPURegions().

 

Допольнительная информация и более подробное обучение

Редакция FreeRTOS eBook для LPC17xx содержит главу об использовании FreeRTOS-MPU.

Ещё один способ подробнее изучить FreeRTOS-MPU - внимательно изучить демонстрационный проект FreeRTOS-MPU и вникнуть в подробные комментарии, приведённые в исходных кодах проекта. Этот проект находится в каталоге FreeRTOS/Demo/CORTEX_MPU_Simulator_Keil_GCC в дистрибутиве FreeRTOS. Демонстрационный проект собирается с помощью GCC, и использует IDE и симулятор Keil uVision.

Hobby's category: