Uart dma receive interrupt прекращает прием данных через несколько минут - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть проект, в котором я использовал плату обнаружения stm32f746g. Он получает данные фиксированного размера от Uart последовательно, и для информирования приложения о каждом получении данных используется обратный вызов dma (функция HAL_UART_RxCpltCallback). Сначала он работает нормально, но после нескольких минут работы обратный вызов dma перестает вызываться, и в результате указанное значение параметра не обновляется. Поскольку параметр используется и в другом потоке (на самом деле это таймер, определенный rtos), я считаю, что эта проблема вызвана отсутствием безопасности потока. Но моя проблема в том, что мьютекс и семафор не поддерживаются в ISR, и мне нужно защитить свою переменную в обратном вызове dma, который является процедурой прерывания. Я использую Keil RTX для обработки многопоточности и таймер я использую osTimer, который определен в RTX. Как я могу решить проблему?

1 Ответ

0 голосов
/ 17 сентября 2018

Как правило, только один поток должен связываться с ISR.Если несколько потоков обращаются к переменной, используемой совместно с ISR, ваш дизайн неверен и требует исправления.В случае DMA только один поток должен получить доступ к буферу.

Вам нужно будет защитить переменные, совместно используемые этим потоком и ISR - не обязательно с мьютексом / семафором, но, возможно, с чем-то более простым, например, с гарантией атомарногодоступ (лучшее решение, если это возможно), или с помощью непрерываемой возможности, которую имеют многие ISR. Пример для простых однопоточных приложений MCU .В качестве альтернативы просто временно отключите прерывания во время доступа, но это может оказаться невозможным, в зависимости от требований реального времени.

...