Цитата(Alex_inventor @ Jan 28 2007, 03:40)

Объясните мне в чём такая принципиальная разница? Хотябы небольшая?
Между const и volatile? В том что const запрещает запись в пременную (и при попытке такой записи компилятор выдаст ошибку) а volatile не запрещает.
Цитата(Alex_inventor @ Jan 28 2007, 03:40)

Зачем это делать? Какое сохранение времени, тиков? Чтение из flash одна инструкция процессора
Во-первых флеш (и ОЗУ) бывает медленной, и одна инструкция с доступом в память может занимать далеко не один такт процессора.
Во-вторых не забывайте, что ширина инструкции 32 бита, ширина адреса тоже 32 бита, поэтому одной командой можно обратиться лишь к ячейке, находящейся сравнительно недалеко от адреса, из которого берется инструкция (куда указывает PC). Для доступа к остальным ячейкам используется косвенная адресация, их адрес надо сначала загрузить в регистр из ячейки, в которую можно "дотянуться" в регистр, а уже потом косвенно по содержимому регистра считать значение. В режиме THUMB ширина инструкции 16 бит, развивать мысль?
Цитата(Alex_inventor @ Jan 28 2007, 03:40)

Цитата
а не использовать сохраненное где-то считанное ранее значение.
Как это понимать? Если мы присвоим x=*adr, то что компилятор будет наивно полагать что переменная х никогда не изменится и будет использовать её как источник адреса?
"Ппереведи!"

Наоборот, он будет вполне резонно полагать что *adr не изменится и использовать вместо него x.
Вот смотри пример:
Код
int z = 7;
int *adr = &z;
int x = *adr;
int y = *adr; //(1)
z = x + y;
В данном случае компилятор имеет право в точке (1) не считывать в y содержимое памяти *adr а использовать для инициализации y значение х. Даже более того, он может вообще не создавать addr, а сразу использовать значение 7. И вообще весь этот код превратить в z = 14. А вот в случае
Код
int z = 7;
int volatile *adr = &z;
int x = *adr; //(1)
int y = *adr; //(2)
z = x + y;
мы его заставляем в точках (1) и (2) сгенерировать чтения ячейки z. Ведь если z это, например, таймер, то между точками (1) и (2) его значение могло измениться.
Цитата(Alex_inventor @ Jan 28 2007, 03:40)

Извините, если кому-то покажется агрессивным стиль написание, так получилось.

Еще не все потеряно - стиль можно изменить.
Цитата(Alex_inventor @ Jan 28 2007, 03:40)

Ну если быть точным, насколко я понял, то выражение полностью выглядит так:
#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000))
Что ж, разберем его "по косточкам":
0xFFFFF000 - константа.
(unsigned long *)0xFFFFF000 - указатель на unsigned long, содержащий (указатель содержит, а не unsigned long) адрес 0xFFFFF000
(volatile unsigned long *) 0xFFFFF000 - указатель на unsigned long, содержащий адрес 0xFFFFF000, при этом содержимое ячейки, куда он указывает, может изменитья в любой момент. Поэтому каждый раз, когда в программе встречается обращение по этому указателю, надо считывать эту ячейку (пример см. выше).
((volatile unsigned long *) 0xFFFFF000) - то же самое.
*((volatile unsigned long *) 0xFFFFF000) - содержимое ячейки, на которую указывает вышеописанный указатель.
(*((volatile unsigned long *) 0xFFFFF000)) - то же самое.
Цитата(Alex_inventor @ Jan 28 2007, 03:40)

область памяти с константой u long имеющую значение 0xFFFFF000
Нет. это не константа имеет значение 0xFFFFF000, а область памяти имеет фиксированное расположение по адресу 0xFFFFF000. И содержимое области памяти константой не является. Причем заметьте, с точки зрения языка С квалификатор
const вместе с
volatile не говорит о том, что переменная не может измениться, а говорит лишь о том, что в эту переменную запрещена запись. И в вашем определении VICIRQStatus присутствует ошибка - в VICIRQStatus запись запрещена, определение должно выглядеть так:
Код
#define VICIRQStatus (*((volatile unsigned long const *) 0xFFFFF000))
И еще раз обращу внимание, что тут описан не константный указатель, а указатель на константу (на ячейку в которую запрещена запись).
Цитата(Alex_inventor @ Jan 28 2007, 03:40)

Дело в том, что компилятор не может недавно прочитать значение по ссылке . Ссылка это переменная. Недавно прочитать может только работающая программа. Когда компилятор уже давно сделал сваи дела и гордо удалился.

Ну не придирайтесь к словам. Пусть будет "Компилятор может со 100% вероятностью рассчитать какое значение будет иметь переменная в этой точке не считывая ее в этом месте".
Цитата(Alex_inventor @ Jan 28 2007, 03:40)

В общем, подвожу итог: структура define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000)) разложена по полочкам, стала понятна, появилась осмысленная возможность её использование. Хотя некоторые аспекты так и не объяснены (например, расположение звезды справа).

У меня сложилось впечатление что разложена она не по тем полочкам. Постарался изложить макимально подробно. Если "звезда справа" все еще смущает - читайте все доступные материалы про указатели.