2 Сергей Борщ
Цитата
Ну хотя бы по диагонали остальные просмотреть стоит.
А я и не отрицал этого. Разумеется я просматриваю подробно оглавление и мельком каждую главу. Это необходимое условие что бы иметь общее представление и возможность ориентации. По-другому никак. Иначе как оперативно найти нужные ответы? Углубленно изучаю только необходимые в данный момент главы. Вообщем как справочник.
Цитата
С volatile const никак не связан, они существуют отдельно сами по себе.
Объясните мне в чём такая принципиальная разница? Хотябы небольшая?
Цитата
volatile заставляет компилятор при упоминании этого значения каждый раз считывать его заново, а не использовать сохраненное где-то считанное ранее значение.
Зачем это делать? Какое сохранение времени, тиков? Чтение из flash одна инструкция процессора (LDR PC, Reset_Addr)
Цитата
а не использовать сохраненное где-то считанное ранее значение.
Как это понимать? Если мы присвоим x=*adr, то что компилятор будет наивно полагать что переменная х никогда не изменится и будет использовать её как источник адреса? Хотя выигрыша мы не получим, нельзя оптимизировать одну инструкцию процессора, если не выкинуть её вообще.
Извините, если кому-то покажется агрессивным стиль написание, так получилось.
Цитата
Дословно *(unsigned long *) 0xFFFFF000 означает "значение типа unsigned long, на которое указывает указатель, содержащий адрес 0xFFFFF000". Или, что тождественно, "значение типа unsigned long, находящееся по адресу 0xFFFFF000".
Ну если быть точным, насколко я понял, то выражение полностью выглядит так:
#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000))
и означает определение метки VICIRQStatus которое указывает на облость памяти с константой u long имеющую значение 0xFFFFF000. Обращаю особое внимание на слова МЕТКИ, а не указателя. Метка это число, таже константа и менятся не может, а указатель это переменная и может указывать на что угодно в любой момент времени, смотря сто занесёшь туда.
Цитата
Если он это значение недавно прочитал, и сам с тех пор не менял, то вправе предположить, что значение осталось неизменным и использовать сохраненное значение, экономя такты и/или код на повторном обращении к памяти.
Дело в том, что компилятор не может недавно прочитать значение по ссылке . Ссылка это переменная. Недавно прочитать может только работающая программа. Когда компилятор уже давно сделал сваи дела и гордо удалился.
В общем, подвожу итог: структура define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000)) разложена по полочкам, стала понятна, появилась осмысленная возможность её использование. Хотя некоторые аспекты так и не объяснены (например, расположение звезды справа).