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

 
 
> Разместить переменную во flash без модификатора const, Как?
Dreamer
сообщение Nov 6 2009, 15:18
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 13-01-06
Из: Санкт-Петербург
Пользователь №: 13 154



Здравствуйте.
Хочу разместить переменную во flash, а не в ОЗУ.
Сделал следующее:

1. В icf-файл линкера написал следующее:
Код
place at address mem: 0x0001000 { readonly section ConstSection1 };


2. Объявил переменную:
Код
typedef struct
{
    int array[5];
    int value2;
}TEST;

#pragma location = "ConstSection1"
__root const TEST test  = {{0,1,2,3,4},100};


В результате она все равно размещается в rw-data:
(из мап-файла:)
Цитата
ConstSection1 inited 0x400049f8 0x18 THROUGHPUT.o [1]
..............
test 0x400049f8 0x18 Data Gb THROUGHPUT.o [1]


Если объявить test как const TEST test, то тогда размещается так, как я хочу:


Цитата
Section Kind Address Size Object
------- ---- ------- ---- ------
"A1": 0x3c
.intvec ro code 0x00000000 0x3c cstartup.o [4]
- 0x0000003c 0x3c

"A2": 0x18
ConstSection1 const 0x00001000 0x18 THROUGHPUT.o [1]
- 0x00001018 0x18
....................................................................
test 0x00001000 0x18 Data Gb THROUGHPUT.o [1]


Компилятор : IAR ARM 5.0.

Мне бы очень хотелось, чтобы во флаш можно было размещать переменные без модификатора соnst, это сильно упростило бы мне жизнь. Такое возможно?


--------------------
Все врут (с) /M.D.House/
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
V_G
сообщение Nov 9 2009, 14:26
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(Dreamer @ Nov 7 2009, 01:18) *
Здравствуйте.
Хочу разместить переменную во flash, а не в ОЗУ.

Мне бы очень хотелось, чтобы во флаш можно было размещать переменные без модификатора соnst, это сильно упростило бы мне жизнь. Такое возможно?


Это смотря для какого процессора. Почему-то здесь не обсуждают способы доступа к флэшу, как будто программируют в винде какой-нибудь.
Если конкретный микроконтроллер позволяет обеспечить доступ к флэшу, аналогичный доступу к ОЗУ, то и на Си для этого контроллера наверняка его можно организовать.

Например, в семействе avr (не xmega) доступ к флэшу идет довольно сложно: надо записать в адресные регистры адрес переменной, в управляющий регистр дать строб чтения (если надо прочитать), и потом считать регистр данных. Не думаю, что в Си для такого контроллера можно просто разместить данные во флэше и манипулировать ими так же, как в ОЗУ.

В xmega есть memory-mapped режим доступа к флэшу, переменные легко разместить в сегменте ESEG (для ассемблера) и адресоваться к ним для чтения как к простой ячейке памяти просто (со смещением адреса на 0x1000). На Си это тоже реализовать должно быть легко, возможно, уже реализовано. При записи несколько сложнее, т.к. при записи в ячейку, принадлежащую области EEPROM, фактически данные пишутся в буферную память и переписываются во флэш командой записи. Плюс имеется ограничение на объем страницы для записи, так что в компиляторе Си вряд ли кто с этим будет заморачиваться.

Сообщение отредактировал V_G - Nov 9 2009, 14:29
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 13 2009, 13:26
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(V_G @ Nov 9 2009, 16:26) *
Например, в семействе avr (не xmega) доступ к флэшу идет довольно сложно: надо записать в адресные регистры адрес переменной, в управляющий регистр дать строб чтения (если надо прочитать), и потом считать регистр данных.

Таких ужасов как Вы понаписали в AVR нет. Там просто два отдельных адресных просранства (АП) - флеш и ОЗУ, из первого данные читаются инструкцией LPM, из второго - LD. Для первого АП нет инструкции записи ячейки, для второго - есть ST.

Цитата
Не думаю, что в Си для такого контроллера можно просто разместить данные во флэше и манипулировать ими так же, как в ОЗУ.

В этом Вы абсолютно правы, раз команды разные, то компилятор должен точно знать какую команду ему использовать в том или ином случае, а значит без подсказки компилятору в виде __flash и проч. - это сделать никак нельзя. Даже если команды чтения в ARM и для флеш и для ОЗУ одинаковые, то по крайней мере одного только факта, что во флеш __нельзя__ писать, - уже достаточно чтобы понять, что и компилятору надо об этом как-то сказать, чтобы тот ненароком не писанул туда чего.
Go to the top of the page
 
+Quote Post
V_G
сообщение Nov 13 2009, 15:00
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(defunct @ Nov 13 2009, 23:26) *
Таких ужасов как Вы понаписали в AVR нет. Там просто два отдельных адресных просранства (АП) - флеш и ОЗУ, из первого данные читаются инструкцией LPM, из второго - LD. Для первого АП нет инструкции записи ячейки, для второго - есть ST.


К Вашему сведению, в AVR (а также pic-е и в большинстве современных микроконтроллеров) есть 2 (две) области памяти, сделанные по flash-технологии (c электрическим стиранием): программ и данных. Область данных называется EEPROM, и доступ к ней осуществляется именно так, как я описал. Согласен, мне доверять не обязательно, но можно почитать datasheet.
Если топикстартер под флэшью имел в виду область программ, то Вы отчасти правы: LPM. Отчасти, потому, что есть и SPM - несколько более сложная, многовариантная и геморройная инструкция, чем ST (STS), но вполне реализуемая.

Сообщение отредактировал V_G - Nov 13 2009, 15:03
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 13 2009, 15:31
Сообщение #5


Гуру
******

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



Цитата(V_G @ Nov 13 2009, 18:00) *
К Вашему сведению...

В вашему сведению, про ЕЕPROM типа Flash, Вы написали полный бред. И не надо фантазировать на темы "если имел ввиду". Ну и загляните на досуге в документацию, на любимый AVR на предмет того, где там вообще EEPROM находится и почему оно в принципе НЕ является областью памяти контроллера.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
V_G
сообщение Nov 14 2009, 00:44
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Согласен, есть определенная путаница с терминологией. В расширительном толковании флэш - память с электрическим стиранием, и под нее и попадает EEPROM. Сейчас в принципе сложилось довольно четкое разделение этих понятий, но когда я начинал работать с такой памятью лет 25 назад, они были практически синонимами. Так что тут ступил малость, каюсь.

Цитата(zltigo @ Nov 14 2009, 01:31) *
В вашему сведению, про ЕЕPROM типа Flash, Вы написали полный бред. И не надо фантазировать на темы "если имел ввиду". Ну и загляните на досуге в документацию, на любимый AVR на предмет того, где там вообще EEPROM находится и почему оно в принципе НЕ является областью памяти контроллера.


Супермодератор, как всегда, отменно вежлив, но и малость не в теме. Загляните в Xmega manual, особенно внимательно почитайте раздел 4.7.1 Data Memory Mapped EEPROM Access. Успехов!

Более того, если не касаться существующих Си-компиляторов, а рассуждать теоретически, то в принципе можно написать компилятор, который бы предоставлял Си-программисту доступ к EEPROM любого контроллера как к ячейке памяти, хотя бы и с модификатором const, _falsh или любым другим, сигнализирующем об особом порядке работы с данной ячейкой.

Сообщение отредактировал V_G - Nov 14 2009, 01:00
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 14 2009, 13:58
Сообщение #7


Гуру
******

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



Цитата(V_G @ Nov 14 2009, 02:44) *
В расширительном толковании флэш - память с электрическим стиранием, и под нее и попадает EEPROM.
Вот только с точностью до наоборот. EEPROM = Electricaly Erasable Programmable Read Only Memory. То есть флешь является одной из разновидностей общего понятия EEPROM, а не наоборот, как пытаетесь доказать нам вы.


Цитата(V_G @ Nov 14 2009, 03:56) *
А вот это уже по делу и фактически является ответом на вопрос топикстартера.
Вопрос был совсем о другом.


--------------------
На любой вопрос даю любой ответ
"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
V_G
сообщение Nov 15 2009, 00:16
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(Сергей Борщ @ Nov 14 2009, 23:58) *
Вот только с точностью до наоборот. EEPROM = Electricaly Erasable Programmable Read Only Memory. То есть флешь является одной из разновидностей общего понятия EEPROM, а не наоборот, как пытаетесь доказать нам вы.


Вопрос был совсем о другом.


Вопрос топикстартера:
Мне бы очень хотелось, чтобы во флаш можно было размещать переменные без модификатора соnst, это сильно упростило бы мне жизнь. Такое возможно?

Ответ zltigo по поводу возможности написания функции доступа к EEPROM любого контроллера как к ячейке памяти:
Почему не касаться? Уже существующие позволяют, а уж в C++ и сами можете написать функции и перегрузить нужные операторы.

Чем не ответ на вопрос? Особенно, если спрашивающему все-таки (случайно) удобнее держать константы на во флэше программ, а в EEPROM данных.
Хотя если задача состоит не в том, чтобы ответить на вопрос (может быть, даже начинающего), а пофлеймить, уличить участника в глупости и помериться ммм... интеллектами, то на здоровье!

Сообщение отредактировал V_G - Nov 15 2009, 00:20
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Dreamer   Разместить переменную во flash без модификатора const   Nov 6 2009, 15:18
- - zltigo   Цитата(Dreamer @ Nov 6 2009, 18:18) Такое...   Nov 6 2009, 17:43
- - Dreamer   ЦитатаЭ.... ЗАЧЕМ!??? Думаете, что ее сможете ...   Nov 9 2009, 08:20
|- - GetSmart   Цитата(Dreamer @ Nov 9 2009, 14:20) Мне ж...   Nov 9 2009, 08:30
|- - HARMHARM   Гуглите const correctness. Нормально написанная фу...   Nov 9 2009, 08:35
|- - zltigo   Цитата(HARMHARM @ Nov 9 2009, 11:35) Норм...   Nov 9 2009, 09:03
- - Dreamer   GetSmart, с принудительным преобразованием типов п...   Nov 9 2009, 11:22
|- - zltigo   Цитата(Dreamer @ Nov 9 2009, 14:22) А выс...   Nov 9 2009, 11:50
- - Dreamer   zltigo, Почему вы считаете, что если по вашему мн...   Nov 9 2009, 13:07
|- - zltigo   Цитата(Dreamer @ Nov 9 2009, 16:07) счита...   Nov 9 2009, 13:33
- - KRS   А чего вы хотите? Как линкер может разместить данн...   Nov 9 2009, 13:17
- - Dreamer   ЦитатаКак линкер может разместить данные которые м...   Nov 9 2009, 13:33
- - Dreamer   ЦитатаДа, Ваши "желания" это показывают ...   Nov 9 2009, 13:50
|- - zltigo   Цитата(Dreamer @ Nov 9 2009, 16:50) Какое...   Nov 9 2009, 14:21
|- - Сергей Борщ   Цитата(V_G @ Nov 9 2009, 16:26) В xmega е...   Nov 9 2009, 16:49
||- - zltigo   Цитата(V_G @ Nov 14 2009, 03:44) Заглянит...   Nov 14 2009, 01:22
|||- - V_G   Цитата(zltigo @ Nov 14 2009, 11:22) А это...   Nov 14 2009, 01:56
||- - defunct   Цитата(V_G @ Nov 15 2009, 02:16) Хотя есл...   Nov 15 2009, 00:34
||- - Сергей Борщ   Цитата(V_G @ Nov 15 2009, 02:16) Вопрос т...   Nov 15 2009, 17:56
||- - zltigo   Цитата(Сергей Борщ @ Nov 15 2009, 20:56) ...   Nov 15 2009, 18:03
||- - Сергей Борщ   Цитата(zltigo @ Nov 15 2009, 20:03) потом...   Nov 16 2009, 11:37
||- - zltigo   Цитата(Сергей Борщ @ Nov 16 2009, 14:37) ...   Nov 16 2009, 11:43
|- - defunct   Цитата(V_G @ Nov 13 2009, 17:00) К Вашему...   Nov 13 2009, 15:33
- - Dreamer   Итить, опять двадцать пять. Опять "трансформ...   Nov 9 2009, 14:52
|- - zltigo   Цитата(Dreamer @ Nov 9 2009, 17:37) В тем...   Nov 9 2009, 14:54
- - Dreamer   Цитатаа не используете "свои другие решения...   Nov 9 2009, 15:16
|- - HARMHARM   Цитата(Dreamer @ Nov 9 2009, 17:16) Но эт...   Nov 9 2009, 16:38
- - Dreamer   Сергей Борщ, я сначала специально не давал дальней...   Nov 9 2009, 17:14
- - KRS   да можно это сделать в IAR, можно! Просто надо...   Nov 9 2009, 21:19
- - Dreamer   Сергей Борщ. Вы абсолютно правильно меня поняли. ...   Nov 17 2009, 10:57
|- - zltigo   Цитата(Dreamer @ Nov 17 2009, 13:57) Серг...   Nov 17 2009, 11:16
- - sigmaN   Не понял. Если НЕ НУЖНО, то чего бы там const не ...   Nov 17 2009, 13:59


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

 


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


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