В этой статье рассматриваются требования, связанные с переходом на другую ОСРВ.
Для TouchGFX требуется как минимум один поток для графического интерфейса и два семафора, которые управляют доступом к центральным ресурсам инфраструктуры. TouchGFX может работать практически с любой ОС, если реализовать OSWrapper
класс должным образом.
Обычно операционная система находится target/os
в вашем проекте. Структура пакета ОС FreeRTOS такая же, как в следующем листинге, где License/
и Source/
находятся папки, поставляемые поставщиком:
\-- os
+-- FreeRTOS8.2.0
+-- License
+-- Source
\-- OSWrappers.cpp
OSWrappers.cpp
является реализацией уровня абстракции ОС (OSAL), необходимого для каждого пакета ОС. Уровень определяет методы для контроля доступа к жизненно важным ресурсам инфраструктуры.
Интерфейс
Эталонную реализацию класса OSWrappers можно найти в любом из пакетов FreeRTOS.
Полный интерфейс указан здесь:
#ifndef OSWRAPPERS_HPP
#define OSWRAPPERS_HPP
namespace touchgfx
{
class OSWrappers
{
public:
static void initialize();
static void signalVSync();
static void waitForVSync();
static void takeFrameBufferSemaphore();
static void tryTakeFrameBufferSemaphore();
static void giveFrameBufferSemaphore();
static void giveFrameBufferSemaphoreFromISR();
};
} // namespace touchgfx
#endif /* OSWRAPPERS_HPP */
initialize()
- Инициализировать семафор кадрового буфера и очередь / мьютекс для сигнала VSYNC.signalVSync()
- Сигнал о том, что произошел VSYNC. Должен сделать доступной очередь / мьютекс vsync. Эта функция вызывается из ISR (обработчик прерываний LCD) и должна (в зависимости от ОС) запускать планирование.waitForVSync()
- Вызывается из основного цикла приложения TouchGFX. Эта функция блокируется до появления VSYNC. Эта функция должна сначала очистить мьютекс / очередь, а затем дождаться следующего.takeFrameBufferSemaphore()
- Вызывается путем рендеринга компонентов перед записью в кадровый буфер. Возьмем семафор буфера кадров. Блокирует, пока семафор не доступен.tryTakeFrameBufferSemaphore()
- Попытка получить семафор буфера кадра. Если семафор недоступен, ничего не делайте. Должен вернуться немедленно! Эта функция не заботится о том, кто взял семафор, она служит только для того, чтобы кто-то взял этот семафор.giveFrameBufferSemaphore()
- Освободить семафор буфера кадров. Вызывается путем рендеринга компонентов после завершения записи в фрейм-буфер.giveFrameBufferSemaphoreFromISR()
- Вызывается, когда передача DMA завершена (очередь DMA пуста). Освободите семафор буфера кадра таким образом, чтобы это было безопасно в контексте прерывания.
Использование функций ОС сведено к минимуму, и этот компонент должен быть реализован с относительной легкостью. Для реализации требуются две точки синхронизации, которые могут быть реализованы в виде двоичных семафоров, мьютексов или очередей (размером 1) в зависимости от вашей операционной системы. Точки синхронизации:
VSYNC сигнализация
Задача GUI синхронизируется с возникновением VSYNC
событий контроллером TFT. Это делается на практике, когда задача GUI ожидает семафор / очередь / мьютекс (сквозной waitForVSync
). Подпрограмма прерывания TFT, которая запускается при создании a VSYNC
, будет отправлять на этот семафор (сквозной signalVSync
), что приведет к планированию задачи GUI.
Доступ к буферу кадров
Доступ к буферу кадров должен быть синхронизирован, так как в противном случае задача GUI и процессор DMA процессора могут рисовать в буфере кадров параллельно.
Использование пакетов ОС
Чтобы использовать пакет ОС в вашем проекте, включите источник для ОС, а также OSWrappers.cpp
из нового пакета ОС для компиляции в вашем проекте. Вот проект IAR, использующий FreeRTOS v7.6.0:
Добавить комментарий