2022-03-10 11:04:14 +03:00

50 lines
3.3 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

1. Непонимание что такое "атомарный доступ" и для чего нужно "volatile" при совместной работе разных процессов/ISR с одними данными.
Смотрим например на usart2_getline() вызывающуюся в фоне и usart2_isr() (видимо - ISR), и думаем что будет если прерывание usart2_isr() произойдёт между строкой
int L = linerdy;
и строкой
linerdy = 0;
2. Алгоритм работы с приёмным потоком UART - в корне ущербный. Достаточно подумать, что будет если на большой скорости UART два символа '\n' подряд и в это время фоновая задача будет занята какой-то более-менее длительной работой (а ведь мы знаем что автор сего - ненавистник РТОС, и у него не будет повышен приоритет задаче, разгребающей UART-RX поток ;).
3. Инициализация UART (usart2_setup()) - кривая. Сначала автор программирует DMA на работу с UART, включает его, и только затем включает тактирование UART и инициализирует его.
Также - мультиплексор пинов переключает ноги с GPIO на UART ещё до инициализации самого UART (глитчи обеспечены).
Правильный порядок: 1) инит DMA; 2) инит UART; 3) разрешение DMA; 4) разрешение прерываний; 5) переключение мультиплексора ног GPIO->UART. И не забывать использовать __DMB() где надо.
4. Зачем в main() такое?:
const char dummy[] = "dummy text\n", err[] = "Error!\n";
Видимо чтобы получить как можно более тяжёлый код и занять побольше стека. Автор видимо не знает для чего нужно "static". :unknw:
5. Автор не читает мануал на используемый МК. Если бы читал, не писал бы такое:
USART2_ICR |= USART_ISR_CMF; // clear flag
Читаем описание регистра USART2_ICR и думаем: Что будет с остальными флагами кроме CMF после такой операции? Да и вообще - зачем читать из регистра если для сброса флага нужна запись в него "1"??? Тема эта уже 100500 раз обсасывалась здесь на форуме.
То же самое здесь:
DMA1_IFCR |= DMA_IFCR_CIF4; // clear TC flag
и в других подобных местах. Регистр DMA1_IFCR - write-only! Опять же - RTFM.
Наверняка ещё куча подобных багов есть - смотрел по диагонали.
6. Исходник просто наполнен "магическими" числами - стиль программирования начинающего. Плохой стиль.