|
Разместить переменную во flash без модификатора const, Как? |
|
|
|
Nov 6 2009, 15:18
|
Участник

Группа: Участник
Сообщений: 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/
|
|
|
|
|
 |
Ответов
|
Nov 9 2009, 14:26
|

Профессионал
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Nov 13 2009, 13:26
|

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

|
Цитата(V_G @ Nov 9 2009, 16:26)  Например, в семействе avr (не xmega) доступ к флэшу идет довольно сложно: надо записать в адресные регистры адрес переменной, в управляющий регистр дать строб чтения (если надо прочитать), и потом считать регистр данных. Таких ужасов как Вы понаписали в AVR нет. Там просто два отдельных адресных просранства (АП) - флеш и ОЗУ, из первого данные читаются инструкцией LPM, из второго - LD. Для первого АП нет инструкции записи ячейки, для второго - есть ST. Цитата Не думаю, что в Си для такого контроллера можно просто разместить данные во флэше и манипулировать ими так же, как в ОЗУ. В этом Вы абсолютно правы, раз команды разные, то компилятор должен точно знать какую команду ему использовать в том или ином случае, а значит без подсказки компилятору в виде __flash и проч. - это сделать никак нельзя. Даже если команды чтения в ARM и для флеш и для ОЗУ одинаковые, то по крайней мере одного только факта, что во флеш __нельзя__ писать, - уже достаточно чтобы понять, что и компилятору надо об этом как-то сказать, чтобы тот ненароком не писанул туда чего.
|
|
|
|
|
Nov 13 2009, 15:00
|

Профессионал
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Nov 14 2009, 00:44
|

Профессионал
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Nov 14 2009, 13:58
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Nov 15 2009, 00:16
|

Профессионал
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Nov 15 2009, 17:56
|

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

|
Цитата(V_G @ Nov 15 2009, 02:16)  Вопрос топикстартера: Мне бы очень хотелось, чтобы во флаш можно было размещать переменные без модификатора соnst, это сильно упростило бы мне жизнь. Такое возможно? Ну и где здесь про необходимость модифицировать данные, размещенные во флешь? Вы ветку читали, или только первое и последнее сообщение? Автору надо передать в функцию указатель на данные, размещенные во флешь. Функция ингода (в зависимости от других параметров) может модифицировать передаваемые ей по указателю данные (поэтому автор не может объявить параметр как указатель на константу), но в моменты вызова функции с указателем на флешь другие параметры не допускают такой модификации. Привет ассемблерщикам.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 15 2009, 18:03
|

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

|
Цитата(Сергей Борщ @ Nov 15 2009, 20:56)  Функция ингода (в зависимости от других параметров) может модифицировать передаваемые ей по указателю данные Лично я такого не понял. Цитата (поэтому автор не может объявить параметр как указатель на константу) Просто не догадался, потом наконец-то так сделал, отписал: "сейчас так и сделано", но продолжил наводить тень на плетень как "сделать, как я хочу" и "вопрос-то был не в том".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
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          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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|