реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> IAR Optimization, Точнее тупизм
KSN
сообщение Mar 4 2010, 07:58
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Ага, понял. Просто без const переменная не размещается во flash (одну страницу использую как "eeprom" для настроек). Тогда получается, что надо в RAM создать копию "eeprom" и работать с ним?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 4 2010, 08:12
Сообщение #17


Гуру
******

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



Цитата(KSN @ Mar 4 2010, 10:58) *
Тогда получается, что надо в RAM создать копию "eeprom" и работать с ним?

Или работать с указателем на область конфигурации, который совершенно не обязательно должен декларироваться, как указатель на константы. Ну и исходник sad.gif sad.gif - имена констант (про имена в венгерском стиле молчу), макрос без скобок, стуктуры без typedef, всякие байтовые переменные, неиспользование memset(), явные преобразования типов без надобности.....


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 4 2010, 08:36
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(KSN @ Mar 4 2010, 09:58) *
Ага, понял. Просто без const переменная не размещается во flash (одну страницу использую как "eeprom" для настроек).
Логика подсказывает, что в этом случае нужно делать const volatile.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
KSN
сообщение Mar 4 2010, 08:43
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Цитата(Сергей Борщ @ Mar 4 2010, 14:36) *
Логика подсказывает, что в этом случае нужно делать const volatile.

Тоже так думал, на что компилятор возражал: Error[Be006]: Conflicting attributes for segment/section "FLASH"
Go to the top of the page
 
+Quote Post
KSN
сообщение Mar 5 2010, 11:04
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 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, но будет очень монстроидально. Есть еще варианты?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 5 2010, 11:27
Сообщение #21


Гуру
******

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



Цитата(KSN @ Mar 5 2010, 14:04) *
я вижу...

Непонятная каша какая-то sad.gif.
Говорите, что где-то во Flash находится СТРУКТУРА со всеми Вашими конфигурационными данными - присваиваете этот адрес ГЛОБАЛЬНОМУ указателю на структуру. И работаете с ней.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 5 2010, 11:31
Сообщение #22


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(KSN @ Mar 5 2010, 14:04) *
Есть еще варианты?

Использовать структуры.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Sajan
сообщение Apr 27 2010, 10:30
Сообщение #23


Участник
*

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



Цитата(Сергей Борщ @ Mar 4 2010, 12:36) *
Логика подсказывает, что в этом случае нужно делать const volatile.

А для этого желательно понять простые вещи:
Модификатор const распологает константу в флэш-памяти (ROM) без иниицализации, просто число.
Переменная без модификатора располагается в RAM и инициализируется в коде программы.
Модификатор volatile указывает, что переменная может быть изменена "извне" и данный модификатор часто используется для того, чтобы код с использованием такой переменной не оптимизировался, даже с включенной оптимизацией. Соответственно с константой его в принципе нельзя использовать.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 27 2010, 10:57
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Sajan @ Apr 27 2010, 14:30) *
Соответственно с константой его в принципе нельзя использовать.

Откуда вдруг такой вывод? Еще как можно.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Apr 27 2010, 16:57
Сообщение #25


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Для примера возьмем read only регистр какой-нибудь.
Его правильнее объявить как volatile const, чтобы компилятор случае чего ругался, если кто-то захочет(по неосторожности) писАть в этот рид онли регистр.
В тоже время volatile заставит компилятор при обращении к регистру каждый раз РЕАЛЬНО СЧИТЫВАТЬ данные, а не заниматься оптимизацией.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 28 2010, 03:00
Сообщение #26


Adept
******

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



Цитата(Sajan @ Apr 27 2010, 17:30) *
Модификатор const распологает константу в флэш-памяти (ROM) без иниицализации, просто число.

Заблуждение. Где лежат константыне объекты том же AVR? И в любом загружаемом проце - хоть пень, хоть DSP какой-нить? smile.gif Констатный объект - это такой, который не должен и не может быть изменен во время работы программы (при попытке сделать это обещано неопредленное поведение). А то, что там, где можно безопасно размещать такие объекты в ПЗУ, так это частный случай, и компилятор разумно пользуется этой возможностью.

Цитата(Sajan @ Apr 27 2010, 17:30) *
Модификатор volatile указывает, что переменная может быть изменена "извне" и данный модификатор часто используется для того, чтобы код с использованием такой переменной не оптимизировался, даже с включенной оптимизацией. Соответственно с константой его в принципе нельзя использовать.

Уже привели пример: read only special function register. Например, регистр данных приемника UART'а - чтение из него, как правило, сбрасывает флаг прерывания.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 8th July 2025 - 02:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01475 секунд с 7
ELECTRONIX ©2004-2016