Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дипломн.проект.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
813.34 Кб
Скачать
    1. Задачи операционной системы реального времени.

Сигнализация GSM должна быть мультизадачной –поочередно выполнять поставленные задачи в порядке их приоритета и важности. В нашем проекте определим следующие задачи: задача обработки измерений напряжений шлейфов сигнализации ( в ПО конфигурации шлейфы обозначены как канал1-канал16), задача определения состояния входов и в соответствии с активированным входом она должна активировать необходимый канал, задача отправки SMS сообщения, задача инициализации USB – после выполнения инициализации она удаляет сама себя из планировщика, задачи попеременного мигания светодиодов (в них также выполняется инициализация GSM модуля SIM900 если она проходит неуспешно, может повторяться несколько раз, и выполняется проверка необходимости срабатывания выхода), задачи считывания температуры и номера с устройств 1-wire:

xTaskCreate( vTaskLED1, ( signed char * )

“LED1”, configMINIMAL_STACK_SIZE, NULL, 2,

&xTaskXandleSvet);

xTaskCreate( vTaskLED2, ( signed char * )

“LED2”, configMINIMAL_STACK_SIZE, NULL, 1,

( xTaskHandle * ) NULL);

xTaskCreate( vInitUSB, ( signed char * )

“InitUSB”, configMINIMAL_STACK_SIZE, NULL, 3

( xTaskHandle * ) NULL);

xTaskCreate( vInitOwire, ( signed char * )

“InitOwire”, configMINIMAL_STACK_SIZE, NULL, 1,

( xTaskHandle * ) NULL);

xTaskCreate( vOwireNomer, ( signed char * )

“OwireNomer”, configMINIMAL_STACK_SIZE, NULL, 2,

( xTaskHandle * ) NULL);

xTaskCreate( vObrabUstADC, ( signed char * )

“ObrabUstavok”, configMINIMAL_STACK_SIZE, NULL, 1,

( xTaskHandle * ) NULL);

xTaskCreate( vObrVhodov, ( signed char * )

“vObrabVhodov”, configMINIMAL_STACK_SIZE, NULL, 1,

( xTaskHandle * ) NULL);

xTaskCreate(vOtpravSMS,( signed char * )

“OtpravSms”, configMAXIMAL_STACK_SIZE, NULL, 2,

&OtpSoobSim);

vTaskStartScheduler(); -запускаем планировщик

FreeRTOS позволяет достаточно гибко управлять приоритетами выполнения задач, позволяет приостановить или выгрузить задачу из очереди планировщика или изменить ее приоритет в ходе ее выполнения, или из другой задачи используя ее хэндл и содержит дополнительные функции таймеры, очереди, семафоры. Хэндл или описание –каждой задаче задается свой номер по которому ОСРВ распознает текущую выполняемую задачу, этот номер и есть хэндл задачи, например для задачи отправки SMS хэндлом является OtpSoobSim-указав его из другой задачи мы можем изменить ее приоритет или приостановить выполнение. ОСРВ поддерживает три типа многозадачности: вытесняющую, кооперативную, гибридную. Все основные настройки ОСРВ находятся в файле FreeRTOSconfig.h :

#defineconfigUSE_PREEMPTION 1-установили вытесняющую многозадачность ,каждая задача выполняется в течении одного кванта времени планировщика, в проекте этот квант #define configTICK_RATE_HZ ( ( portTickType ) 1000 ) равен 1милисекунду. Для каждой созданной нами задаче выделяется стек размер которого #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 100 ) равен 200 байт. Для работы ОСРВ выделяется область памяти ,под все задачи и механизмы, в куче равной configTOTAL_HEAP_SIZE( ( size_t ) ( 60 * 1024 ) 60 Кбайт. Максимальное число приоритетов задач равно 5.

После создания наших задач планировщик отдаст управление , задаче с самым большим приоритетом –это задача инициализации USB «InitUSB» с приоритетом 3(после выполнения данная задача удаляется из планировщика и освобождает стек ОСРВ). После этого он отдаст управление задачам «LED1» –где выполняется инициализация GSM модуля в течении 13 секунд vTaskDelay(13000) и пока эта задача временно блокирована планировщик отдаст управление другой задаче с приоритетом 2- задаче отправки SMS –OtpravSms но данная задача ждет данные в очереди , а поскольку данных в очереди нету то xStatus=xQueueReceive(xQueueSoob,&ReciveData,0) выполнение этой задачи планировщиком приостанавливается

vTaskSuspend( NULL ); -а вот возобновить теперь выполнение этой задачи может только задача сравнения значений АЦП она же отправляет в очередь номер телефона на который необходимо отправить сообщение. Как только планировщик отсчитает 13 сек с момента блокирования «LED1» она разблокируется и управление снова передается ей, если инициализация прошла успешно, в ее теле понижается ее же приоритет до 1 и происходит попеременной мигание светодиодов –говорит об успешной инициализации. В нашем случае каждой задаче планировщик уделяет каждой задачи 1мсек, через 1 мсек происходит прерывание системного таймера SysTick при этом данные задачи сохраняются в стеке задачи. Это прерывание запускает планировщик который оценивает есть ли готовые, неблокированные к выполнению задачи и в порядке приоритета отдает управление той, у которой приоритет максимальный. В данном случае если высокоприоритетная задача не имеет временной блокировки или приостановки, задачи с меньшим приоритетом никогда не получат управления.