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

Рассмотрим фрагменты кода реализации некоторых задач:

  1. Задача обработки уставок АЦП – vObrabUstADC. В программе конфигурирования сигнализации под Windows7 пользователь выбирает необходимый канал, для каждого канала существует возможность настройки четырех уставок АЦП и уставок времени АЦП. Уставки АЦП –это те значения выше или ниже которых (направление работы также выбирается пользователем) выполняется набор действий. Эти действия также настраиваются пользователем и могут выполнять отправку SMS сообщений, срабатывание определенного выхода сигнализации. Уставка времени АЦП нужна для защиты от наводок и бросков напряжений в канале. Пользователь может задать время в диапазоне значений 250-500 мсек.

В разделе 4.3 при описании функции обработчика прерывания по таймеру, определено время полного сканирования напряжения всех каналов 10 мсек, эта функция также отдает семафор-механизм ОСРВ позволяющий обеспечивать синхронизацию выполнения задачи с выполнением прерывания. Как только функция прерывания по окончанию замеров всех 16 каналов отдает семафор, задача захватывает его и происходит обработка значений. Если семафор не доступен ,а планировщик запустил данную задачу она должна блокироваться на время не менее 10 мсек. Поскольку сравнение результатов замера каждой уставки АЦП выполняется каждые 10мсек, то выполнив сравнение 25 раз и если замеренное значение будет выше или ниже уставки все 25 раз (или 250 мсек) значит сигнализация сработала, необходимо выполнять дальнейшие действия. Таким образом выполняется защита от наводок оговоренном в техническом задании (см. Раздел 2.1 ). Основные переменные обрабатываемые в этой задачи являются:

lenkan-количество каналов сконфигурированных пользователем;

masADC[16]-массив с номерами используемых каналов;

UslAktiv [16][4]-многомерный массив хранит два значения 0 –уставка в данный момент активна , 1-уставка в данный момент не активна. Это дает возможность активировать брелоком необходимую уставку.

ADC3ConvertedValue[ChanelADC[chet]]-массив содержит замеренные значения напряжения

ResMasADC[16][4]-массив хранит уставки АЦП введенные пользователем

FlagMas[16][4] –массив содержит данные по уставкам, сколько раз замеренное значение достигало уставки.

Void vObrabUstADC (void *pvParameters)

{ …….

For (; ;)

{

//проверяем доступность двоичного семафора – отдает функция прерывания

if(xSemaphoreTake(xSemPrerADC,10))

{

//сканируем по всем введенным пользователем каналам

for(i=0;i<lenkan;i++)

{

/*в зависимости от направления действия уставки и активности

канала в данный момент*/

if(ADCstr[chet]->napravl[j]==0 && UslAktiv[i][j]==0)

{ //выполняем необходимое сравнение

if(ADC3ConvertedValue[ChanelADC[chet]]<(ResMasADC[chet][j]-0xA))

++FlagMas[i][j] ; //ведем счет данным сравнениям

………….

}…………

}

//если счет достиг уставки по времени

if(FlagMas[i][j]>=UslovDelFlag[chet][j])

/*используя очередь передаем в задачу отправки номер канала и номер

уставки, длинна очереди -16 равна длинне каналов */

DataSoob.nomkan=chet;

DataSoob.nomstrok=j;

xQueueSendToBack(xQueueSoob,(void*)&DataSoob,154);

//выводим задачу отправки из блокированного состояния

vTaskResume( OtpSoobSim ); }}}

  1. Задача выполняющая отправку SMS сообщений –vOtpravSMS. Как только появляется условие для отправки сообщения, задача обработки уставок сохраняет в очереди структурную переменную которая хранит номер канали и номер уставки и выводит данную задачу из приостановленного состояния. Очередь – механизм ОСРВ позволяющий передавать информацию между задачами, так и между задачами и прерываниями.

Void vOtpravSMS (void *pvParameters)

{

for (;;)

{

do

{ //проверяем что очередь не пуста

xStatus=xQueueReceive(xQueueSoob,&ReciveData,0);

if(xStatus==pdPASS)

{ //если существует условие отправки SMS

if(ADCstr[ReciveData.nomkan]->vidOpovesh[ReciveData.nomstrok] == 0)

//если на один канал сконфигурировано несколько телефонов

for(t=0;(tel=ADCstr[ReciveData.nomkan]->nomertel[t])!=0xFF;t++)

{ //то отправляем на все телефоны данного канала

taskENTER_CRITICAL();

Otprav_soob(tel,ReciveData.nomkan,ReciveData.nomstrok);

taskEXIT_CRITICAL();

vTaskDelay(4340); //задержка 4 сек для отправки SMS SIM900

}

//отправляем пока в очереди есть сообщения

}} while(uxQueueMessagesWaiting(xQueueSoob));

//после чего данная задача сама себя приостанавливает

vTaskSuspend( NULL );

}

Особенности выполнения данной задачи наличие критической секции при вызове функции отправки сообщения. В этой функции выполняется кодирование сообщения и через определенные интервалы времени SIM900 передаются команды управления с сообщением. Одним из недостатков FreeRTOS является то что в критической секции нельзя вызвать функцию vTaskDelay()-блокировки задачи на определенное время , и передачи на это время, управления другим задачам. Данная особенность основана на том, что vTaskDelay()- работает от прерывания SysTick –т.е. при ее вызове разрешаются маскируемые прерывания и автоматически вызывается функция taskEXIT_CRITICAL() выхода из критической секции.