
Re: GCC_MEMORY_BARRIER() при AVR GCC
Е то за AVR няма чак такива кешове и мултипроцесорни истории...
Просто ГЦЦ има оптимазиции, които могат да разбъркат кода както си искат. Спазва се само крайния резултат. Примерно имаш две променливи, в едната правиш сметки, сметки, сметки... и като свършиш вдигаш другата променлива като флагче. След като се изпълни целия код, флагчето ще е вдигнато и сметката ще е вярна. Това ти е гарантирано. Обаче не е гарантирана последователността, демек флагчето може да се вдигне и преди сметките да са свършели.
И ако имаш друг код, примерно прекъсване в таймер дето полира флагчето може да стане инфекция...
Единият вариант естествено е да направиш volatile променливите. Но ако имаш много променливи и всички да ги правиш volatile е кофти. Ще вържеш ръцете на оптимизациите. А другия вариант е с тия бариери. Тя ти гарантира, че всичко дето го има като сметки и работа с паметта ще бъде направено преди да почне да се изпълнява код след бариерата...
Между другото не е зле да сложиш volatile на (преди) asm-то... Ей тъй като навик просто. В случая нямаш код в асемблито, само бариерата. Но някъде ще сложиш код и ще се чудиш що не бачка. Просто асемблера също подлежи на оптимизации... а ти едва ли очакваш някай да ти бара асемблера
