Перевод может содержать ошибки. Читайте первоисточник: Memory Protection Unit (MPU) Support
Назад: [Более подробно...] | Вверх: [Более подробно...] | Вперёд: [Более подробно...] |
В дистрибутив 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.
Задачи, не использующие 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.