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

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

|
Итить, опять двадцать пять. Опять "трансформация реальности через свою любимую голову". Я говорю - имеет, а он мне в ответ - "не имеет". Мне-то лучше знать, к чему имеет отношение мой вопрос. В вопросе был указан конкретный компилятор. Тема была поднята очень специфичная, так как речь шла о выяснении, существует ли в конкретном компиляторе такая же особенность, как в другом компиляторе. В теме "начинающих" на такие вопросы даже отвечать не будут. Кстати, zltigo, раз уж вы взяли на себя роль бога, то и вопрос соответствующий - вы собственник этого ресурса, соучередитель, или только модератор? Цитата(V_G @ Nov 9 2009, 17:26)  Это смотря для какого процессора. NXP LPC2388. Цитата Почему-то здесь не обсуждают способы доступа к флэшу, как будто программируют в винде какой-нибудь. Я не знаю, почему. Видимо, потому что на форум пришел новый человек, и важнее слить его вопрос в остстойник и продемонстрировать собственную крутость, чем оказать реальную помощь. Я уже понял, что раз сразу простого и понятного ответа не последовало, то не получится. Это не приведет меня в тупик, есть на это у меня другое решение. Результат важнее, чем способы его достижения. Модератор (rezident). Фиксирую нарушение п.2.1в (флейм) и п.3.7 (пока еще не внесенный, публичное обсуждение действий модератора) Правил форума. Рекомендую внимательно ознакомится с Правилами и структурой форума.
--------------------
Все врут (с) /M.D.House/
|
|
|
|
|
Nov 9 2009, 14:54
|

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

|
Цитата(Dreamer @ Nov 9 2009, 17:37)  В теме "начинающих" на такие вопросы даже отвечать не будут. HARMHARM ответил, я ответил. Рад, что Вы теперь знаете и делаете правильно а не используете "свои другие решения", типа копирования структур, не лезущие ни в какие ворота. Цитата Кстати, zltigo, раз уж вы взяли на себя роль бога, то и вопрос соответствующий - вы собственник этого ресурса, соучередитель, или только модератор? Moderator: Настоятельно рекомендую изучить правила и структуру форума - будет ясно, где задавать вопросы и как обжаловать действия модераторов. При попытке продолжить разговоры в этой ветке будут приняты административные меры.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 9 2009, 15:16
|
Участник

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

|
Цитата а не используете "свои другие решения", типа копирования структур, не лезущие ни в какие ворота. Но это же только Ваше ИМХО. Еще раз повторяю - есть программы, где это работает, причем работает прекрасно и без побочных эффектов.
--------------------
Все врут (с) /M.D.House/
|
|
|
|
|
Nov 9 2009, 16:38
|

читатель даташитов
   
Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999

|
Цитата(Dreamer @ Nov 9 2009, 17:16)  Но это же только Ваше ИМХО. Еще раз повторяю - есть программы, где это работает, причем работает прекрасно и без побочных эффектов. Это только до тех пор, пока Вы помните, где и какие Вы заложили грабли. Как только код передается другому человеку, или Вы в него полгода не заглядываете, следует удар по лбу (а то и не один). Понятно, что сделать так можно, в этом никто не сомневается, равно как и в Вашей способности разобраться самостоятельно.
|
|
|
|
|
Nov 9 2009, 16:49
|

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

|
Цитата(V_G @ Nov 9 2009, 16:26)  В xmega есть memory-mapped режим доступа к флэшу, переменные легко разместить в сегменте ESEG (для ассемблера) и адресоваться к ним для чтения как к простой ячейке памяти просто (со смещением адреса на 0x1000). На Си это тоже реализовать должно быть легко, возможно, уже реализовано. При записи несколько сложнее, т.к. при записи в ячейку, принадлежащую области EEPROM, фактически данные пишутся в буферную память и переписываются во флэш командой записи. Плюс имеется ограничение на объем страницы для записи, так что в компиляторе Си вряд ли кто с этим будет заморачиваться. Это не имеет никакого отношения к обсуждаемому вопросу. Модификатор const показывает только то, что есть в его названии: данные только для чтения. Менять их запрещено. Все. Точка. Никакого отношения к размещению во флеше/не во флеше этот модификатор не имеет. Данные с модификатором const могут располагаться и в ОЗУ (что и происходит в "больших" компьютерах) но компилятор будет не менее активно стоять на страже этих данных. Если функция не изменяет передаваемые ей по указателю данные - она должна быть описана как принимающая указатель на константу. Если функция иногда может их менять - ей нельзя передавать указатель на константу. Это требование языка. Или меняйте алгоритм, чтобы удовлетворять требованиям языка, или сам себе злобный Буратина (это о хаке с явным приведением указателя). Dreamer - старайтесь изначально максимально полно описывать все подробности в вопросе. Изначальный ваш вопрос "функция не меняет значение по указателю, но имеет параметром указатель на неконстанту" подразумевает только один правильный ответ - опишите эту функцию как принимающую указатель на константу. Что и спровоцировало все эти эмоции. Ибо ваше описание (данное, кстати, не сразу в вопросе, а после наводящих вопросов) подразумевает что функция никогда не меняет данные, на которые получает указатель. Вы получили совершенно точный ответ на ваш вопрос. Каков вопрос - таков ответ. Все подробности про "иногда" вы выдали уже позже, так что обижаться можете только на себя.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 9 2009, 17:14
|
Участник

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

|
Сергей Борщ, я сначала специально не давал дальнейшего описания как раз на тот случай, если был возможен краткий ответ. Был бы возможен краткий ответ - не бы ло бы и споров. Цитата Это только до тех пор, пока Вы помните, где и какие Вы заложили грабли. В комментариях к программе все было подробно описано, в том числе и это. Устройство с этой программой работает уже 6 лет без единого сбоя без какой-либо модификации или апгрейда.
--------------------
Все врут (с) /M.D.House/
|
|
|
|
|
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 13 2009, 15:33
|

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

|
Цитата(V_G @ Nov 13 2009, 17:00)  К Вашему сведению, в AVR (а также pic-е и в большинстве современных микроконтроллеров) есть 2 (две) области памяти, сделанные по flash-технологии (c электрическим стиранием): программ и данных. Область данных называется EEPROM, и доступ к ней осуществляется именно так, как я описал. Давайте не будем смешивать мухи с котлетами. Разница между Flash и EEPROM в организации записи и стирания, EEPROM можно шить побайтово, FLASH - только странично, либо секторно. Стирать в EEPROM можно любую ячейку, во Flash - только страницу либо сектор целиком. Flash в AVR - это память там где программа размещается. Когда Вы говорите FLASH в контексте AVR, то очевидно подразумевается та самая флеш где хранится программа. Цитата Согласен, мне доверять не обязательно, но можно почитать datasheet. Если имеете в виду работу с EEPROM, то и называйте ее так как она в datasheet'е называется - EEPROM. Доверие - доверием, а технические термины не могут иметь двойного значения.
|
|
|
|
|
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, 01:22
|

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

|
Цитата(V_G @ Nov 14 2009, 03:44)  Загляните в Xmega manual.... А это кто за все писал: Цитата ...в AVR (а также pic-е и в большинстве современных микроконтроллеров) Причем выделяя xmega: Цитата Например, в семействе avr (не xmega) доступ к флэшу идет довольно сложно.. так куда теперь разговор поведете? Цитата Более того, если не касаться существующих Си-компиляторов, а рассуждать теоретически, то в принципе можно написать компилятор, который бы предоставлял Си-программисту доступ к EEPROM любого контроллера как к ячейке памяти, хотя бы и с модификатором Почему не касаться? Уже существующие позволяют, а уж в C++ и сами можете написать функции и перегрузить нужные операторы.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 14 2009, 01:56
|

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

|
Цитата(zltigo @ Nov 14 2009, 11:22)  А это кто за все писал:
Причем выделяя xmega:
так куда теперь разговор поведете? Не вижу противоречий в своих утверждениях, если принять во внимание упомянутое мной выше расширенное толкование термина "флэш" и краткую историю такого расширения. Данные все-таки предпочтительней (на мой взгляд) хранить в памяти данных или в EEPROM, и только уж совсем константные константы - в памяти программ. Цитата Почему не касаться? Уже существующие позволяют, а уж в C++ и сами можете написать функции и перегрузить нужные операторы. А вот это уже по делу и фактически является ответом на вопрос топикстартера. Если это прозвучало раньше, то мы зря ломаем здесь копья, давайте жить дружно!
Сообщение отредактировал V_G - Nov 14 2009, 01:59
|
|
|
|
|
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)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|