You are here

Функции-ловушки

Перевод может содержать ошибки. Читайте первоисточник: Hook Functions

Назад: [Более подробно...] Вверх: [Более подробно...] Вперёд: [Более подробно...]

 

Функция-ловушка задачи простоя (Idle Hook Function)

Задача простоя может дополнительно вызывать определяемую в приложении функцию-ловушку (или функцию обратного вызова - callback function). Задача простоя запускается с самым низким приоритетом, поэтому функция-ловушка задачи простоя будет вызываться только когда нет задач с более высоким приоритетом, которые могли бы быть запущены. Это делает функцию-ловушку задачи простоя идеальным местом для помещения процессора в режим пониженного энергопотребления - это обеспечит автоматическое энергосбережение, когда нет процессов, требующих обработки.

Функция-ловушка задачи простоя будет вызываться только если константа configUSE_IDLE_HOOK в файле FreeRTOSConfig.h установлена в 1. При этом в приложении должна быть определена собственно функция-ловушка со следующим прототипом:

void vApplicationIdleHook( void );

Функция-ловушка задачи простоя вызывается многократно, пока задача простоя находится в состоянии "запущена". Крайне важно, чтобы функция-ловушка задачи простоя не вызывала никаких функций API, которые могли бы вызвать её блокировку. Кроме того, если приложение использует функцию API vTaskDelete(), то функция-ловушка задачи простоя должна периодически завершаться (выполнять возврат из функции). Это необходимо, т.к. задача простоя отвечает за очистку (освобождение) ресурсов, выделенных ядром ОС для задачи, которая была удалена.

 

Функция-ловушка системных тиков ОС (Tick Hook Function)

Прерывание тиков ОС может дополнительно вызывать определяемую в приложении функцию-ловушку (функцию обратного вызова) - ловушку тиков ОС. Ловушка тиков ОС является удобным местом для размещения реализации функционала таймеров.

Ловушка тиков ОС будет вызываться, если в файле FreeRTOSConfig.h константа configUSE_TICK_HOOK установлена в 1. А приложение в этом случае должно предоставить функцию со следующим прототипом:

void vApplicationTickHook( void );

Функция vApplicationTickHook() выполняется внутри обработчика прерывания, поэтому должна быть максимально короткой, использовать минимум стека и не вызывать функции API без суффикса "FromISR" или "From_ISR".

Пример использования ловушки тиков ОС находится в демонстрационном приложении в файле crhook.c. На сайте FreeRTOS не нашёл этого описания. А файл находится в каталоге \FreeRTOS\Demo\Common\Minimal\crhook.c дистрибутива.

 

Функция-ловушка ошибки выделения памяти (Malloc Failed Hook Function)

Схемы выделения памяти, реализованные в heap_1.c, heap_2.c, heap_3.c, heap_4.c и heap_5.c могут дополнительно вызывать функцию-ловушку ошибки выделения памяти функцией malloc() которая может быть сконфигурирована для вызова если pvPortMalloc() возвращает NULL.

Определение ловушки ошибки malloc() поможет выявить проблемы, вызванные нехваткой памяти кучи - особенно когда происходит сбой при вызове pvPortMalloc() внутри функции API.

Ловушка ошибки выделения памяти будет вызываться только если в файле FreeRTOSConfig.h константа configUSE_MALLOC_FAILED_HOOK установлена в 1. В этом случае также в приложении должна быть определена функция со следующим прототипом:

void vApplicationMallocFailedHook( void );

 

Функция-ловушка переполнения стека (Stack Overflow Hook Function)

Детальную информацию смотрите на странице Использование стека и обнаружение переполнения стека.

 

Ловушка запуска задачи демона (Daemon Task Startup Hook)

Задача демона ОС - то же, что и задача обслуживания таймеров. Иногда она называется задачей демона, потому что эта задача используется теперь не только для обслуживания таймеров.

Если константа configUSE_DAEMON_TASK_STARTUP_HOOK в файле FreeRTOSConfig.h установлена в 1, то ловушка запуска задачи демона будет вызываться, когда задача демона начинает выполняться в первый раз. Это полезно, если приложение содержит код инициализации, который выиграет от запуска после старта планировщика, который позволяет коду инициализации использовать функциональные возможности ОС.

Если configUSE_DAEMON_TASK_STARTUP_HOOK установлена в 1, разработчик приложения должен предоставить реализацию ловушки запуска задачи демона со следующим прототипом:

void vApplicationDaemonTaskStartupHook( void );
Hobby's category: