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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Разместить переменную во flash без модификатора const, Как?
Dreamer
сообщение Nov 9 2009, 14:52
Сообщение #16


Участник
*

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



Итить, опять двадцать пять.

Опять "трансформация реальности через свою любимую голову".

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

Кстати, zltigo, раз уж вы взяли на себя роль бога, то и вопрос соответствующий - вы собственник этого ресурса, соучередитель, или только модератор?








Цитата(V_G @ Nov 9 2009, 17:26) *
Это смотря для какого процессора.


NXP LPC2388.

Цитата
Почему-то здесь не обсуждают способы доступа к флэшу, как будто программируют в винде какой-нибудь.


Я не знаю, почему. Видимо, потому что на форум пришел новый человек, и важнее слить его вопрос в остстойник и продемонстрировать собственную крутость, чем оказать реальную помощь.
Я уже понял, что раз сразу простого и понятного ответа не последовало, то не получится. Это не приведет меня в тупик, есть на это у меня другое решение. Результат важнее, чем способы его достижения.

Модератор (rezident). Фиксирую нарушение п.2.1в (флейм) и п.3.7 (пока еще не внесенный, публичное обсуждение действий модератора) Правил форума. Рекомендую внимательно ознакомится с Правилами и структурой форума.


--------------------
Все врут (с) /M.D.House/
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 9 2009, 14:54
Сообщение #17


Гуру
******

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



Цитата(Dreamer @ Nov 9 2009, 17:37) *
В теме "начинающих" на такие вопросы даже отвечать не будут.

HARMHARM ответил, я ответил. Рад, что Вы теперь знаете и делаете правильно а не используете "свои другие решения", типа копирования структур, не лезущие ни в какие ворота.
Цитата
Кстати, zltigo, раз уж вы взяли на себя роль бога, то и вопрос соответствующий - вы собственник этого ресурса, соучередитель, или только модератор?

Moderator:
Настоятельно рекомендую изучить правила и структуру форума - будет ясно, где задавать вопросы и как обжаловать действия модераторов.
При попытке продолжить разговоры в этой ветке будут приняты административные меры.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dreamer
сообщение Nov 9 2009, 15:16
Сообщение #18


Участник
*

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



Цитата
а не используете "свои другие решения", типа копирования структур, не лезущие ни в какие ворота.

Но это же только Ваше ИМХО. Еще раз повторяю - есть программы, где это работает, причем работает прекрасно и без побочных эффектов.


--------------------
Все врут (с) /M.D.House/
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Nov 9 2009, 16:38
Сообщение #19


читатель даташитов
****

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



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

Это только до тех пор, пока Вы помните, где и какие Вы заложили грабли. Как только код передается другому человеку, или Вы в него полгода не заглядываете, следует удар по лбу (а то и не один). Понятно, что сделать так можно, в этом никто не сомневается, равно как и в Вашей способности разобраться самостоятельно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 9 2009, 16:49
Сообщение #20


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Dreamer
сообщение Nov 9 2009, 17:14
Сообщение #21


Участник
*

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



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

Цитата
Это только до тех пор, пока Вы помните, где и какие Вы заложили грабли.

В комментариях к программе все было подробно описано, в том числе и это. Устройство с этой программой работает уже 6 лет без единого сбоя без какой-либо модификации или апгрейда.


--------------------
Все врут (с) /M.D.House/
Go to the top of the page
 
+Quote Post
KRS
сообщение Nov 9 2009, 21:19
Сообщение #22


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



да можно это сделать в IAR, можно! Просто надо написать icf файл правильно ( вернее не правильно wink.gif )
Но как это сделать - IMHO вам объяснять не будут, потому что... уже видно из обсуждения выше.
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 13 2009, 13:26
Сообщение #23


кекс
******

Группа: Свой
Сообщений: 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
Сообщение #24


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

Группа: Свой
Сообщений: 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
Сообщение #25


Гуру
******

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


кекс
******

Группа: Свой
Сообщений: 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.
Доверие - доверием, а технические термины не могут иметь двойного значения.
Go to the top of the page
 
+Quote Post
V_G
сообщение Nov 14 2009, 00:44
Сообщение #27


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

Группа: Свой
Сообщений: 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
zltigo
сообщение Nov 14 2009, 01:22
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
V_G
сообщение Nov 14 2009, 01:56
Сообщение #29


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

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



Цитата(zltigo @ Nov 14 2009, 11:22) *
А это кто за все писал:

Причем выделяя xmega:

так куда теперь разговор поведете?


Не вижу противоречий в своих утверждениях, если принять во внимание упомянутое мной выше расширенное толкование термина "флэш" и краткую историю такого расширения. Данные все-таки предпочтительней (на мой взгляд) хранить в памяти данных или в EEPROM, и только уж совсем константные константы - в памяти программ.

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

А вот это уже по делу и фактически является ответом на вопрос топикстартера. Если это прозвучало раньше, то мы зря ломаем здесь копья, давайте жить дружно!

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


Гуру
******

Группа: Модераторы
Сообщений: 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

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

 


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


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