В этой статье рассматриваются требования, связанные с переходом на другую ОСРВ.

Для 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:

Файлы ОС в проекте IAR