Программирование ARM FreeRTOS: функции перехвата особых событий Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


FreeRTOS: функции перехвата особых событий Печать
Добавил(а) microsin   

Пользователь может настроить для себя вызов callback-функций для некоторых особых для FreeRTOS ситуаций, это так называемые функции перехвата (hook-функции).

[Idle Hook]

Задача ожидания (idle task) опционально может вызывать для приложения idle hook. Задача ожидания работает с самым низким приоритетом, так что она получает управление только тогда, когда в системе нет задач с более высоким приоритетом, которым в настоящий момент требуется процессорное время (нет других задач, готовых к запуску или выполняющихся). В результате задача ожидания становится идеальным местом для перевода процессора в режим пониженного энергопотребления, предоставляя автоматический метод экономии питания, когда не выполняется никакая полезная обработка.

Функция idle hook будет вызываться только если опция configUSE_IDLE_HOOK установлена в 1 (см. файл конфигурации FreeRTOSConfig.h). Когда эта опция установлена, приложение должно определить hook-функцию в соответствии со следующим прототипом:

void vApplicationIdleHook (void);

Функция idle hook постоянно вызывается, пока работает idle task. Чрезвычайно важно, чтобы функция idle hook не вызывала никакие API-функции, которые делают блокировку. Также если приложение использует API-функцию vTaskDelete(), то hook-функция задачи ожидания должна периодически выполнять возврат. Причина в том, что задача ожидания отвечает очистку ресурсов при удалении задачи, которые были выделены ядром RTOS.

[Tick Hook]

Прерывание тика опционально может вызывать hook-функцию (или callback), определяемую приложением - tick hook. Функция tick hook предоставляет удобное место для реализации функционала таймера (хотя для этой цели есть удобные готовые API-функции FreeRTOS [5]).

Функция tick hook будет вызываться только если установлена в 1 опция configUSE_TICK_HOOK (см. файл конфигурации FreeRTOSConfig.h). Когда эта опция установлена, приложение должно предоставить hook-функцию в соответствии со следующим прототипом:

void vApplicationTickHook (void);

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

См. файл crhook.c демонстрационного приложения для примера, как использовать tick hook [2].

[Malloc Failed Hook]

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

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

Функция malloc failed hook будет вызываться только если установлена в 1 опция configUSE_MALLOC_FAILED_HOOK (см. файл конфигурации FreeRTOSConfig.h). Когда эта опция установлена, приложение должно предоставить hook-функцию в соответствии со следующим прототипом:

void vApplicationMallocFailedHook (void);

[Stack Overflow Hook]

Подробное описание функции перехвата переполнения стека см. в статье [4].

[Daemon Task Startup Hook]

RTOS daemon task это то же самое, что и Timer Service Task [5]. Иногда задача обслуживания таймеров называется демоном, потому что она выполняет и другие функции.

Если в файле FreeRTOSConfig.h опция configUSE_DAEMON_TASK_STARTUP_HOOK установлена в 1, то Daemon Task Startup Hook будет вызываться всякий раз, когда Daemon Task запускается первый раз. Это полезно, если приложение включает код инициализации, который был бы полезен после запуска планировщика, что позволяет коду инициализации использовать функционал RTOS.

Когда эта опция установлена, приложение должно предоставить hook-функцию в соответствии со следующим прототипом:

void vApplicationDaemonTaskStartupHook (void);

[Ссылки]

1. Hook Functions site:freertos.org.
2. Demo Project Files site:freertos.org.
3. FreeRTOS: управление памятью.
4. FreeRTOS: использование стека и проверка стека на переполнение.
5. FreeRTOS: программные таймеры.

 

Добавить комментарий


Защитный код
Обновить

Top of Page