Да, действительно очень и очень глупая ошибка...конечно же проще все делать в одном таске, чем городить новые.
Спасибо за разъяснение.
Но появился следующий вопрос. После того как мы подали на некоторое время сигнал на ножку девайса нам нужно его настроить и если он не отвечает то его снова перезагрузить подачей сигнала на ножку. Как я себе представляю данный код в таком случае:
Код
void task_device(void *par) {
while (1) {
dbg_send("Reboot device\r\n");
GPIOB->BSRR=GPIO_Pin_1;
tn_task_sleep(3000);
GPIOB->BRR=GPIO_Pin_1;
tn_task_sleep(2000);
if (check_device() == ACTION_FAIL) continue;
if (change_setting() == ACTION_FAIL) continue;
while (1) {
rc = tn_queue_receive_polling(&queue_modem_send_data, (void **)&pos);
if (rc == TERR_NO_ERR) {
device_send_message();
}
if (check_device() == ACTION_FAIL) break;
tn_task_sleep(1000);
}
}
}
Если девайс нам не отвечает на команды, то мы просто перезапускаем цикл.
А уже во внутреннем цикле идет дальнейшая работа с девайсом, проверяем есть ли сообщения в очереди, если нет, то проверяем не подвис ли девайс, если подвис, то выходит из внутреннего цикла, а во внешнем цикле все по новой - перезагрузка, настройка и т.п
И задача засыпает на 1000 тиков (в данном случае на 1 сек.) чтобы другие задачи могли выполняться.
Использовать очередь с блокировкой задачи не совсем вариант, т.к нам нужно время от времени проверять состояние устройства.
Или же можно реорганизовать работу данного таска?