ibiza11 писал(а)::evil: бред! зачем объявлять указатель на массив volatile? он что, у Вас в прерывании меняется?
А что... volatile применяется только лишь при работе с прерываниями???
Я предложил volatile всего лишь как вариант, а не панацею...
естественно volatile будет работать в этом случае, поскольку при каждом обращении к указателю будет производиться его преддекремент. Но это равносильно отключению оптимизации этого указателя. Так делать нельзя.
Was ist das... "нельзя"???
Это одно из применений volatile... указать оптимизатору "это не твоё - не тронь!"...
В данном случае, скорее всего, можно обойтись и без volatile... здесь возможны и варианты...
Но имеются и другие прецеденты... когда пользуются указателями и структурами завязанными на порты и периферию без volatile...
А если "злобный" Code Reordering... что прикажете делать???
Реальный случай переноса рабочего проекта с STM32 на PIC24...
Пакетная передача по SPI... подготовка данных-ожидание флага готовности-передача данных... и так девять раз подряд, чтобы всё успевало... И что делает GCC С30 ??? Он аккуратно складывает по порядку подготовка данных, подготовка данных, подготовка данных... ожидание флага готовности, ожидание флага готовности, ожидание флага готовности... передача данных, передача данных, передача данных... жесть!!!
Порвал строку подготовки данных пополам (а больше там и разорвать было нечего), ввёл дополнительную переменную - подготовка данных-ожидание флага готовности, подготовка данных-ожидание флага готовности, подготовка данных-ожидание флага готовности... передача данных, передача данных, передача данных...
И только когда объявил дополнительную переменную как volatile, всё стало на свои места...
А ведь на STM32 всё работало как надо...