
- •Учебный центр информационных технологий “информатика” выпускная квалификационная работа по куррсу профессиональной переподготовки
- •Введение
- •Задание на разрабатываемое устройство
- •Требования к охранным, пожарным шлейфам
- •Требования к входным и выходным исполнительным органам
- •Требования к конфигурированию и настройке устройства
- •Электронные компоненты печатной платы
- •Технические характеристики и параметры основных компонентов
- •Применяемые схемотехнические решения
- •Программное обеспечение микроконтроллера
- •Основная структура проекта
- •Задачи операционной системы реального времени.
- •Взаимодействие задач и прерываний.
- •Функции обработчиков прерываний
- •Rtos задачи проекта
- •Передача параметров настройки по usb
- •Программное обеспечение windows form c#
- •Определение общей структуры приложения
- •Создание библиотеки из ссылочных типов содержащие поля данных
- •Основная сборка проекта
- •Заключение
- •Список литературы
- •Приложение 1. Внешний вид приложения
Взаимодействие задач и прерываний.
Рассмотрим как обрабатываются прерывания без ОСРВ. Каждый тип прерывания микроконтроллера имеет свой приоритет. Его можно установить в СФР где для задания приоритета выделено 4 бита –это соответствует уровням приоритета от 0 до 15. Однако данные биты различными комбинациями могут быть разделены на подгруппы (например 2 бита на приоритет группы и 2 на приоритет подгруппы).
В нашем проекте выполним настройку при которой все 4 бита –соответствуют уровням приоритета,без деления на подгруппы:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4 );
Правила обработки прерывания без деления на подгруппы:
вызов прерывания с более высоким приоритетом приостанавливает выполнение текущего обработчика;
выполнение функции обработки прерывания не может быть прервано вызовом с тем же или более низким уровнем приоритета;
при одновременном вызове несколько прерываний будут обработаны в порядке приоритета, при одинаковом приоритете по возрастанию номера прерывания(порядковые номера задаются в файле STM32F4xx.h);
В нашем проекте задаем следующие приоритеты прерываний (0-означает максимально возможный приоритет) :
прерывание получения данных от модуля Sim900 по USART_2 (файл Sim900.c)
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
прерывание таймера TIM3 запуска преобразований АЦП (по истечении установленной выдержки времени происходит прерывание, в программе прерывания выполняется запуск преобразования, установка приоритета в файле ADC.c)
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
прерывание при получении данных по USB (файл usb_bsp.c)
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
прерывание по нажатию кнопок, и управлению с брелока (файл app.c)
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
Самый низкий приоритет у прерываний TIM3 и прерываний по нажатию кнопок, и эти прерывания имеют одинаковый приоритет, чтобы они не приостанавливали друг друга. А самые высокие приоритеты имеют обработчики прерываний по USB –при программировании конфигурации устройства и получение сообщения по Sim900. Такие настройки выбраны потому что самыми приоритетными задачами является конфигурирование устройства по USB, при этом передача информации между ПК и МК не должно прерываться низкоприоритетными прерываниями , и получение сообщений по GSM связи которое будет выполнять управление сигнализацией.
Приоритет задач не имеет никакого отношения к приоритету прерываний. Задачи не выполняются во время выполнения обработчиков прерываний. Ядро FreeRTOS позволяет с помощью макросредства config MAX_SYSCALL_INTERRUPT_PRIORITY задать наибольший приоритет прерывания, из обработчика которого можно вызывать API функции FreeRtos. Что-бы защитить выполнение текущего кода задачи от прерываний используются критические секции – это участки кода, во время выполнения которого запрещены прерывания процессора, и не происходит прерывание контекста каждый квант времени , а также запрещено прерывание системного таймера SysTick.
Определим в нашем проекте
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 3
т.е. на все прерывания с приоритетом до 3 (это прерывание USB и прерывание получения информации модулем Sim900) не влияют критические секции, так что ничего что делает ядро в текущий момент, не помешает выполнению текущего обработчика. Например в задаче “LED1” выполняется инициализация Sim900 следующим образом :
void vTaskLED1(void *pvParameters)
{
taskENTER_CRITICAL(); //вхожу в критическую секцию
Init_Sim900( 2,4,0); //передаем две команды AT
Init_Sim900( 0,1,0); //передаем команду отключение эха
Init_Sim900( 8,13,0); //включаем текстовый режим
taskEXIT_CRITICAL(); //выходим из критической секции
……….
}
В вышеприведенном примере при входе в критическую секцию –когда выполняется инициализация SIM900 запрещаем прерывания по TIM3( запуску АЦП преобразования) , и прерывания брелока. Также критические секции используются при отправке SMS сообщения (задача «OtpravSms» ) –в этот момент выполняется последовательность из нескольких команд прерывать выполнение которых нельзя.