Для кого-то похожа, для кого-то нет. И очевидно есть веские обстоятельства, почему так.
memset меняет значение области памяти в текущем программном контексте. Компилятор знает что изменяется и в какой момент времени. В случае с дма-трансфером у компилятора нет информации о том, что какая-то область памяти подвергнется изменениям или эта область будет как-то использована. Если не "зажать" область памяти (переменную) с помощью volatile, то компилятор может попытаться соптимизировать, высвободить или переиспользовать это пространство со всеми вытекающими. Вы подготовили буфер к отправке, передали указатели в блок DMA, но к моменту, когда дело дойдет до реальной передачи, эта область памяти может быть использована компилятором по своему, а не вашему усмотрению.
Что вы заладили с этим своим воидом. Не играет оно тут никакой роли.кстати, о проблемах: характерный источник проблем зачастую кроется именно в том, что написано не то, что подразумевается. и в данном контексте, как я уже говорил, лучший вариант интерфейса этой функции - указатель void*, демонстрирующий полное безразличие функции к данным по этому адресу.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3895477#p3895477"]ARV, вы задаёте правильный, но очень неудобный вопрос.[/uquote]
Вам он что-ли неудобный? То, что правильное значение указателя будет записано в CPAR/CMAR независимо от наличия volatile в параметрах фунции, ежу понятно и никогда и ни кем здесь не оспаривалось. Вы что и кому доказываете здесь с упорством, достойным лучшего применения?
Чепуху вы в очередной раз накидали. Пламенный ответ на вопрос, который вам никто не задавал.За неимением HAL-а, накидал простенький пример, иллюстрирующий обсуждаемый вопрос.


