Семафоры:служебные службы и структуры данных
Посмотреть серию раскрытых ОСРВ
В этой статье мы продолжаем рассмотрение семафоров.
Служебные программы семафора
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 возвращается.
Перейдите на вторую страницу:«Структуры данных»>>
Встроенный
- Плюсы и минусы облака по сравнению с собственными службами
- Токен блокчейна Microsoft Azure и службы управления данными
- Термины и концепции цифровой памяти
- Переменные C# и (примитивные) типы данных
- Структуры и классы в C ++
- Почтовые ящики:введение и основные услуги
- Семафоры:введение и базовые услуги
- Группы флагов событий:служебные службы и структуры данных
- Группы флагов событий:введение и базовые услуги
- Очереди:введение и базовые услуги