Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не надо оптимизировать
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
toweroff
Отдельный кусок с 3-мя циклами записи в external компилятор гонит полную чушь (но не с его, компилятора, точки зрения). В результате получаю 2 вместо трех шинных операций. Код для идентификациии чипа flash банален:

*((unsigned int*) (0x80000000 + (0x555<<2))) = 0xAA00;
*((unsigned int*) (0x80000000 + (0x2AA<<2))) = 0x5500;
*((unsigned int*) (0x80000000 + (0x555<<2))) = 0x9000;

Смещение на 2 разряда - т.к. шина 32 бита

в результате осциллом вижу только два обращения (записи) в память

Смещение на 8 бит - условие организации не от меня зависящей памяти

дополню:
Код
   281:         *((unsigned int*) (0x80000000 + (0x2AA<<2))) = 0x5500;
0x00002EA0  E3A01C55  MOV       R1,#0x00005500
   280:         *((unsigned int*) (0x80000000 + (0x555<<2))) = 0xAA00;
   281:         *((unsigned int*) (0x80000000 + (0x2AA<<2))) = 0x5500;
0x00002EA4  E3A00102  MOV       R0,#0x80000000
0x00002EA8  E58B1AA8  STR       R1,[R11,#0x0AA8]
0x00002EAC  E2800A01  ADD       R0,R0,#0x00001000
   282:         *((unsigned int*) (0x80000000 + (0x555<<2))) = 0x9000;
   283:


более из того куска компилятор не сделал


как компилятор заставить делать именно то (в данном случае) что я хочу? Есть ли описание C для Keil (ARM), чтобы не дергать лишний раз всех?
aaarrr
Компилятор все делает правильно. Используйте volatile unsigned int.
toweroff
Цитата(aaarrr @ Mar 26 2009, 03:48) *
Компилятор все делает правильно. Используйте volatile unsigned int.


вот о чем я и говорю - где взять под Keil описание С? Не пойму, чем volatile отличается от простто (type)
aaarrr
Есть стандарты C89/C90/C99, у Кейла есть документация, в которой описаны отличия и особенности реализации (и volatile в эту категорию ну никак не попадает).
toweroff
Цитата(aaarrr @ Mar 26 2009, 04:15) *
Есть стандарты C89/C90/C99, у Кейла есть документация, в которой описаны отличия и особенности реализации (и volatile в эту категорию ну никак не попадает).


ок, перекопаю доки. Но все равно, описание (даже просто функции и типы данных с размерностью и способом хранения) для меня на данный момент - загадка, Keil это, в отличие от x51 не предоставляет в пакете
aaarrr
Чем Keil-то провинился? Это вещи стандартные для языка, вне зависимости от конкретного типа компилятора.
toweroff
Цитата(aaarrr @ Mar 26 2009, 11:32) *
Чем Keil-то провинился? Это вещи стандартные для языка, вне зависимости от конкретного типа компилятора.


да ничем, просто когда делал что-то под х51 было очень удобно пользоваться хелпом по С и всяким функциям, особенно где кто что требует из хидеров и типы параметров.

по volatile нашел... заставляет компилятор каждый раз обновлять значение из памяти, а не пользоваться регистрами. Indicates that a variable can be changed by a background routine.
diwil
Цитата(toweroff @ Mar 26 2009, 11:47) *
да ничем, просто когда делал что-то под х51 было очень удобно пользоваться хелпом по С и всяким функциям, особенно где кто что требует из хидеров и типы параметров.

по volatile нашел... заставляет компилятор каждый раз обновлять значение из памяти, а не пользоваться регистрами. Indicates that a variable can be changed by a background routine.


не совсем точно...
волатила означает, что переменная _может_ меняться неизвестным компилеру образом.
А это влечет за собой то, что все операции с переменной должны быть атомарными.
В любом случае, при записи по физическим адресам лучше использовать volatile
Vladimir_T
Здравствуйте, уважаемые коллеги. В продолжении темы хотел спросить: если из прерывания модифицирую переменные, к примеру программные счетчики или флаги их также можно объявлять, как volatile. Может такое объявление добавить надежности в работе системы?
aaarrr
Если эти счетчики/флаги используются не только в прерывании, то их нужно объявлять как volatile.
KRS
Цитата(diwil @ Mar 26 2009, 12:44) *
А это влечет за собой то, что все операции с переменной должны быть атомарными.

должны то должны! но вот компилер об этом заботится не будет.
Компилер будет читать из памяти переменную всякий раз (столько раз сколько имя упоминается)
и писать тоже столько раз сколько присваивание происходит!
Но операции атомарными будут не всегда! рид модифи райт атомарной не будет, даже загрузка не всегда будет атомарной ( если нельзя сгенерировать одной асм командой).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.