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

Семафоры:служебные службы и структуры данных


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

В этой статье мы продолжаем рассмотрение семафоров.

Служебные программы семафора

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

Сброс семафора

Этот вызов API восстанавливает семафор в исходное неиспользуемое состояние. Эта функция API необычна по сравнению с функцией, доступной для других объектов ядра, поскольку, хотя это сброс, он не просто инициализирует свой счетчик начальным значением; в вызове предоставляется новый начальный счет. Все задачи, которые были приостановлены на семафоре, возобновляются и получают код возврата NUSE_SEMAPHORE_WAS_RESET . (в Nucleus SE или NU_SEMAPHORE_RESET с Nucleus RTOS).

Вызов API Nucleus RTOS для сброса семафора

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

STATUS NU_Reset_Semaphore (NU_SEMAPHORE * семафор,
UNSIGNED initial_count);

Параметры:

семафор - указатель на пользовательский блок управления семафором

начальное_число - значение, на которое должен быть установлен счетчик семафора

Возврат:

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

NU_INVALID_SEMAPHORE - указатель семафора недействителен

Вызов Nucleus SE API для сброса семафора

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

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

STATUS NUSE_Semaphore_Reset (семафор NUSE_SEMAPHORE,
U8 initial_count);

Параметры:

семафор - индекс (ID) семафора, который нужно сбросить

начальное_число - значение, на которое должен быть установлен счетчик семафора

Возврат:

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

NUSE_INVALID_SEMAPHORE - указатель семафора недействителен

Реализация сброса семафоров в Nucleus SE

Основная задача NUSE_Semaphore_Reset () Функция API - после проверки параметров - просто установить соответствующую запись в NUSE_Semaphore_Counter [] к предоставленному начальному значению.

Когда блокировка включена, для разблокировки задач требуется дополнительный код:

 while (NUSE_Semaphore_Blocking_Count [семафор]! =0) {индекс U8; / * проверяем, заблокированы ли какие-либо задачи * / / * на этом семафоре * / for (index =0; index  

Каждая задача, приостановленная на семафоре, помечается как «готовая» с кодом возврата приостановки NUSE_SEMAPHORE_WAS_RESET . . После завершения этого процесса, если используется планировщик приоритетов, выполняется вызов NUSE_Reschedule () , так как одна или несколько задач с более высоким приоритетом, возможно, были готовы, и им необходимо разрешить выполнение.

Информация о семафоре

Этот сервисный вызов получает выборку информации о семафоре. Реализация Nucleus SE отличается от Nucleus RTOS тем, что возвращает меньше информации, так как именование объектов и порядок приостановки не поддерживаются, а приостановка задачи может быть отключена.

Вызов API Nucleus RTOS для получения информации о семафоре

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

STATUS NU_Semaphore_Information (NU_SEMAPHORE * семафор,
CHAR * name, UNSIGNED * current_count, OPTION * suspend_type,
UNSIGNED * tasks_waiting, NU_TASK ** first_task);

Параметры:

семафор - указатель вверху контрольного блока семафора, информация о котором запрашивается

имя - указатель на 8-символьную область назначения для имени семафора; это включает место для нулевого терминатора

current_count - указатель на переменную, которая получит текущее значение счетчика семафоров

suspend_type - указатель на переменную, содержащую тип приостановки задачи; допустимые типы приостановки задачи: NU_FIFO и NU_PRIORITY

tasks_waiting - указатель на переменную, которая получит количество задач, приостановленных на этом семафоре

первая_задача - указатель на переменную типа NU_TASK который получит указатель на блок управления первой приостановленной задачи

Возврат:

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

NU_INVALID_SEMAPHORE - указатель семафора недействителен

Вызов Nucleus SE API для получения информации о семафоре

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

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

STATUS NUSE_Semaphore_Information (семафор NUSE_SEMAPHORE,
U8 * current_count, U8 * tasks_waiting, NUSE_TASK * first_task);

Параметры:

семафор - индекс семафора, о котором запрашивается информация

current_count - указатель на переменную, которая получит текущее значение счетчика семафоров

tasks_waiting - указатель на переменную, которая получит количество задач, приостановленных на этом семафоре (ничего не возвращается, если приостановка задачи отключена)

первая_задача - указатель на переменную типа NUSE_TASK который получит индекс первой приостановленной задачи (ничего не возвращается, если приостановка задачи отключена)

Возврат:

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

NUSE_INVALID_SEMAPHORE - указатель семафора недействителен

NUSE_INVALID_POINTER - один или несколько параметров указателя недопустимы

Реализация информации семафоров в Nucleus SE

Реализация этого вызова API довольно проста:

 NUSE_CS_Enter (); * current_count =NUSE_Semaphore_Counter [семафор]; # если NUSE_BLOCKING_ENABLE * tasks_waiting =NUSE_Semaphore_Blocking_Count [семафор]; if (NUSE_Semaphore_Blocking_Count [семафор]! =0) {индекс U8; for (index =0; index  

Функция возвращает статус семафора. Затем, если включена блокировка вызовов API, возвращается количество ожидающих задач и индекс первой (в противном случае эти два параметра устанавливаются на 0).

Получение количества семафоров

Этот вызов службы возвращает количество семафоров, настроенных в приложении. В то время как в Nucleus RTOS это будет меняться со временем, и возвращаемое значение будет представлять текущее количество семафоров, в Nucleus SE возвращаемое значение устанавливается во время сборки и не может быть изменено.

Вызов API Nucleus RTOS для подсчета семафоров

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

UNSIGNED NU_Established_Semaphores (VOID);

Параметры:

Нет

Возврат:

Количество созданных семафоров в приложении

Вызов Nucleus SE API для подсчета семафоров

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

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

U8 NUSE_Semaphore_Count (недействительно);

Параметры:

Нет

Возврат:

Количество настроенных семафоров в приложении

Реализация подсчета семафоров в Nucleus SE

Реализация этого вызова API почти тривиально проста:значение #define символ NUSE_SEMAPHORE_NUMBER возвращается.

Перейдите на вторую страницу:«Структуры данных»>>


Встроенный

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