ign="justify">//віддаємо семафор завданню обробки результатів вимірів (xSemPrerADC, NULL)
}
//якщо масив заповнений на? if (DMA_GetCurrDataCounter (DMA2_Stream0) == 0xC)
{ gt; BSRRL=GPIO_BSRR_BS_7;// Перемикаємо мультиплексор gt; BSRRH=GPIO_BSRR_BS_8;
} ......
//оновлюємо значення рахункового регістра таймера=TIM_GetCapture1 (TIM3); _ SetCompare1 (TIM3, capture + CCR1_Val);
//запускаємо наступне перетворення АЦП_SoftwareStartConv (ADC1);
/* передаємо управління не планировщику, а якщо є на черзі переривання
то в наступне переривання, не допускаючи зайве перемикання
контексту */_ FROM_ISR (1);
}
) Переривання після натискання кнопок і брелока. Мультиплексори як аналогових сигналів, так і дискретних управляються від одних і тих же висновків МК. За Рис 3.2.3 переривання на брелоку налаштовані на появу логічної одиниці (точніше поява 5В через натиснуту кнопку на брелоку) на виведенні RF, переривання кнопок налаштовані на появу логічного нуля на виведенні key (на key включена підтяжка до харчування 3.3 Вольт). Таким чином, при виникненні переривання, номер натиснутої кнопки відповідає положенню мультиплексорного ключа в даний момент часу. Знаючи тривалість короткочасного натискання кнопки 105 мсек і тривалість кожного перемикання мультиплексора 2.5 мсек, для чотирьох кнопок будемо виконувати рахунок натискань і порівнювати його зі значенням 105/4 * 2.5=10 рівним десяти. Визначення що кнопка натиснута будемо виконувати в задачі vObrabVhodov де для кожної кнопки порівнюємо значення рахунку зі значенням 10 і якщо chetEXTIA [номер кнопки] gt;=10 означає кнопка натиснута. Але перед порівнянням значень ми будемо блокувати виконання цього завдання кожні vTaskDelay (105) - 105мсек.
Рахунок виконуємо в програмі переривання:
EXTI15_10_IRQHandler (void)//виклик при натисканні будь-якої кнопки
{
//визначаємо поточне положення ключа мультіплексора_t Ukaz=DMA_GetCurrDataCounter (DMA2_Stream0);
//якщо переривання на лінії RF - це радиобрелок (EXTI_GetITStatus (EXTI_Line14)!=RESET)
{(Ukaz) 0x10://ключ мультиплексора в положенні S1
//додатково зчитуємо поточний стан ((VhodRF [4]=(GPIOE- gt; IDR amp; GPIO_Pin_14)? 1: 0))
//збільшуємо рахунок для кнопки оброблюваний в задачі vObrabVhodov [4] ++ ;;
.......
}
//очищаємо прапор прериванія_ClearITPendingBit (EXTI_Line14);
//передаємо управління наступному прериванію_FROM_ISR (1);
}
3.5 RTOS завдання проекту
Розглянемо фрагменти коду реалізації деяких завдань:
) Завдання обробки уставок АЦП - vObrabUstADC. У програмі конфігурування сигналізації під Windows7 користувач вибирає необхідний канал, для кожного каналу існує можливість налаштування чотирьох уставок АЦП і уставок часу АЦП. Уставки АЦП - це ті значення вище або нижче яких (напрямок роботи також вибирається користувачем) виконується набір дій. Ці дії також настроюються користувачем і можуть виконувати відправку SMS повідомлень, спрацьовування певного виходу сигналізації. Уставка часу АЦП потрібна для захисту від наведень і кидків напруг в каналі. Користувач може задати час в діапазоні значень 250-500 мсек.
У розділі 4.3 при описі функції обробника переривання за таймером, визначено час повного сканування напруги всіх каналів 10 мсек, ця функція також віддає семафор-механізм ОСРВ дозволяє забезпечувати синхронізацію виконання завдання з виконанням переривання. Як тільки функція переривання після закінчення замірів всіх 16 каналів віддає семафор, завдання захоплює його і відбувається обробка значень. Якщо семафор не доступний, а планувальник запустив дану задачу вона повинна блокуватися на час не менше 10 мсек. Оскільки порівняння результатів виміру кожної уставки АЦП виконується кожні 10мсек, то виконавши порівняння 25 раз і якщо заміряне значення буде вище або нижче уставки всі 25 раз (або 250 мсек) значить сигналізація спрацювала, необхідно виконувати подальші дії. Таким чином виконується захист від наведень обумовленому в технічному завданні (див. Розділ 2.1). Основні змінні оброблювані в цієї задачі є: кількість каналів сконфігурованих користувачем; [16] - масив з номерами використовуваних каналів; [16] [4] - багатовимірний масив зберігає два значення 0 - уставка в даний момент активна, 1-уставка в даний момент не активна. Це дає можливість активувати брелоком н...