Перевод может содержать ошибки. Читайте первоисточник: Hook Functions
Назад: [Более подробно...] | Вверх: [Более подробно...] | Вперёд: [Более подробно...] |
Задача простоя может дополнительно вызывать определяемую в приложении функцию-ловушку (или функцию обратного вызова - callback function). Задача простоя запускается с самым низким приоритетом, поэтому функция-ловушка задачи простоя будет вызываться только когда нет задач с более высоким приоритетом, которые могли бы быть запущены. Это делает функцию-ловушку задачи простоя идеальным местом для помещения процессора в режим пониженного энергопотребления - это обеспечит автоматическое энергосбережение, когда нет процессов, требующих обработки.
Функция-ловушка задачи простоя будет вызываться только если константа configUSE_IDLE_HOOK в файле FreeRTOSConfig.h установлена в 1. При этом в приложении должна быть определена собственно функция-ловушка со следующим прототипом:
void vApplicationIdleHook( void );
Функция-ловушка задачи простоя вызывается многократно, пока задача простоя находится в состоянии "запущена". Крайне важно, чтобы функция-ловушка задачи простоя не вызывала никаких функций API, которые могли бы вызвать её блокировку. Кроме того, если приложение использует функцию API vTaskDelete(), то функция-ловушка задачи простоя должна периодически завершаться (выполнять возврат из функции). Это необходимо, т.к. задача простоя отвечает за очистку (освобождение) ресурсов, выделенных ядром ОС для задачи, которая была удалена.
Прерывание тиков ОС может дополнительно вызывать определяемую в приложении функцию-ловушку (функцию обратного вызова) - ловушку тиков ОС. Ловушка тиков ОС является удобным местом для размещения реализации функционала таймеров.
Ловушка тиков ОС будет вызываться, если в файле FreeRTOSConfig.h константа configUSE_TICK_HOOK установлена в 1. А приложение в этом случае должно предоставить функцию со следующим прототипом:
void vApplicationTickHook( void );
Функция vApplicationTickHook() выполняется внутри обработчика прерывания, поэтому должна быть максимально короткой, использовать минимум стека и не вызывать функции API без суффикса "FromISR" или "From_ISR".
Пример использования ловушки тиков ОС находится в демонстрационном приложении в файле crhook.c. На сайте FreeRTOS не нашёл этого описания. А файл находится в каталоге \FreeRTOS\Demo\Common\Minimal\crhook.c дистрибутива.
Схемы выделения памяти, реализованные в 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 );
Детальную информацию смотрите на странице Использование стека и обнаружение переполнения стека.
Задача демона ОС - то же, что и задача обслуживания таймеров. Иногда она называется задачей демона, потому что эта задача используется теперь не только для обслуживания таймеров.
Если константа configUSE_DAEMON_TASK_STARTUP_HOOK в файле FreeRTOSConfig.h установлена в 1, то ловушка запуска задачи демона будет вызываться, когда задача демона начинает выполняться в первый раз. Это полезно, если приложение содержит код инициализации, который выиграет от запуска после старта планировщика, который позволяет коду инициализации использовать функциональные возможности ОС.
Если configUSE_DAEMON_TASK_STARTUP_HOOK установлена в 1, разработчик приложения должен предоставить реализацию ловушки запуска задачи демона со следующим прототипом:
void vApplicationDaemonTaskStartupHook( void );