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

 
 
> Разместить переменную во 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
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 38)
zltigo
сообщение Nov 6 2009, 17:43
Сообщение #2


Гуру
******

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



Цитата(Dreamer @ Nov 6 2009, 18:18) *
Такое возможно?

Э.... ЗАЧЕМ!??? Думаете, что ее сможете менять??? smile.gif


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


Участник
*

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



Цитата
Э.... ЗАЧЕМ!??? Думаете, что ее сможете менять???

Мне не нужно ее менять.
У меня есть МНОГО функций, принимающие на вход что-то вроде
Код
void MyFunc(struct MYSTRUCT1 * param1, struct MYSTRUCT2 *param2)
{
//////
}


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


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


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Dreamer @ Nov 9 2009, 14:20) *
Мне же надо для некоторых случаев подставлять в эти функции значения по умолчанию, которые я хочу хранить во флеше.
Но вопрос-то не о том, зачем это мне нужно. Вопрос в том - можно так сделать или нет?

Для некоторых случаев лучше использовать "принудительное" преобразование типа, например такой вызов функции

Код
MyFunc((struct MYSTRUCT1 *)&const1, (struct MYSTRUCT2 *)&const2)

Поэтому вопрос немного меняется: стоит ли излишне напрягаться?

Сообщение отредактировал GetSmart - Nov 9 2009, 08:41


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Nov 9 2009, 08:35
Сообщение #5


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

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



Гуглите const correctness. Нормально написанная функция, которая работаеет с const данными, должна получать const параметры.
Если уж совсем хочется, сделайте typecast:
Код
const char a[] = "a";
char *b = (char*) a;

Но проблемы возникнут сразу как будет произведено изменение данных, которые на самом деле const.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 9 2009, 09:03
Сообщение #6


Гуру
******

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



Цитата(HARMHARM @ Nov 9 2009, 11:35) *
Нормально написанная функция, которая работаеет с const данными, должна получать const параметры.

Именно так. Автор даже не видел, например, банальной memcpy() sad.gif....


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


Участник
*

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



GetSmart, с принудительным преобразованием типов понятно.

Сейчас у меня вообще все делается без "опасных" преобразований через копирование из (const struct *) в (struct *).
Но это лишние телодвижения и расход ресурсов.
Можно, как Вы указали, сделать преобразование типов. Но некоторые компиляторы (например,Keil для c51) позволяли обходить это преобразование типов с помощью специального модификатора при объявлении структуры. Получалось, что и размещалось в нужной области без проблем, и не нужно было типы преобразовывать. Вот я собственно и спрашиваю - в этом компиляторе это реально сделать, или это чисто Кейловская "фишка" ?
Цитата
Поэтому вопрос немного меняется: стоит ли излишне напрягаться?

Нет, не меняется. Мне просто нужно знать, возможно такое сделать или нет wink.gif

Цитата
Нормально написанная функция, которая работаеет с const данными, должна получать const параметры.

Это понятно. Так и делаю. Но есть функции, которые меняют значения по параметрам-указателям только при определенных значениях других параметров, при некоторых их значениях - просто делают какое-то действие без изменения данных. Для такого действия мне и нужны дефолтные структуры.

Цитата
Именно так. Автор даже не видел, например, банальной memcpy()

ЗдОрово! 1111493779.gif . Вот она, конструктивная критика. Вот он, эталон уважения и поддержки.
zltigo, вы, наверное, ясновидящий? Все знаете, кто что видел и кто что не видел?

Мне нужен был простой ответ на простой вопрос - можно ли так сделать, как я хочу.
Исходя из ответа я и определю, каким образом лучше спроектировать код для моей задачи.
А высокомерные насмешки "свысока" в исполнении zltigo мне вообще непонятны.

Сообщение отредактировал Dreamer - Nov 9 2009, 11:35


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


Гуру
******

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



Цитата(Dreamer @ Nov 9 2009, 14:22) *
А высокомерные насмешки "свысока" в исполнении zltigo мне вообще непонятны.

Повторяю - "проблема" совершенно обыденная, путь решения прост и ясен. Посмотрите, наконец, прототип memcpy(). Должно наступить озарение, что так, "захотелось" через заднепроходное отверстие делать просто НЕ надо, а надо воспользоватся подсказкой HARMHARM.


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


Участник
*

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



zltigo,

Почему вы считаете, что если по вашему мнению ТАК делать не надо, то так не может делать вообще никто и у вас единственно правильный путь решения? Вы уверены, что лучше меня разбираетесь в моей задаче?
Или считаете, что у меня вообще нет опыта в программировании?
Что мне даст чтение прототипа функции? То, что там первый указатель без const, второй с const, мне и так известно. Или там есть что-то еще, особенное, ясно подсказывающее краткий и понятный ответ на вопрос:
Цитата
Такое возможно?


Ведь варианты ответа на мой вопрос крайне просты:
1. "Нельзя, даже не пытайся"
2. "Не знаю, но посмотрите сюда, сюда и сюда, там видел что-то похожее".
3. "Можно, посмотрите сюда и сюда".

А вместо этого - философия какая-то...


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


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

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



А чего вы хотите? Как линкер может разместить данные которые можно модифицировать в readonly секцию?
В конфигурации линкера укажите что у вас флеш не read only wink.gif и секция не readonly wink.gif
А то что кейл это позволял - это серьезный недостаток!
И IMHO тут не только zltigo считает что это через ж..., а большинство.
Это даже не черз ж... - это хуже!
Go to the top of the page
 
+Quote Post
Dreamer
сообщение Nov 9 2009, 13:33
Сообщение #11


Участник
*

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



Цитата
Как линкер может разместить данные которые можно модифицировать в readonly секцию?

Я не знаю, я об этом как раз и спрашиваю. Потому что:

Цитата
А то что кейл это позволял - это серьезный недостаток!

Но все-таки позволял.

Цитата
И IMHO тут не только zltigo считает что это через ж..., а большинство.

Вполне уважаю компетентные мнения. Но это самое большинство не позволяет себе высоких насмешек в стиле:
"Ой, новенький пришел, ну-ка я его сейчас зачморю да поприкалываюсь, да покажу, как я крут".

Цитата
Это даже не черз ж... - это хуже!

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

Судя по содержательной части топика - мое предположение не верно и так сделать нельзя. Тогда оставляю как есть и больше не парюсь над этим вопросом.


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


Гуру
******

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



Цитата(Dreamer @ Nov 9 2009, 16:07) *
считаете, что у меня вообще нет опыта в программировании?

Да, Ваши "желания" это показывают со всей определенностью sad.gif.
Цитата
Вы уверены, что лучше меня разбираетесь в моей задаче?

Вполне, дабы подсказать, что разбираться в ней вообще не надо, ибо ошибка, как это часто и бывает в постановке задачи.
Цитата
Что мне даст чтение прототипа функции?

Понимание того, как Вам нужно писать функцию для работы с разными типами указателей. Ваша функция ( как это правильно сделано во всех библиотечных функциях), должна работать и соответственно в нее передаваться указатели на const. При этом любые передаваемые указатели будут преобразовываться к const * молча, бо сие безопасно. Вы придумали делать с точностью до наоборот, т.е. через анус и маниакально пытаетесь решить надуманную проблему.

Moderator:
Тему перенес.


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


Участник
*

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



Цитата
Да, Ваши "желания" это показывают со всей определенностью

А при чем тут желания? Вы результаты не видите. Судить не можете. Рисунок Жана Эффеля богом вас не делает.

Цитата
Вполне, дабы подсказать, что разбираться в ней вообще не надо, ибо ошибка, как это часто и бывает в постановке задачи.

Почему задача не может быть экспериментом?

Цитата
Тему перенес.

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

Цитата
Ваша функция ( как это правильно сделано во всех библиотечных функциях), должна работать и соответственно в нее передаваться указатели на const. При этом любые передаваемые указатели будут преобразовываться к const * молча, бо сие безопасно.

Да согласен 10 раз с этим, более того, сейчас так и сделано, но вопрос-то был не в том.


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


Гуру
******

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



Цитата(Dreamer @ Nov 9 2009, 16:50) *
Какое отношение конкретный вопрос, относящийся к конкретному компилятору...

Нималейшего отношения к конкретному компилятору вопрос не имеет. А вопросы "как через ж..." переносятся к начинающим.


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


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

Группа: Свой
Сообщений: 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
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
V_G
сообщение Nov 15 2009, 00:16
Сообщение #31


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

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


кекс
******

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



Цитата(V_G @ Nov 15 2009, 02:16) *
Хотя если задача состоит не в том, чтобы ответить на вопрос
... уличить участника

Да никто не хочет уличивать участника специально. Просто бывает некоторые участники пишут небрежно, неточно, что не соответвует действительности и может сбить с толку особенно начинающего.
Думайте перед тем как постить, проверяйте то, что Вы собрались запостить с документацией (или хотя бы с информацией с wiki) если действительно хотите помочь.


Цитата
Чем не ответ на вопрос?

Сейчас Вы демонстрируете, только то, что не в теме заданного автором топика вопроса. Потому что

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

A. у контроллера который пользует автор топика нет EEPROM.
B. спрашивающего удивляет тот факт что линкер не хочет класть данные объявленные как Read-Write (RW), в ReadOnly (RO) память.

Изначальный вопрос автора - как заставить компилятор положить RW данные в RO регион памяти. Ответ - никак.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 15 2009, 17:56
Сообщение #33


Гуру
******

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


Гуру
******

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



Цитата(Сергей Борщ @ Nov 15 2009, 20:56) *
Функция ингода (в зависимости от других параметров) может модифицировать передаваемые ей по указателю данные

Лично я такого не понял.
Цитата
(поэтому автор не может объявить параметр как указатель на константу)

Просто не догадался, потом наконец-то так сделал, отписал: "сейчас так и сделано", но продолжил наводить тень на плетень как "сделать, как я хочу" и "вопрос-то был не в том".


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 16 2009, 11:37
Сообщение #35


Гуру
******

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



Цитата(zltigo @ Nov 15 2009, 20:03) *
потом наконец-то так сделал, отписал: "сейчас так и сделано"
Я так понял, что это относилось к явному приведению константного указателя к неконстантному перед вызовом функции.


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


Гуру
******

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



Цитата(Сергей Борщ @ Nov 16 2009, 14:37) *
Я так понял, что это относилось к явному приведению константного указателя к неконстантному перед вызовом функции.

Не знаю, я об этом:
Цитата
Ваша функция ( как это правильно сделано во всех библиотечных функциях), должна работать и соответственно в нее передаваться указатели на const. При этом любые передаваемые указатели будут преобразовываться к const * молча, бо сие безопасно.

Реакция:
Цитата
Да согласен 10 раз с этим, более того, сейчас так и сделано, но вопрос-то был не в том.

Впрочем, ввиду мутности "идеи" гадать можно долго.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dreamer
сообщение Nov 17 2009, 10:57
Сообщение #37


Участник
*

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



Сергей Борщ. Вы абсолютно правильно меня поняли.

Цитата
Автору надо передать в функцию указатель на данные, размещенные во флешь. Функция ингода (в зависимости от других параметров) может модифицировать передаваемые ей по указателю данные (поэтому автор не может объявить параметр как указатель на константу), но в моменты вызова функции с указателем на флешь другие параметры не допускают такой модификации.


Модифицировать эти данные мне действительно не нужно.

Цитата
Просто не догадался, потом наконец-то так сделал, отписал: "сейчас так и сделано"

Сначала (до поднятия темы на форуме) было сделано так:
1. Функции принимали значения на НЕ КОНСТАНТЫ, так как в зависимости от других параметров в ней возможна модификация.
2. Были объявлены дефолтные значения структур как const .
3. Перед вызовом функции делалось следующее - в стеке создавался экземпляр структуры НЕ константной, с помощью memcpy в него копировалось значение константной структуры, и вызывалась пресловутая функция.

Во многих местах, как выяснилось, мне оказалось достаточным дефолтных значений структуры, и создавать лишний объект в стеке (или в хипе) только лишь ради корректного приведения указателей мне показалось лишним, я хотел соптимизировать этот момент, перебрал несколько идей - в том чиле и этот пост, так как повторюсь, в Кейле для 51 процессоров, с которыми я работал до этого процессора, это прокатывало.
Приведение указателя "конст" к "не конст" с помощью круглых скобок при вызове функции мне не показалось лучшим решением.
Но на данный момент я оставил это место как есть и иду дальше, так как сроки проекта короткие, и если вдаваться в глубокие рассуждения на тему "кто круче, а кто дурак" - то так я точно в сроки не уложусь. Пусть лучше считают дураком, но при этом делается мое дело. А обсуждать что-либо на форуме больше не хочу. Перехожу обратно в разряд читателей.


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


Гуру
******

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



Цитата(Dreamer @ Nov 17 2009, 13:57) *
Сергей Борщ. Вы абсолютно правильно меня поняли.
...
Модифицировать эти данные мне действительно не нужно.

Э... вообще-то это взаимоисключающие утверждения sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 17 2009, 13:59
Сообщение #39


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Не понял.
Если НЕ НУЖНО, то чего бы там const не вписать то?????


--------------------
The truth is out there...
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 Текстовая версия Сейчас: 24th July 2025 - 06:50
Рейтинг@Mail.ru


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