Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial Internet of Things >> Встроенный

Разделение памяти - введение и основные услуги


Посмотреть серию раскрытых ОСРВ

Разделы памяти были представлены в предыдущей статье, где проводится сравнение со стандартным C malloc () функция была сделана. Раздел - это область памяти, полученная из пула разделов. Это предлагает гибкие средства для задач по получению и освобождению хранилища данных детерминированным и надежным образом.

Использование разделов

В Nucleus SE пулы разделов настраиваются во время сборки. Для приложения может быть настроено не более 16 пулов разделов. Если пулы разделов не настроены, в приложение не будут включены структуры данных или код вызова службы, относящиеся к пулам разделов.

Пул разделов - это просто область памяти, которая разделена на определенное количество разделов фиксированного размера. Пользователь полностью контролирует размер и количество разделов в каждом пуле. Задачи могут запрашивать выделение разделов памяти и получать указатель на область хранения. Задача состоит в том, чтобы не записывать данные за пределы раздела. Раздел может быть освобожден любой задачей, передав указатель на функцию API. Запрос на выделение раздела, когда он больше недоступен, может привести к ошибке или приостановке задачи, в зависимости от параметров, выбранных в вызове API, и конфигурации Nucleus SE.

Настройка разделов памяти

Количество пулов разделов

Как и в большинстве аспектов Nucleus SE, конфигурация пулов разделов в основном контролируется #define операторы в nuse_config.h . Ключевой параметр: NUSE_PARTITION_POOL_NUMBER . , который определяет, сколько пулов разделов настроено для приложения. Значение по умолчанию - 0 (т. Е. Пулы разделов не используются), и вы можете установить для него любое значение до 16. Ошибочное значение приведет к ошибке времени компиляции, которая генерируется тестом в nuse_config_check.h (он включен в nuse_config.c и, следовательно, скомпилирован с этим модулем), что приводит к ошибке #error выписка составляется.

Выбор ненулевого значения является «основным включением» для пулов разделов. Это приводит к тому, что некоторые структуры данных определяются и имеют соответствующий размер. Структуры данных в ПЗУ требуют инициализации подходящими значениями, которые характеризуют каждый пул разделов. Подробнее о структурах данных в следующей статье. Он также активирует настройки включения API.

Включает API

Каждая функция API (вызов службы) в Nucleus SE имеет разрешающий #define символ в nuse_config.h . Для пулов разделов это:

NUSE_PARTITION_ALLOCATE

NUSE_PARTITION_DEALLOCATE

NUSE_PARTITION_POOL_INFORMATION

NUSE_PARTITION_POOL_COUNT

По умолчанию все они имеют значение FALSE . , таким образом отключая каждый вызов службы и запрещая включение любого кода реализации. Чтобы настроить пулы разделов для приложения, вам необходимо выбрать вызовы API, которые вы хотите использовать, и установить для их символов включения значение ИСТИНА . .

Вот выдержка из файла nuse_config.h по умолчанию файл:

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

Вызовы службы пула разделов

Nucleus RTOS поддерживает семь вызовов служб, которые относятся к пулам разделов, которые обеспечивают следующие функции:

Подробно рассматривается реализация каждого из этих сервисных вызовов.

Следует отметить, что функция сброса не предусмотрена (ни в Nucleus RTOS, ни в Nucleus SE). Это сделано намеренно. Очень распространена практика, когда одна задача выделяет раздел и передает указатель на другую задачу (которая, вероятно, освободит его позже). Если бы пул разделов был сброшен, все разделы были бы помечены как неиспользуемые, но нет средств отслеживания и уведомления всех задач, которые могут использовать разделы.

Услуги по размещению и освобождению разделов

Основные операции, которые могут быть выполнены с пулом разделов, - это выделение раздела (т. Е. Пометка раздела как используемого и возврат его адреса) из него и освобождение раздела (т. Е. Пометка раздела как неиспользуемого). Nucleus RTOS и Nucleus SE предоставляют по два основных вызова API для этих операций, которые будут обсуждаться здесь.

Размещение раздела

Вызов Nucleus RTOS API для выделения раздела очень гибок, позволяя приостанавливать работу на неопределенный срок или с тайм-аутом, если операция не может быть завершена немедленно; то есть вы пытаетесь выделить раздел из пула, в котором в настоящее время размещены все разделы. Nucleus SE предоставляет ту же услугу, за исключением того, что приостановка задачи является необязательной, а тайм-аут не реализуется.

Вызов API Nucleus RTOS для распределения раздела

Прототип сервисного вызова:

STATUS NU_Allocate_Partition (NU_PARTITION_POOL * pool,
VOID ** return_pointer, UNSIGNED suspend);

Возврат:

NU_SUCCESS - звонок был успешно завершен

NU_NO_PARTITION - нет доступных разделов

NU_INVALID_POOL - указатель пула разделов недействителен

NU_INVALID_POINTER - указатель возврата данных равен NULL

NU_INVALID_SUSPEND - приостановка была предпринята из потока, не связанного с задачей

NU_TIMEOUT - ни один раздел недоступен даже после приостановки на указанный период времени

NU_POOL_DELETED - пул разделов удален при приостановке задачи

Вызов Nucleus SE API для распределения

Этот вызов API поддерживает ключевые функции Nucleus RTOS API.

Прототип сервисного вызова:

STATUS NUSE_Partition_Allocate (пул NUSE_PARTITION_POOL, ADDR * return_pointer, приостановка U8);

Параметры:

бассейн - индекс (ID) используемого пула разделов

return_pointer - указатель на переменную типа ADDR который получит адрес выделенного раздела

приостановить - спецификация приостановки задания; может быть NUSE_NO_SUSPEND или NUSE_SUSPEND

Возврат:

NUSE_SUCCESS - звонок был успешно завершен

NUSE_NO_PARTITION - нет доступных разделов

NUSE_INVALID_POOL - неверный индекс пула разделов

NUSE_INVALID_POINTER - указатель возврата данных равен NULL

NUSE_INVALID_SUSPEND - приостановка была предпринята из потока, не связанного с задачей, или когда блокирование вызовов API не было включено


Встроенный

  1. Знакомство с нержавеющей сталью и ее производством
  2. Термины и концепции цифровой памяти
  3. Базовый ввод и вывод C#
  4. Управление памятью C++:создание и удаление
  5. Почтовые ящики:введение и основные услуги
  6. Семафоры:служебные службы и структуры данных
  7. Семафоры:введение и базовые услуги
  8. Группы флагов событий:введение и базовые услуги
  9. Очереди:введение и базовые услуги
  10. Rutronik и AP Memory подписывают глобальное дистрибьюторское соглашение