Uart dma get interrupt перестает получать данные через несколько минут

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


person masoud    schedule 17.09.2018    source источник


Ответы (1)


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

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

person Lundin    schedule 17.09.2018
comment
Я попробую ваше решение. - person masoud; 21.09.2018
comment
Я решил проблему, сделав как ISR, так и функцию таймера атомарными, используя переменную типа bool, поэтому параметр каждый раз используется одним потоком. - person masoud; 23.09.2018