
- •Учебный центр информационных технологий “информатика” выпускная квалификационная работа по куррсу профессиональной переподготовки
- •Введение
- •Задание на разрабатываемое устройство
- •Требования к охранным, пожарным шлейфам
- •Требования к входным и выходным исполнительным органам
- •Требования к конфигурированию и настройке устройства
- •Электронные компоненты печатной платы
- •Технические характеристики и параметры основных компонентов
- •Применяемые схемотехнические решения
- •Программное обеспечение микроконтроллера
- •Основная структура проекта
- •Задачи операционной системы реального времени.
- •Взаимодействие задач и прерываний.
- •Функции обработчиков прерываний
- •Rtos задачи проекта
- •Передача параметров настройки по usb
- •Программное обеспечение windows form c#
- •Определение общей структуры приложения
- •Создание библиотеки из ссылочных типов содержащие поля данных
- •Основная сборка проекта
- •Заключение
- •Список литературы
- •Приложение 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 при этом данные задачи сохраняются в стеке задачи. Это прерывание запускает планировщик который оценивает есть ли готовые, неблокированные к выполнению задачи и в порядке приоритета отдает управление той, у которой приоритет максимальный. В данном случае если высокоприоритетная задача не имеет временной блокировки или приостановки, задачи с меньшим приоритетом никогда не получат управления.