![]() |
ОСРВ MULTEX-ARM
Полное описание
|
Управление задачами. Подробнее...
Структуры данных | |
| struct | exit_st |
| struct | TCB |
| Структура блока управления задачей. Подробнее... | |
Макросы | |
| #define | MX_FP_TASK 0x0008 |
| #define | TASK_DELAY 0x02 |
| #define | TASK_MARKER 0x5AA78627 |
| Маркер задачи. Подробнее... | |
| #define | TASK_PEND 0x01 |
| #define | TASK_PS_STACK_SIZE 32 |
| Размер служебного стека задачи. Подробнее... | |
| #define | TASK_SUSPEND 0x04 |
| #define | TASK_WDT 0x08 |
| #define | VX_FP_TASK MX_FP_TASK |
Определения типов | |
| typedef struct exit_st | exit_proc |
| typedef struct TCB | taskId |
| Структура блока управления задачей. Подробнее... | |
Перечисления | |
| enum | TASK_SEM_EXIT { tseTimeoutOrNone = 0 , tseTakenFromAnotherTask , tseFlushed , tseMutexOrCounterError } |
Функции | |
| int | cpuUsage () |
| Оценка загрузки процессора в процентах. Подробнее... | |
| STATUS | deleteWorkTask (void) |
| Удалить текущую задачу. Подробнее... | |
| void | kernelInit (void(*archInit)(void), FUNCPTR rootRtn, size_t rootMemSize, size_t pMemPoolStart, size_t pMemPoolEnd) |
| Инициализация многозадачного ядра. Подробнее... | |
| STATUS | kernelTimeSlice (int ticks) |
| Задать режим планировщика ядра. Подробнее... | |
| STATUS | printTasksInfo (void) |
| STATUS | suspendWorkTask (void) |
| Приостановить выполнение текущей задачи. Подробнее... | |
| taskId * | taskCreate (int task, int stacksz, int param) |
| Создать блок управления задачей. Подробнее... | |
| STATUS | taskDelay (int ticks) |
| Отложить выполнение задачи. Подробнее... | |
| int | taskDelete (TASK_ID TID) |
| Удалить задачу. Подробнее... | |
| STATUS | taskDeleteForce (TASK_ID TID) |
| Принудительное удаление задачи. Подробнее... | |
| TASK_ID | taskIdSelf (void) |
| Идентификатор текущей задачи. Подробнее... | |
| STATUS | taskIdVerify (TASK_ID TID) |
| Проверить идентификатор задачи. Подробнее... | |
| STATUS | taskLock (void) |
| Запрет переключения текущей задачи. Подробнее... | |
| const char * | taskName (TASK_ID TID) |
| Получить имя задачи. Подробнее... | |
| TASK_ID | taskNameToId (const char *name) |
| Поиск задачи по имени. Подробнее... | |
| int | taskPriority (void) |
| Получить приоритет задачи. Подробнее... | |
| STATUS | taskPriorityGet (TASK_ID TID, int *pPriority) |
| Получить приоритет задачи. Подробнее... | |
| STATUS | taskPrioritySet (TASK_ID TID, int newPriority) |
| Установить приоритет задачи. Подробнее... | |
| STATUS | taskResume (TASK_ID TID) |
| Возобновить выполнение задачи. Подробнее... | |
| STATUS | taskSafe (void) |
| Защита задачи. Подробнее... | |
| TASK_ID | taskSpawn (const char *name, int priority, int options, int stackSize, FUNCPTR entryPt, int arg) |
| Создать новую задачу. Подробнее... | |
| STATUS | taskSuspend (TASK_ID TID) |
| Приостановить выполнение задачи. Подробнее... | |
| void | taskSwitch (void) |
| Принудительно переключить текущую задачу на другую активную и более приоритетную. Подробнее... | |
| TASK_ID | taskTcb (TASK_ID TID) |
| STATUS | taskUnlock (void) |
| Отмена запрета переключения. Подробнее... | |
| STATUS | taskUnsafe (void) |
| Снять защиту задачи. Подробнее... | |
| void | tickAnnounce (void) |
| Обработчик прерывания системного таймера. Подробнее... | |
Приведенные в данном файле функции пользователь MULTEX-ARM может применять для создания, удаления, приостановки, возобновления и задержки задач в многозадачной среде.
Пример запуска простой задачи:
| #define MX_FP_TASK 0x0008 |
Флаг создания задачи, укзывающий что в задаче используется математический сопроцессор (вещественные числа).
| #define TASK_DELAY 0x02 |
Задача отложена.
| #define TASK_MARKER 0x5AA78627 |
| #define TASK_PEND 0x01 |
Задача ожидает разблокировки семафора.
| #define TASK_PS_STACK_SIZE 32 |
Размер служебного стека задачи.
| #define TASK_SUSPEND 0x04 |
Задача приостановлена.
| #define TASK_WDT 0x08 |
Задача является таймером-вочдогом.
| #define VX_FP_TASK MX_FP_TASK |
Алиас MX_FP_TASK для обратной совместимости.
| enum TASK_SEM_EXIT |
Как именно задача была отпущена с семафора.
| Элементы перечислений | |
|---|---|
| tseTimeoutOrNone | Задача не предпринимала никаких действий с семафорами или семафор не был взят в желаемое время. semTake возвращает ERROR. |
| tseTakenFromAnotherTask | Семафор был отдан освободившей его задачей. semTake возвращает OK. |
| tseFlushed | Бинарный семафор был отпущен, но не захвачен. semTake возвращает OK. |
| tseMutexOrCounterError | Семафор-счетчик или мьютекс был отпущен, но не захвачен. semTake возвращает ERROR. |
| int cpuUsage | ( | ) |
Функция оценивает значение счётчика простоя процессора и сравнивает его со значением полученным на ненагруженном процессоре.
| STATUS deleteWorkTask | ( | void | ) |
Функция удаляет текущую задачу. Эквивалентно вызову taskDelete(NULL).
| void kernelInit | ( | void(*)(void) | archInit, |
| FUNCPTR | rootRtn, | ||
| size_t | rootMemSize, | ||
| size_t | pMemPoolStart, | ||
| size_t | pMemPoolEnd | ||
| ) |
Функция инициализирует многозадачное ядро MULTEX-ARM, создает и запускает служебные системные задачи и задачу пользователя.
| archInit | Функция инициализации конфигурации аппаратной части. |
| rootRtn | Корневая задача – задача пользователя или командный интерпретатор Shell. |
| rootMemSize | Размер стека, отводимого для корневой задачи. |
| pMemPoolStart | Адрес начала свободной оперативной памяти, выделяемой под HEAP-область. |
| pMemPoolEnd | Адрес конца HEAP-области. |
| STATUS kernelTimeSlice | ( | int | ticks | ) |
Функция задает режим планировщика задач ядра MULTEX-ARM.
| ticks | Квант времени в тиках таймера, выделяемый каждой задаче в режиме карусельного планирования. При этом через интервал времени ticks планировщик автоматически переключит задачу на другую активную задачу, приоритет которой выше или равен приоритету текущей задачи. Для задания режима приоритетного планирования следует указать значение параметра ticks равным нулю. При этом текущая задача будет выполняться до тех пор, пока не активизируется более высокоприоритетная задача, или текущая задача не будет приостановлена по собственной инициативе. |
| STATUS printTasksInfo | ( | void | ) |
Распечатать в stdout таблицу с информацией о задачах.
| STATUS suspendWorkTask | ( | void | ) |
Функция приостанавливает выполнение указанной задачи. Эквивалентно вызову taskSuspend(NULL)
| taskId* taskCreate | ( | int | task, |
| int | stacksz, | ||
| int | param | ||
| ) |
Функция выделяет память и подготавливает структуры для дальнейшего использования.
| task | Приведенный к int указатель на функцию, являющуюся точкой входа. |
| stacksz | Размер стека для задачи. |
| param | Параметр, передаваемый в точку входа. |
| STATUS taskDelay | ( | int | ticks | ) |
Функция откладывает выполнение текущей задачи на заданный интервал времени.
| ticks | Число тиков системного таймера, на которое следует отложить выполнение текущей задачи. Для задания временных интервалов, не связанных с частотой системного таймера, воспользуйтесь функцией sysClkRateGet(), которая вернет количество тиков таймера за одну секунду. Если частота системного таймера не менялась, то это 1000. |
| int taskDelete | ( | TASK_ID | TID | ) |
Функция удаляет задачу из системы вне зависимости от ее состояния.
| TID | Идентификатор удаляемой задачи или NULL для удаления текущей задачи. |
Удаляет указанную задачу, даже при установленной защите от удаления.
| TID | Идентификатор удаляемой задачи. |
| TASK_ID taskIdSelf | ( | void | ) |
Функция возвращает идентификатор текущей задачи.
| STATUS taskLock | ( | void | ) |
Функция запрещает переключение контекста с текущей выполняемой задачи на другую.
| const char* taskName | ( | TASK_ID | TID | ) |
Возвращает символьное имя указанной задачи.
| TID | Идентификатор задачи. |
| TASK_ID taskNameToId | ( | const char * | name | ) |
По заданному символическому имени задачи функция отыскивает ее идентификатор.
| name | Указатель на строку c именем задачи. |
| int taskPriority | ( | void | ) |
Возвращает приоритет текущей задачи.
Функция возвращает приоритет указанной задачи.
| TID | Идентификатор задачи, у которой запрашивается приоритет. |
| pPriority | Возвращаемое значение приоритета. |
Устанавливает заданный приоритет для указанной задачи.
| TID | Идентификатор задачи, которой требуется сменить приоритет. |
| newPriority | Требуемое значение приоритета. |
| STATUS taskSafe | ( | void | ) |
Функция защищает текущую задачу от случайного удаления.
| TASK_ID taskSpawn | ( | const char * | name, |
| int | priority, | ||
| int | options, | ||
| int | stackSize, | ||
| FUNCPTR | entryPt, | ||
| int | arg | ||
| ) |
Функция создает и активизирует новую задачу в среде MULTEX-ARM. Если создаваемая задача имеет более высокий приоритет, чем та задача, в контексте которой производится вызов этой функции, то производится немедленное переключение на эту задачу. В противном случае выполнение задачи, вызвавшей эту функцию, продолжается.
| name | Указатель на имя задачи. Имя задачи – произвольная последовательность символов, заканчивающаяся нулем. Длина имени не ограничена, однако не рекомендуется использовать имена длиннее 10 символов. После вызова функции строка может быть удалена из памяти. |
| priority | Приоритет задачи. Нулевое значение соответствует самому высокому приоритету. Чем больше значение, тем ниже приоритет. Для совместимости с vxWorks рекомендуется выбирать значения в диапазоне 0 – 255. |
| options | Опции создаваемой задачи. Для обычной задачи следует задавать значение 0. Если в задаче используются операции с вещественными числами и таких задач несколько, то следует задавать опцию MX_FP_TASK (или VX_FP_TASK, принятую в vxWorks и сохраненную для совместимости). При этом, при каждом переключении с этой задачи на другую, ядро MULTEX-ARM будет сохранять контекст сопроцессора в специально отводимой для этой задачи области. При переключении на эту задачу контекст сопроцессора будет автоматически восстановлен. Однако, следует иметь ввиду, что время переключения задач при установке такой опции несколько увеличивается. |
| stackSize | Размер стекового кадра для создаваемой задачи. При выборе размера стека следует учитывать глубину вложений всех процедур, вызываемых в контексте задачи. Прерывания в MULTEX-ARM также выполняются с использованием стека прерываемой задачи, поэтому следует рассчитывать наихудший вариант при возможных вложенных прерываниях. Не рекомендуется выбирать размер стека менее 1000, типичный размер 10000 байт. При задании большого размера следует учитывать общий объем оперативной памяти: так, при создании 100 задач с объемом стека в 20000 байт для каждой, только под стек будет отведено около 2Мбайт памяти.
|
| entryPt | Указатель на точку входа в задачу. Задачей в MULTEX-ARM может быть любая функция типа int Func(int,…). При этом, выход из тела функции (return) приведет к завершению этой задачи и ее автоматическому удалению из памяти. |
| arg | Аргумент, передаваемый функции, запускаемой ядром MULTEX-ARM как задача. |
Функция приостанавливает выполнение указанной задачи.
| TID | Идентификатор приостанавливаемой задачи или NULL для приостановки текущей задачи. Для возобновления выполнения приостановленной задачи воспользуйтесь функцией taskResume(). |
| void taskSwitch | ( | void | ) |
Текущая задача не будет отложена или задержана. В случае отсутствия более приоритетных активных задач текущая задача продолжит свое выполнение.
Проверить корректность идентификатора задачи.
| TID | Проверяемый идентификатор задачи. |
| STATUS taskUnlock | ( | void | ) |
Отменяет действие функции taskLock().
| STATUS taskUnsafe | ( | void | ) |
Снимает установленную функцией tasklSafe() защиту задачи от случайного удаления.
| void tickAnnounce | ( | void | ) |
Вызов функции обработчика прерывания от системного таймера. При подключении пользовательской процедуры обработки прерывания от системного таймера для сохранения работоспособности ядра MULTEX-ARM в тело этой функции требуется включить вызов tickAnnounce(). Это необходимо, так как общая синхронизация ядра производится системным таймером. *