|
IAR Optimization, Точнее тупизм |
|
|
|
Mar 4 2010, 08:12
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(KSN @ Mar 4 2010, 10:58)  Тогда получается, что надо в RAM создать копию "eeprom" и работать с ним? Или работать с указателем на область конфигурации, который совершенно не обязательно должен декларироваться, как указатель на константы. Ну и исходник  - имена констант (про имена в венгерском стиле молчу), макрос без скобок, стуктуры без typedef, всякие байтовые переменные, неиспользование memset(), явные преобразования типов без надобности.....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 4 2010, 08:43
|
Местный
  
Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304

|
Цитата(Сергей Борщ @ Mar 4 2010, 14:36)  Логика подсказывает, что в этом случае нужно делать const volatile. Тоже так думал, на что компилятор возражал: Error[Be006]: Conflicting attributes for segment/section "FLASH"
|
|
|
|
|
Mar 5 2010, 11:04
|
Местный
  
Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304

|
В продолжение ответов на мой вопрос возник еще один вопрос о использовании указателя на область конфигурации. Каким способом "настраивать" его на необходимую переменную? Пока я вижу 1 способ: Код #define VALUE_ONE 0 #define VALUE_TWO 1
#pragma location="FLASH" __root const uint32_t valueOne = 2000; #pragma location="FLASH" __root const uint32_t valueTwo = 3000;
uint32_t* toFlash[] = { (uint32_t*)& valueOne, (uint32_t*)& valueTwo, }; ..... temp = *toFlash[VALUE_ONE]; // работаю со значением valueOne Хотел следующий способ использовать: Код #pragma location="FLASH" __root const uint32_t valueOne = 2000; #pragma location="FLASH" __root const uint32_t valueTwo = 3000;
uint32_t* toFlash; ..... toFlash = (uint32_t*)&valueOne; temp = *toFlash; но, при оптимизации подставляется значение константы. Еще вариант: для каждой переменной создавать свою section, но будет очень монстроидально. Есть еще варианты?
|
|
|
|
|
Apr 27 2010, 10:30
|
Участник

Группа: Участник
Сообщений: 33
Регистрация: 23-09-05
Пользователь №: 8 857

|
Цитата(Сергей Борщ @ Mar 4 2010, 12:36)  Логика подсказывает, что в этом случае нужно делать const volatile. А для этого желательно понять простые вещи: Модификатор const распологает константу в флэш-памяти (ROM) без иниицализации, просто число. Переменная без модификатора располагается в RAM и инициализируется в коде программы. Модификатор volatile указывает, что переменная может быть изменена "извне" и данный модификатор часто используется для того, чтобы код с использованием такой переменной не оптимизировался, даже с включенной оптимизацией. Соответственно с константой его в принципе нельзя использовать.
|
|
|
|
|
Apr 28 2010, 03:00
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(Sajan @ Apr 27 2010, 17:30)  Модификатор const распологает константу в флэш-памяти (ROM) без иниицализации, просто число. Заблуждение. Где лежат константыне объекты том же AVR? И в любом загружаемом проце - хоть пень, хоть DSP какой-нить?  Констатный объект - это такой, который не должен и не может быть изменен во время работы программы (при попытке сделать это обещано неопредленное поведение). А то, что там, где можно безопасно размещать такие объекты в ПЗУ, так это частный случай, и компилятор разумно пользуется этой возможностью. Цитата(Sajan @ Apr 27 2010, 17:30)  Модификатор volatile указывает, что переменная может быть изменена "извне" и данный модификатор часто используется для того, чтобы код с использованием такой переменной не оптимизировался, даже с включенной оптимизацией. Соответственно с константой его в принципе нельзя использовать. Уже привели пример: read only special function register. Например, регистр данных приемника UART'а - чтение из него, как правило, сбрасывает флаг прерывания.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|