еобхідну уставку.ConvertedValue [ChanelADC [chet]] - масив містить заміряні значення напруги [16] [4] - масив зберігає уставки АЦП введені користувачем [16] [4] - масив містить дані по уставками, скільки разів заміряне значення досягало уставки.
vObrabUstADC (void * pvParameters)
{....... (;;)
{
//перевіряємо доступність довічного семафора - віддає функція переривання (xSemaphoreTake (xSemPrerADC, 10))
{
//скануємо по всім введеним користувачем каналах (i=0; i lt; lenkan; i ++)
{
/* в залежності від напрямку дії уставки і активності
каналу в даний момент */(ADCstr [chet] - gt; napravl [j] == 0 amp; amp; UslAktiv [i] [j] == 0)
{// виконуємо необхідне порівняння (ADC3ConvertedValue [ChanelADC [chet]] lt; (ResMasADC [chet] [j] - 0xA))
++ FlagMas [i] [j];// Ведемо рахунок даними порівнянь
.............
} ............
}
//якщо рахунок досяг уставки за часом (FlagMas [i] [j] gt;=UslovDelFlag [chet] [j])
/* використовуючи чергу передаємо у завдання відправки номер каналу і номер
уставки, довжина черги - 16 дорівнює довжині каналів * /. nomkan=chet ;. nomstrok=j; (xQueueSoob, (void *) amp; DataSoob, 154);
//виводимо задачу відправки з блокованого состояния (OtpSoobSim); }}}
) Завдання виконує відправку SMS повідомлень - vOtpravSMS. Як тільки з'являється умова для відправки повідомлення, завдання обробки уставок зберігає в черзі структурну змінну яка зберігає номер каналу і номер уставки і виводить дану задачу з призупиненого стану. Черга - механізм ОСРВ дозволяє передавати інформацію між завданнями, так і між завданнями та переривання.
vOtpravSMS (void * pvParameters)
{(;;)
{
{// перевіряємо що черга не порожня=xQueueReceive (xQueueSoob, amp; ReciveData, 0); (xStatus == pdPASS)
{// якщо існує умова відправки SMS (ADCstr [ReciveData. nomkan] - gt; vidOpovesh [ReciveData. nomstrok] == 0)
//якщо на один канал сконфигурировано кілька телефонів (t=0; (tel=ADCstr [ReciveData. nomkan] - gt; nomertel [t])!=0xFF; t ++)
{// то відправляємо на всі телефони даного канала_CRITICAL (); _ soob (tel, ReciveData. nomkan, ReciveData. nomstrok); _ CRITICAL (); (4340);// Затримка 4 сек для відправки SMS SIM900
}
//відправляємо поки в черзі є повідомлення
}} while (uxQueueMessagesWaiting (xQueueSoob));
//після чого дана задача сама себе призупиняє (NULL);
}
Особливості виконання даного завдання наявність критичної секції при виклику функції відправки повідомлення. У цій функції виконується кодування повідомлення і через певні інтервали часу SIM900 передаються команди управління з повідомленням. Одним з недоліків FreeRTOS є те що в критичній секції не можна викликати функцію vTaskDelay () - блокування завдання на певний час, і передачі на цей час, управління іншим завданням. Дана особливість заснована на тому, що vTaskDelay () - працює від переривання SysTick - тобто при її виклику дозволяються маскіруемие переривання і автоматично викликається функція taskEXIT_CRITICAL () виходу з критичної секції.
.6 Передача параметрів настроювання по USB
При передачі даних від ПО комп'ютера, воно відкриває необхідний COM порт і передає всі дані. Драйвер забезпечує зв'язок COM порту з пакетами USB переданих контролеру забезпечує максимальний розмір пакета даних 64 біта. Процес отримання даних виконується через контрольну точку 0. В кінці передачі пакета даних генерується переривання і викликається функція обробки даних - VCP_DataRx (uint8_t * Buf, uint32_t Len) у файлі usbd_cdc_vcp. c. Щоб не перевищити ліміт в 64 байта і уникнути втрати даних передача даних виконується по каналах налаштованим в користувальницькому додатку. Наприклад спочатку передаємо дані по рядках спочатку рядок №1 потім рядок №2 і. т.д.
Для рядка №1 першого передане повідомлення буде N79529091812 - це номер телефону, другим повідомленням слід Hіванов Є.П.- Це користувач, С030001 - для цього рядка використовується четвертий канал який працює з телефонами під індексами 00 і 01 в масиві телефонів і. т.д. Всі передані повідомлення обробляються по першому символу і записуються у відповідну структуру даних.
С...