mirror of
https://github.com/eddyem/stm32samples.git
synced 2026-03-21 09:11:00 +03:00
restructuring
This commit is contained in:
49
F1:F103/BUGS
Normal file
49
F1:F103/BUGS
Normal 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. Исходник просто наполнен "магическими" числами - стиль программирования начинающего. Плохой стиль.
|
||||
Reference in New Issue
Block a user