Компоненты и технологии • №2 '2011 компоненты


SIZE в файле FreeRTOSConfig.h



Pdf көрінісі
бет100/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   96   97   98   99   100   101   102   103   ...   129
Kurniz

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() */




Достарыңызбен бөлісу:
1   ...   96   97   98   99   100   101   102   103   ...   129




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет