SIZE в файле FreeRTOSConfig.h.
настройки FreeRTOS
для использования сопрограмм
Для того чтобы организовать многозадач-
ную среду на основе сопрограмм, прежде все-
го необходимо соответствующим образом
настроить ядро FreeRTOS:
1. В исходный текст программы должен быть
включен заголовочный файл croutine.h, со-
держащий определения API-функций для
работы с сопрограммами:
#include "croutine.h”
2. Конфигурационный файл FreeRTOSConfig.h
должен содержать следующие макроопреде-
ления, установленные в 1: configUSE_IDLE_
HOOK и configUSE_CO_ROUTINES.
3. Следует также определить количе-
ство приоритетов сопрограмм. Файл
FreeRTOSConfig.h должен содержать ма-
кроопределение вида:
#define configMAX_CO_ROUTINE_PRIORITIES ( 3
учебная программа № 1
Рассмотрим учебную программу № 1, в ко-
торой создаются 2 сопрограммы и реализова-
но их совместное выполнение. Каждая сопро-
грамма сигнализирует о своем выполнении,
после чего реализуется временная задержка
с помощью пустого цикла, далее происходит
принудительное переключение на другую со-
программу. Приоритет сопрограмм установ-
лен одинаковым.
#include "FreeRTOS.h"
#include "task.h"
#include "croutine.h"
#include
#include
/* Функция, реализующая Сопрограмму 1.
Параметр, передаваемый в сопрограмму при ее создании,
не используется. Сопрограмма сигнализирует о своем
выполнении, после чего блокируется на 500 мс. */
void vCoRoutine1( xCoRoutineHandle xHandle, unsigned portBASE_
TYPE uxIndex ) {
/* Все переменные должны быть объявлены как static. */
static long i;
/* Сопрограмма должна начинаться с вызова crSTART().
Дескриптор сопрограммы xHandle получен автоматически
в виде аргумента функции, реализующей сопрограмму
vCoRoutine1().*/
crSTART( xHandle );
/* Сопрограмма должна содержать бесконечный цикл. */
for(;;) {
/* Сигнализировать о выполнении */
puts("Co-routine #1 runs!");
/* Пауза, реализованная с помощью пустого цикла */
for (i = 0; i < 5000000; i++);
/* Выполнить принудительное переключение на другую со-
программу */
crDELAY( xHandle, 0 );
}
/* Сопрограмма должна завершаться вызовом crEND(). */
crEND();
}
/* Функция, реализующая Сопрограмму 2.
Сопрограмма 2 выполняет те же действия, что и Сопрограмма 1.*/
void vCoRoutine2( xCoRoutineHandle xHandle, unsigned portBASE_
TYPE uxIndex ) {
static long i;
crSTART( xHandle );
for(;;) {
/* Сигнализировать о выполнении */
puts("Co-routine #2 runs!");
/* Пауза, реализованная с помощью пустого цикла */
for (i = 0; i < 5000000; i++);
/* Выполнить принудительное переключение на другую со-
программу */
crDELAY( xHandle, 0 );
}
crEND();
}
/* Точка входа. С функции main() начинается выполнение про-
граммы. */
void main(void) {
/* До запуска планировщика создать Сопрограмму 1
и Сопрограмму 2.
Приоритеты сопрограмм одинаковы и равны 1.
Параметр, передаваемый при создании, не используется и ра-
вен 0. */
xCoRoutineCreate(vCoRoutine1, 1, 0);
xCoRoutineCreate(vCoRoutine2, 1, 0);
/* В программе не создается ни одной задачи.
Однако задачи можно добавить, создавая их до запуска плани-
ровщика */
/* Запуск планировщика. Сопрограммы начнут выполняться.
*/
vTaskStartScheduler();
}
/* Функция, реализующая задачу Бездействие, должна присутство-
вать в программе и содержать вызов vCoRoutineSchedule() */
|