RTX5. Общие концепции дизайна обьектов

Все объекты RTOS имеют общую концепцию дизайна. Общий жизненный цикл объекта можно суммировать как создание -> использование -> удаление.

Создание  обьекта

Объект создается путем вызова его функции osXxxNew. Новая функция возвращает идентификатор, который можно использовать для работы с новым объектом. Актуальное состояние объекта обычно хранится в специфичном для объекта блоке управления (object specific control block). Расположение памяти (и необходимый размер) для блока управления зависит от реализации. Не следует делать какие-либо конкретные предположения о блоке управления. Расположение блока управления может измениться и, следовательно, должна рассматриваться как внутренняя деталь реализации.

Чтобы предоставить контроль над специфичными для объекта параметрами, все функции osXxxNew предоставляют необязательный аргумент attr, который по умолчанию можно оставить равным NULL. Он принимает указатель на специфичную для объекта структуру атрибутов, обычно содержащую поля:

  • name поле для присваивания удобного имени к обьекту для идентификации.
  • attr_bits управление специфичными для обьекта параметрами
  • cb_mem  предоставление памяти для блока управления (ручное выделение)
  • cb_size размер памяти для блока управления

Атрибут name используется только для идентификации объекта, например, используя RTOS-ориентированную отладку. Прикрепленная строка не используется для каких-либо других целей.

Атрибуты cb_mem и cb_size могут использоваться для предоставления памяти для блока управления вручную, вместо того, чтобы полагаться на внутреннюю реализацию выделения памяти. Необходимо убедиться, что объем памяти, на который указывает cb_mem, достаточен для структуры блока управления объектами. Если размер, указанный как cb_size, недостаточен, функция osXxxNew возвращается с ошибкой, то есть возвращает NULL. Кроме того, предоставление памяти блока управления вручную менее переносимо. Таким образом, необходимо позаботиться о конкретных требованиях к выравниванию и размещению, например. Обратитесь к Memory Management для получения дополнительной информации.

Использование обьекта

После успешного создания объекта его можно использовать, пока он не будет удален. Действия, определенные для объекта, зависят от его типа. Обычно все функции  osXxx_действие требуют ссылки на объект для работы в качестве первого параметра xxx_id.

Функции имеют некоторую проверку id параметра. Таким образом, гарантируется, что нельзя случайно вызвать функцию  со ссылкой на объект NULL. Кроме того, конкретный тип объекта проверяется, то есть нельзя вызывать функции доступа одного типа объекта со ссылкой на другой тип объекта.

Проверки всех следующих параметров либо зависят от объекта и действия, либо даже могут зависеть от реализации. Таким образом, всегда следует проверять возвращаемый результат функции на osErrorParameter, чтобы убедиться, что предоставленные аргументы были приняты.

Как правило, из процедур обработки прерываний (ISR) можно использовать только неблокирующую функцию. Это включает в себя функции osXxxWait (и аналогичные), ограниченные для вызова с timeout параметром, установленным в 0, то есть с использованием try семантики.

Удаление обьекта

Объекты, которые больше не нужны, могут быть уничтожены по требованию, чтобы освободить память блока управления. Объекты не уничтожаются неявно.

Таким образом, можно считать, что идентификатор объекта действителен до тех пор, пока osXxxDelete не будет вызван явно. Функция удаления, окончательно, освобождает память блока управления. В случае, если пользователь предоставлял память блока управления вручную, см. выше, память также должна быть освобождена вручную.

 

Единственное исключение, о котором нужно позаботиться, это потоки, которые не имеют явной функции osThreadDelete. Потоки могут быть отсоединяемые или присоединяемые. Отсоединенные потоки автоматически уничтожаются при завершении, то есть при вызове osThreadTerminate или osThreadExit или возвращении из функции потока. С другой стороны, вручную присоединяемые потоки сохраняются до тех пор, пока один явно не вызовет osThreadJoin.

 

Оставить ответ