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

Partition Memory в Nucleus SE: Конфигурация, API и лучшие практики

Partition Memory в Nucleus SE: Конфигурация, API и лучшие практики View the RTOS Revealed series

Memory partitions были впервые представлены в нашей предыдущей статье, где мы сравнили их с конвенциональной C функцией malloc(). Партиция — это фиксированного размера блок памяти, исходящий из partition pool, предлагающий детерминированное аллоцирование и деаллоцирование, на которое задачи могут полагаться.

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

В Nucleus SE partition pools определяются на compile time. До 16 пулов может быть сконфигурировано на приложение. Если пулы не определены, все связанные структуры данных и API код опускаются из сборки, держа footprint минимальным.

Пул — просто непрерывная область памяти, разделенная на заданное число идентичных партиций. Приложение контролирует размер и счет каждого пула. Задачи запрашивают партицию и получают указатель на блок. Ответственность вызывающего — оставаться в пределах аллоцированных границ. Партиция может быть возвращена в пул любой задачей через deallocate API. Если пул исчерпан, вызов может вернуть ошибку или приостановить задачу, в зависимости от параметров API и build опций.

Конфигурация Memory Partitions

Количество Partition Pools

Partition pools включаются через #define директивы в nuse_config.h. Ключевой символ — NUSE_PARTITION_POOL_NUMBER, задающий счет пулов. Дефолт 0, означающий нет активных пулов. Валидные значения от 1 до 16; недействительное значение триггерит compile-time #error, генерируемый nuse_config_check.h.

Установка ненулевого значения активирует необходимые структуры данных и инициализирует их в ROM. Оно также разблокирует API enable символы, описанные ниже.

API Enables

У каждого service call есть enable макрос в nuse_config.h. Для партиций существуют следующие символы:

По умолчанию все установлены в FALSE, вырезая реализацию из сборки. Для использования фичи установите соответствующий макрос в TRUE. Включение API пока пулы не определены (кроме NUSE_Partition_Pool_Count()) приводит к compile-time ошибке. Использование API, которое не включено, вызывает link-time ошибку.

Partition Memory в Nucleus SE: Конфигурация, API и лучшие практики

Partition Pool Service Calls

Nucleus RTOS предлагает семь service calls для partition pools. В Nucleus SE реализованы только core allocation и deallocation APIs. Таблица ниже перечисляет каждый вызов, статус реализации и краткое описание:

APIImplementationDescription
NU_Allocate_Partition()ImplementedAllocate a partition.
NU_Deallocate_Partition()ImplementedFree a partition.
NU_Partition_Pool_Information()ImplementedRetrieve pool metadata.
NU_Established_Partition_Pools()ImplementedCount active pools.
NU_Create_Partition_Pool()Not implementedDynamic pool creation.
NU_Delete_Partition_Pool()Not implementedDynamic pool deletion.
NU_Partition_Pool_Pointers()Not implementedReturn pool pointers.

Заметьте, что ни Nucleus RTOS ни SE не предоставляют reset рутину для partition pools. Этот дизайнерский выбор отражает типичные use cases, где задача аллоцирует партицию и передает её указатель другой задаче, которая в конечном счете деаллоцирует её. Сброс пула молча помечал бы все партиции как свободные, нарушая task-level контракт.

Allocation и Deallocation Services

Основные операции:

Nucleus RTOS Allocation API

Прототип:

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

Возвращаемые значения включают NU_SUCCESS, NU_NO_PARTITION, NU_INVALID_POOL, NU_INVALID_POINTER, NU_INVALID_SUSPEND, NU_TIMEOUT и NU_POOL_DELETED.

Nucleus SE Allocation API

Прототип:

STATUS NUSE_Partition_Allocate(NUSE_PARTITION_POOL pool, ADDR *return_pointer, U8 suspend); 

Параметры:

Коды возврата зеркалят RTOS но с префиксом NUSE_. Невалидные suspend запросы из non-task тредов или когда blocking APIs отключены производят NUSE_INVALID_SUSPEND.

Для полного walkthrough реализации смотрите последующие статьи в серии RTOS Revealed.

Встроенный

  1. Нержавеющая сталь: состав, производство и глобальное влияние
  2. Основы цифровой памяти: адресация, доступ и волатильность
  3. Основы ввода-вывода в C#: Console.WriteLine, ReadLine и форматирование
  4. Управление памятью в C++: экспертное использование new и delete
  5. Mailboxes в Nucleus SE: Практическое руководство по конфигурации и использованию
  6. Семафоры в Nucleus RTOS: Утилитарные сервисы и структуры данных
  7. Семафоры в Nucleus SE: Обзор, конфигурация и основы API
  8. Event Flag Groups в Nucleus SE: Вводное руководство по конфигурации и использованию API
  9. Queues в Nucleus SE: Введение и основные Service Calls
  10. Rutronik становится эксклюзивным европейским дистрибьютором IoT RAM от AP Memory по глобальному соглашению