restructuring

This commit is contained in:
2022-03-10 11:04:14 +03:00
parent 29560b7c0c
commit 733dbd75d2
1758 changed files with 14 additions and 26855 deletions

49
F1:F103/BUGS Normal file
View File

@@ -0,0 +1,49 @@
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. Исходник просто наполнен "магическими" числами - стиль программирования начинающего. Плохой стиль.