|
Разместить переменную во 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
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|