ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 июля
660844 Топик полностью
il-2 (17.03.2016 16:17, просмотров: 211) ответил Apтём на Хм, RTOS говорите...
В общем, все оказалось как в анекдоте про сороконожку, когда ее вдруг спросили как она не путается в ногах когда ходит: Берем классический пример - кольцевой буфер, в который приходят данные. Соответственно "голова" буфера меняется в обработчике прерывания при приеме данных (или это регистр DMA в случае работы через DMA). Соответственно - в основной программе данные берутся из "хвоста" буфера, и "хвост" перемещается вслед за "головой". В основной программе необходимо отслеживать изменение "головы". Для этого ее необходимо объявить через volatile. У меня последние 5 лет (в USART, SPI, ADC и пр.) в качестве "головы" используется регистр CNDTR(это регистр DMA у STM32). А он же бля - volatile!!!(как и полагается периферийному регистру). Что касается RTOS, то с ней все-же можно обойтись без volatile - с помощью семафора(или события). Когда в обработчике прерывания выдаешь сигнал(или событие) после того как положил данные в буфер, а в основной программе висишь на семафоре(событии) и принимаешь данные как только тебе просигналят.