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

Partition Pool Service Calls
Nucleus RTOS предлагает семь service calls для partition pools. В Nucleus SE реализованы только core allocation и deallocation APIs. Таблица ниже перечисляет каждый вызов, статус реализации и краткое описание:
| API | Implementation | Description |
|---|---|---|
NU_Allocate_Partition() | Implemented | Allocate a partition. |
NU_Deallocate_Partition() | Implemented | Free a partition. |
NU_Partition_Pool_Information() | Implemented | Retrieve pool metadata. |
NU_Established_Partition_Pools() | Implemented | Count active pools. |
NU_Create_Partition_Pool() | Not implemented | Dynamic pool creation. |
NU_Delete_Partition_Pool() | Not implemented | Dynamic pool deletion. |
NU_Partition_Pool_Pointers() | Not implemented | Return pool pointers. |
Заметьте, что ни Nucleus RTOS ни SE не предоставляют reset рутину для partition pools. Этот дизайнерский выбор отражает типичные use cases, где задача аллоцирует партицию и передает её указатель другой задаче, которая в конечном счете деаллоцирует её. Сброс пула молча помечал бы все партиции как свободные, нарушая task-level контракт.
Allocation и Deallocation Services
Основные операции:
- Allocate: пометить партицию как используемую и вернуть её адрес.
- Deallocate: пометить партицию как свободную.
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);
Параметры:
pool— индекс пула для использования.return_pointer— адрес аллоцированного блока.suspend—NUSE_NO_SUSPENDилиNUSE_SUSPEND.
Коды возврата зеркалят RTOS но с префиксом NUSE_. Невалидные suspend запросы из non-task тредов или когда blocking APIs отключены производят NUSE_INVALID_SUSPEND.
Для полного walkthrough реализации смотрите последующие статьи в серии RTOS Revealed.
Встроенный
- Нержавеющая сталь: состав, производство и глобальное влияние
- Основы цифровой памяти: адресация, доступ и волатильность
- Основы ввода-вывода в C#: Console.WriteLine, ReadLine и форматирование
- Управление памятью в C++: экспертное использование new и delete
- Mailboxes в Nucleus SE: Практическое руководство по конфигурации и использованию
- Семафоры в Nucleus RTOS: Утилитарные сервисы и структуры данных
- Семафоры в Nucleus SE: Обзор, конфигурация и основы API
- Event Flag Groups в Nucleus SE: Вводное руководство по конфигурации и использованию API
- Queues в Nucleus SE: Введение и основные Service Calls
- Rutronik становится эксклюзивным европейским дистрибьютором IoT RAM от AP Memory по глобальному соглашению