ОСРВ MULTEX-ARM
Полное описание
Файл tasklib.h

Управление задачами. Подробнее...

Структуры данных

struct  exit_st
 
struct  TCB
 Структура блока управления задачей. Подробнее...
 

Макросы

#define MX_FP_TASK   0x0008
 
#define TASK_DELAY   0x02
 
#define TASK_INT_HANDLING   0x10
 
#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)
 Приостановить выполнение текущей задачи. Подробнее...
 
taskIdtaskCreate (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 может применять для создания, удаления, приостановки, возобновления и задержки задач в многозадачной среде.

См. также
Многозадачность и межзадачное взаимодействие.

Пример запуска простой задачи:

bool stop;
// Задача в отдельной функции
int taskSimple (int dummy) {
// Инициализация переменных задачи (если есть)
void *p = malloc (size);
while (!stop) {
// ... тело задачи
taskDelay (1);
}
// Освобождение выделенной памяти
free (p);
// Завершение задачи
return 0;
}
void testSimple () {
stop = false;
taskSpawn ("task simple", 10, 0, 0, taskSimple, 0);
}
STATUS free(void *ptr)
void * malloc(size_t size)
STATUS taskDelay(int ticks)
Отложить выполнение задачи.
TASK_ID taskSpawn(const char *name, int priority, int options, int stackSize, FUNCPTR entryPt, int arg)
Создать новую задачу.

Макросы

◆ MX_FP_TASK

#define MX_FP_TASK   0x0008

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

◆ TASK_DELAY

#define TASK_DELAY   0x02

Задача отложена.

◆ TASK_INT_HANDLING

#define TASK_INT_HANDLING   0x10

Задача обрабатывает прерывание.

◆ TASK_MARKER

#define TASK_MARKER   0x5AA78627

◆ TASK_PEND

#define TASK_PEND   0x01

Задача ожидает разблокировки семафора.

◆ TASK_PS_STACK_SIZE

#define TASK_PS_STACK_SIZE   32

Размер служебного стека задачи.

◆ TASK_SUSPEND

#define TASK_SUSPEND   0x04

Задача приостановлена.

◆ TASK_WDT

#define TASK_WDT   0x08

Задача является таймером-вочдогом.

◆ VX_FP_TASK

#define VX_FP_TASK   MX_FP_TASK

Алиас MX_FP_TASK для обратной совместимости.

Типы

◆ exit_proc

typedef struct exit_st exit_proc

Структура элемента списка функций-обработчиков, вызываемых при завершении задачи при помощи exit() и abort().

◆ taskId

typedef struct TCB taskId

Перечисления

◆ TASK_SEM_EXIT

Как именно задача была отпущена с семафора.

Элементы перечислений
tseTimeoutOrNone 

Задача не предпринимала никаких действий с семафорами или семафор не был взят в желаемое время. semTake возвращает ERROR.

tseTakenFromAnotherTask 

Семафор был отдан освободившей его задачей. semTake возвращает OK.

tseFlushed 

Бинарный семафор был отпущен, но не захвачен. semTake возвращает OK.

tseMutexOrCounterError 

Семафор-счетчик или мьютекс был отпущен, но не захвачен. semTake возвращает ERROR.

82 {
83  tseTimeoutOrNone = 0,
85  tseFlushed,
TASK_SEM_EXIT
Definition: tasklib.h:82
@ tseMutexOrCounterError
Семафор-счетчик или мьютекс был отпущен, но не захвачен. semTake возвращает ERROR.
Definition: tasklib.h:86
@ tseTakenFromAnotherTask
Семафор был отдан освободившей его задачей. semTake возвращает OK.
Definition: tasklib.h:84
@ tseTimeoutOrNone
Задача не предпринимала никаких действий с семафорами или семафор не был взят в желаемое время....
Definition: tasklib.h:83
@ tseFlushed
Бинарный семафор был отпущен, но не захвачен. semTake возвращает OK.
Definition: tasklib.h:85

Функции

◆ cpuUsage()

int cpuUsage ( )

Функция оценивает значение счётчика простоя процессора и сравнивает его со значением полученным на ненагруженном процессоре.

Возвращает
Процент загрузки процессора: 0 – процессор не нагружен, 100 – процессор загружен полностью.

◆ deleteWorkTask()

STATUS deleteWorkTask ( void  )

Функция удаляет текущую задачу. Эквивалентно вызову taskDelete(NULL).

Возвращает
Значение OK при успешном выполнении, или ERROR, если задача защищена от удаления функцией taskSafe().

◆ kernelInit()

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-области.

◆ kernelTimeSlice()

STATUS kernelTimeSlice ( int  ticks)

Функция задает режим планировщика задач ядра MULTEX-ARM.

Аргументы
ticksКвант времени в тиках таймера, выделяемый каждой задаче в режиме карусельного планирования. При этом через интервал времени ticks планировщик автоматически переключит задачу на другую активную задачу, приоритет которой выше или равен приоритету текущей задачи. Для задания режима приоритетного планирования следует указать значение параметра ticks равным нулю. При этом текущая задача будет выполняться до тех пор, пока не активизируется более высокоприоритетная задача, или текущая задача не будет приостановлена по собственной инициативе.
Возвращает
Всегда OK.

◆ printTasksInfo()

STATUS printTasksInfo ( void  )

Распечатать в stdout таблицу с информацией о задачах.

Возвращает
Всегда возвращает OK.

◆ suspendWorkTask()

STATUS suspendWorkTask ( void  )

Функция приостанавливает выполнение указанной задачи. Эквивалентно вызову taskSuspend(NULL)

Возвращает
Значение OK при успешном выполнении, или ERROR, если задача защищена от приостановки функцией taskSafe().

◆ taskCreate()

taskId* taskCreate ( int  task,
int  stacksz,
int  param 
)

Функция выделяет память и подготавливает структуры для дальнейшего использования.

Аргументы
taskПриведенный к int указатель на функцию, являющуюся точкой входа.
stackszРазмер стека для задачи.
paramПараметр, передаваемый в точку входа.
Возвращает
Указатель на блок управления задачей.

◆ taskDelay()

STATUS taskDelay ( int  ticks)

Функция откладывает выполнение текущей задачи на заданный интервал времени.

Аргументы
ticksЧисло тиков системного таймера, на которое следует отложить выполнение текущей задачи. Для задания временных интервалов, не связанных с частотой системного таймера, воспользуйтесь функцией sysClkRateGet(), которая вернет количество тиков таймера за одну секунду. Если частота системного таймера не менялась, то это 1000.
Возвращает
STATUS - при вызове в контексте пользовательских задач функция всегда возвращает значение OK.

◆ taskDelete()

int taskDelete ( TASK_ID  TID)

Функция удаляет задачу из системы вне зависимости от ее состояния.

Аргументы
TIDИдентификатор удаляемой задачи или NULL для удаления текущей задачи.
Возвращает
0 в случае успешного удаления.
Отрицательное число в случае неудачи. Неудача может возникнуть в случае, если идентификатор не является указателем на правильный TCB задачи, или если задача защищена от удаления функцией taskSafe().

◆ taskDeleteForce()

STATUS taskDeleteForce ( TASK_ID  TID)

Удаляет указанную задачу, даже при установленной защите от удаления.

Аргументы
TIDИдентификатор удаляемой задачи.
Возвращает
Функция возвращает значение OK в случае успешного завершения, или ERROR в случае неудачи. Неудача может возникнуть в случае, если идентификатор не является указателем на правильный TCB задачи.

◆ taskIdSelf()

TASK_ID taskIdSelf ( void  )

Функция возвращает идентификатор текущей задачи.

Возвращает
Идентификатор текущей выполняемой задачи.

◆ taskIdVerify()

STATUS taskIdVerify ( TASK_ID  TID)

Функция проверяет правильность указанного идентификатора.

Аргументы
TIDИдентификатор задачи.
Возвращает
OK – если идентификатор верен.
ERROR – если нет.

◆ taskLock()

STATUS taskLock ( void  )

Функция запрещает переключение контекста с текущей выполняемой задачи на другую.

Возвращает
Всегда OK.

◆ taskName()

const char* taskName ( TASK_ID  TID)

Возвращает символьное имя указанной задачи.

Аргументы
TIDИдентификатор задачи.
Возвращает
Указатель на строку символов имени задачи, заканчивающуюся нулем. Если имя не найдено, функция возвращает NULL.

◆ taskNameToId()

TASK_ID taskNameToId ( const char *  name)

По заданному символическому имени задачи функция отыскивает ее идентификатор.

Аргументы
nameУказатель на строку c именем задачи.
Возвращает
Идентификатор задачи при успешном выполнении или NULL в случае неудачи.

◆ taskPriority()

int taskPriority ( void  )

Возвращает приоритет текущей задачи.

Возвращает
Значение приоритета текущей задачи в диапазоне 0-255.
  • Важно! Меньшие значения соответствуют более высокому приоритету!

◆ taskPriorityGet()

STATUS taskPriorityGet ( TASK_ID  TID,
int *  pPriority 
)

Функция возвращает приоритет указанной задачи.

Аргументы
TIDИдентификатор задачи, у которой запрашивается приоритет.
pPriorityВозвращаемое значение приоритета.
Возвращает
Значение OK в случае успешного завершения, или ERROR в случае неудачи. Неудача может возникнуть в случае, если идентификатор не является указателем на правильный TCB задачи.

◆ taskPrioritySet()

STATUS taskPrioritySet ( TASK_ID  TID,
int  newPriority 
)

Устанавливает заданный приоритет для указанной задачи.

Аргументы
TIDИдентификатор задачи, которой требуется сменить приоритет.
newPriorityТребуемое значение приоритета.
Возвращает
Функция возвращает значение OK в случае успешного завершения, или ERROR в случае неудачи. Неудача может возникнуть в случае, если идентификатор не является указателем на правильный TCB задачи.
  • Важно! Изменение приоритета задачи может привести к немедленному переключению на нее.

◆ taskResume()

STATUS taskResume ( TASK_ID  TID)

Возобновляет выполнение приостановленной задачи.

Аргументы
TIDИдентификатор приостановленной задачи.
Возвращает
Значение OK при успешном выполнении, или ERROR при неудаче (неверный идентификатор задачи или задача не находится в приостановленном состоянии).

◆ taskSafe()

STATUS taskSafe ( void  )

Функция защищает текущую задачу от случайного удаления.

Возвращает
OK при успешном выполнении.

◆ taskSpawn()

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Мбайт памяти.
  • Важно! Если указан размер стекового кадра, равный 0, то под него будет выделен размер такой-же, как у задачи, из которой вызывалась эта функция.
entryPtУказатель на точку входа в задачу. Задачей в MULTEX-ARM может быть любая функция типа int Func(int,…). При этом, выход из тела функции (return) приведет к завершению этой задачи и ее автоматическому удалению из памяти.
argАргумент, передаваемый функции, запускаемой ядром MULTEX-ARM как задача.
Возвращает
Идентификатор создаваемой задачи (указатель на TCB - блок управления задачи).Если функция не смогла создать задачу (например, система не может выделить требуемый объем памяти), то возвращаемое значение равно 0.

◆ taskSuspend()

STATUS taskSuspend ( TASK_ID  TID)

Функция приостанавливает выполнение указанной задачи.

Аргументы
TIDИдентификатор приостанавливаемой задачи или NULL для приостановки текущей задачи. Для возобновления выполнения приостановленной задачи воспользуйтесь функцией taskResume().
Возвращает
Значение OK при успешном выполнении, или ERROR при неудаче (неверный идентификатор задачи или защита от приостановки функцией taskSafe()).

◆ taskSwitch()

void taskSwitch ( void  )

Текущая задача не будет отложена или задержана. В случае отсутствия более приоритетных активных задач текущая задача продолжит свое выполнение.

◆ taskTcb()

TASK_ID taskTcb ( TASK_ID  TID)

Проверить корректность идентификатора задачи.

Аргументы
TIDПроверяемый идентификатор задачи.
Возвращает
TID, если идентификатор корректный, или NULL, если не корректный.

◆ taskUnlock()

STATUS taskUnlock ( void  )

Отменяет действие функции taskLock().

Возвращает
Всегда OK.

◆ taskUnsafe()

STATUS taskUnsafe ( void  )

Снимает установленную функцией tasklSafe() защиту задачи от случайного удаления.

Возвращает
OK при успешном выполнении.

◆ tickAnnounce()

void tickAnnounce ( void  )

Вызов функции обработчика прерывания от системного таймера. При подключении пользовательской процедуры обработки прерывания от системного таймера для сохранения работоспособности ядра MULTEX-ARM в тело этой функции требуется включить вызов tickAnnounce(). Это необходимо, так как общая синхронизация ядра производится системным таймером. *