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

Рассмотрим как обрабатываются прерывания без ОСРВ. Каждый тип прерывания микроконтроллера имеет свой приоритет. Его можно установить в СФР где для задания приоритета выделено 4 бита –это соответствует уровням приоритета от 0 до 15. Однако данные биты различными комбинациями могут быть разделены на подгруппы (например 2 бита на приоритет группы и 2 на приоритет подгруппы).

В нашем проекте выполним настройку при которой все 4 бита –соответствуют уровням приоритета,без деления на подгруппы:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4 );

Правила обработки прерывания без деления на подгруппы:

  • вызов прерывания с более высоким приоритетом приостанавливает выполнение текущего обработчика;

  • выполнение функции обработки прерывания не может быть прервано вызовом с тем же или более низким уровнем приоритета;

  • при одновременном вызове несколько прерываний будут обработаны в порядке приоритета, при одинаковом приоритете по возрастанию номера прерывания(порядковые номера задаются в файле STM32F4xx.h);

В нашем проекте задаем следующие приоритеты прерываний (0-означает максимально возможный приоритет) :

  1. прерывание получения данных от модуля Sim900 по USART_2 (файл Sim900.c)

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  1. прерывание таймера TIM3 запуска преобразований АЦП (по истечении установленной выдержки времени происходит прерывание, в программе прерывания выполняется запуск преобразования, установка приоритета в файле ADC.c)

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;

  1. прерывание при получении данных по USB (файл usb_bsp.c)

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  1. прерывание по нажатию кнопок, и управлению с брелока (файл 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» ) –в этот момент выполняется последовательность из нескольких команд прерывать выполнение которых нельзя.