После 72ой минуты 32 таймер переполнится и начнет считать заново. Можно генерировать прерывания и по slave таймеру, умножать счетчик прерываний на 0xFFFFFFFF и прибавлять cnt32. В результате получится уже тайм штамп типа uint64_t.
Можно ждать отправки не всегда, а только в случае, если в программном буфере TxFIFO не достаточно места, чтобы добавить туда ещё одно сообщение, если позволяет логика программы, и с таймаутом.
Да. У меня это выглядит так
/*Wait until a free space appears in the Tx Queue*/
bool UART_WaitFifoSpace_LL(UartHandle_t* node, uint32_t size) {
bool res = false;
if(node->init_done) {
uint32_t cnt = 0;
uint32_t up_time_start = TIME_GetMs();
while(1) {
cnt++;
uint32_t spare = FIFO_GetSpare(&node->TxFifo);
if(size <= spare) {
res = true;
break;
}
uint32_t up_time = TIME_GetMs();
uint32_t diff = up_time - up_time_start;
if(200 < diff) {
res = false;
break;
}
}
} else {
res = false;
}
return res;
}
При этом число различных вариантов ошибок обычно ограничено, а если они повторяются быстрее отправки - сообщения о них можно объединять для экономии памяти.
Что значит оператор "<>" ?
После 72ой минуты 32 таймер переполнится и начнет считать заново. Можно генерировать прерывания и по slave таймеру, умножать счетчик прерываний на 0xFFFFFFFF и прибавлять cnt32. В результате получится уже тайм штамп типа uint64_t.
Я видел такое решение
Однако почему так сделано - затрудняюсь пояснить.
Да. Это классическая "ошибка 71ой минуты".
Что делать - не знаю.
Переходить на RISC-V.
Там 64битный systick встроен прямо в ядро!
Обновление tim_word_hi происходит раз в 65 ms.
Я бы предпочел ничего не делать.
На следующей итерации прочитается уже корректное значение.
А я предлагаю каскадный 32бит таймер, который вообще прерывания не производит.
Прерывания каждую микросекунду?
Приложение будет тормозить.
A RTT будет работать при пере сбросе питания?
Вот UART сохраняет Link, если Target ресутнуть.
У меня как раз есть условие выхода
Спасибо.
Спасибо за описание решения. Но чем кольцевой буфер отличается от FIFO?
Надо ждать в for(;;) пока UART трансивер под освободит TxFIFO и вложить туда новые данные.
Или просто увеличивать счетчик об ошибках.
Хороший вопрос. Пока у нас разрешена только SafeRTOS
Да. У меня это выглядит так
Как же тогда один кабель Ethernet используется для сотен протоколов внутри трафика?
У меня NoRTOS прошивка.
Спасибо. Надеюсь заметка поможет Вам в программировании микроконтроллеров.
Гениально!
Мне на работе запрещено использовать FreeRTOS так как это "не доверенный код".
Этих CLI для ARMов полно.
Сорцы с реализацией уже скоро на заборах писать будут
Вон хоть у embox реализацию shell-а можно канибаллизировать
https://github.com/embox/embox/tree/e0cd6279507e413916a0dce526da87f486bb144c/src/cmds/shell