You are here

Примеры использования сопрограмм в стандартных демонстрационных приложениях

Перевод может содержать ошибки. Читайте первоисточник: FreeRTOS Demo Application Co-routines Examples

Назад: [Сопрограммы во FreeRTOS] Вверх: [Сопрограммы во FreeRTOS] Вперёд: [Сопрограммы во FreeRTOS]

 

Два файла, включённые в поставку FreeRTOS, демонстрируют использование сопрограмм с очередями:

  1. crflash.c

    Это функционально эквивалентно стандартной демке flash.c, но с использованием сопрограмм вместо задач. В дополнение, и просто для демонстрации, вместо прямого переключения светодиода из сопрограммы (как в "быстром примере" ранее), номер светодиода, который нужно переключить, передаётся через очередь сопрограмме с более высоким приоритетом.

  2. crhook.c

    Демонстрирует передачу данных из прерывания в сопрограмму. Ловушка тиков ОС используется в качестве источника данных.

Демонстрационные приложения для  PC и одно из старых для ARM Cortex-M3 уже предварительно настроены для использования этих примеров работы сопрограмм и могут использоваться в качестве справочных. Все остальные демонстрационные приложения сконфигурированы только для использования задач, но могут быть легко конвертированы для демонстрации сопрограмм. Для этого необходимо следовать инструкциям ниже. В них функциональность, реализованная в файле flash.c заменяется на реализованную в файле crflash.c:

  1. В файле FreeRTOSConfig.h устанавливаем set configUSE_CO_ROUTINES и configUSE_IDLE_HOOK в 1.
  2. В проекте в среде разработки или в makefile проекта (в зависимости от используемого демонстрационного приложения):
    1. Заменяем ссылку на файл FreeRTOS/Demo/Common/Minimal/flash.c ссылкой FreeRTOS/Demo/Common/Minimal/crflash.c.
    2. Добавляем файл FreeRTOS/Source/croutine.c к сборке.
  3. В файле main.c:
    1. Включаем заголовочный файл croutine.h, который содержит макросы сопрограмм и прототипы функций.
    2. Заменяем включения файла flash.h на включения файла crflash.h.
    3. Удаляем вызовы функций, которые создают задачи мигания vStartLEDFlashTasks() ...
    4. ... и заменяем их на функции, которые создают сопрограммы мигания vStartFlashCoRoutines( n ), где n это номер сопрограммы, которая будет создана. Каждая сопрограмма мигает разными светодиодами с разной частотой.
    5. Добавляем функцию-ловушку задачи простоя, которая будет планировать сопрограммы:
      /*----------------------------------------------------------------------------*/
      void vApplicationIdleHook( void )
      {
          vCoRoutineSchedule( void );
      }
      
      

      Если main() уже содержит функцию-ловушку задачи простоя, тогда просто добавьте вызов vCoRoutineSchedule() в существующую функцию-ловушку.

  4. Замена задач мигания светодиодами на сопрограммы означает, что как минимум на два стека меньше необходимо выделить и, следовательно, меньше пространства кучи будет использовано планировщиком ОС. Если в вашем проекте недостаточно памяти для включения croutine.c в сборку, тогда просто уменьшите определение portTOTAL_HEAP_SPACE на/до (by) ( 2 * portMINIMAL_STACK_SIZE ) в файле FreeRTOSConfig.h.

 

Hobby's category: