|
Разместить переменную во 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, 08:20
|
Участник
Группа: Участник
Сообщений: 51
Регистрация: 13-01-06
Из: Санкт-Петербург
Пользователь №: 13 154
|
Цитата Э.... ЗАЧЕМ!??? Думаете, что ее сможете менять??? Мне не нужно ее менять. У меня есть МНОГО функций, принимающие на вход что-то вроде Код void MyFunc(struct MYSTRUCT1 * param1, struct MYSTRUCT2 *param2) { ////// } Если передать в такую функцию указатель на константную структуру, то компилятор вполне обоснованно выругается. Мне же надо для некоторых случаев подставлять в эти функции значения по умолчанию, которые я хочу хранить во флеше. Но вопрос-то не о том, зачем это мне нужно. Вопрос в том - можно так сделать или нет?
--------------------
Все врут (с) /M.D.House/
|
|
|
|
|
Nov 9 2009, 08:30
|
.
Группа: Участник
Сообщений: 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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Nov 9 2009, 08:35
|
читатель даташитов
Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999
|
Гуглите const correctness. Нормально написанная функция, которая работаеет с const данными, должна получать const параметры. Если уж совсем хочется, сделайте typecast: Код const char a[] = "a"; char *b = (char*) a; Но проблемы возникнут сразу как будет произведено изменение данных, которые на самом деле const.
|
|
|
|
|
Nov 9 2009, 11:22
|
Участник
Группа: Участник
Сообщений: 51
Регистрация: 13-01-06
Из: Санкт-Петербург
Пользователь №: 13 154
|
GetSmart, с принудительным преобразованием типов понятно. Сейчас у меня вообще все делается без "опасных" преобразований через копирование из (const struct *) в (struct *). Но это лишние телодвижения и расход ресурсов. Можно, как Вы указали, сделать преобразование типов. Но некоторые компиляторы (например,Keil для c51) позволяли обходить это преобразование типов с помощью специального модификатора при объявлении структуры. Получалось, что и размещалось в нужной области без проблем, и не нужно было типы преобразовывать. Вот я собственно и спрашиваю - в этом компиляторе это реально сделать, или это чисто Кейловская "фишка" ? Цитата Поэтому вопрос немного меняется: стоит ли излишне напрягаться? Нет, не меняется. Мне просто нужно знать, возможно такое сделать или нет Цитата Нормально написанная функция, которая работаеет с const данными, должна получать const параметры. Это понятно. Так и делаю. Но есть функции, которые меняют значения по параметрам-указателям только при определенных значениях других параметров, при некоторых их значениях - просто делают какое-то действие без изменения данных. Для такого действия мне и нужны дефолтные структуры. Цитата Именно так. Автор даже не видел, например, банальной memcpy() ЗдОрово! . Вот она, конструктивная критика. Вот он, эталон уважения и поддержки. zltigo, вы, наверное, ясновидящий? Все знаете, кто что видел и кто что не видел? Мне нужен был простой ответ на простой вопрос - можно ли так сделать, как я хочу. Исходя из ответа я и определю, каким образом лучше спроектировать код для моей задачи. А высокомерные насмешки "свысока" в исполнении zltigo мне вообще непонятны.
Сообщение отредактировал Dreamer - Nov 9 2009, 11:35
--------------------
Все врут (с) /M.D.House/
|
|
|
|
|
Nov 9 2009, 11:50
|
Гуру
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244
|
Цитата(Dreamer @ Nov 9 2009, 14:22) А высокомерные насмешки "свысока" в исполнении zltigo мне вообще непонятны. Повторяю - "проблема" совершенно обыденная, путь решения прост и ясен. Посмотрите, наконец, прототип memcpy(). Должно наступить озарение, что так, "захотелось" через заднепроходное отверстие делать просто НЕ надо, а надо воспользоватся подсказкой HARMHARM.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 9 2009, 13:07
|
Участник
Группа: Участник
Сообщений: 51
Регистрация: 13-01-06
Из: Санкт-Петербург
Пользователь №: 13 154
|
zltigo, Почему вы считаете, что если по вашему мнению ТАК делать не надо, то так не может делать вообще никто и у вас единственно правильный путь решения? Вы уверены, что лучше меня разбираетесь в моей задаче? Или считаете, что у меня вообще нет опыта в программировании? Что мне даст чтение прототипа функции? То, что там первый указатель без const, второй с const, мне и так известно. Или там есть что-то еще, особенное, ясно подсказывающее краткий и понятный ответ на вопрос: Цитата Такое возможно? Ведь варианты ответа на мой вопрос крайне просты: 1. "Нельзя, даже не пытайся" 2. "Не знаю, но посмотрите сюда, сюда и сюда, там видел что-то похожее". 3. "Можно, посмотрите сюда и сюда". А вместо этого - философия какая-то...
--------------------
Все врут (с) /M.D.House/
|
|
|
|
|
Nov 9 2009, 13:17
|
Профессионал
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555
|
А чего вы хотите? Как линкер может разместить данные которые можно модифицировать в readonly секцию? В конфигурации линкера укажите что у вас флеш не read only и секция не readonly А то что кейл это позволял - это серьезный недостаток! И IMHO тут не только zltigo считает что это через ж..., а большинство. Это даже не черз ж... - это хуже!
|
|
|
|
|
Nov 9 2009, 13:33
|
Участник
Группа: Участник
Сообщений: 51
Регистрация: 13-01-06
Из: Санкт-Петербург
Пользователь №: 13 154
|
Цитата Как линкер может разместить данные которые можно модифицировать в readonly секцию? Я не знаю, я об этом как раз и спрашиваю. Потому что: Цитата А то что кейл это позволял - это серьезный недостаток! Но все-таки позволял. Цитата И IMHO тут не только zltigo считает что это через ж..., а большинство. Вполне уважаю компетентные мнения. Но это самое большинство не позволяет себе высоких насмешек в стиле: "Ой, новенький пришел, ну-ка я его сейчас зачморю да поприкалываюсь, да покажу, как я крут". Цитата Это даже не черз ж... - это хуже! Увижу - сделаю выводы, не понравится - естественно, больше так делать не буду. Но до этого делал - результат получил, вполне им доволен. Судя по содержательной части топика - мое предположение не верно и так сделать нельзя. Тогда оставляю как есть и больше не парюсь над этим вопросом.
--------------------
Все врут (с) /M.D.House/
|
|
|
|
|
Nov 9 2009, 13:33
|
Гуру
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244
|
Цитата(Dreamer @ Nov 9 2009, 16:07) считаете, что у меня вообще нет опыта в программировании? Да, Ваши "желания" это показывают со всей определенностью . Цитата Вы уверены, что лучше меня разбираетесь в моей задаче? Вполне, дабы подсказать, что разбираться в ней вообще не надо, ибо ошибка, как это часто и бывает в постановке задачи. Цитата Что мне даст чтение прототипа функции? Понимание того, как Вам нужно писать функцию для работы с разными типами указателей. Ваша функция ( как это правильно сделано во всех библиотечных функциях), должна работать и соответственно в нее передаваться указатели на const. При этом любые передаваемые указатели будут преобразовываться к const * молча, бо сие безопасно. Вы придумали делать с точностью до наоборот, т.е. через анус и маниакально пытаетесь решить надуманную проблему. Moderator: Тему перенес.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 9 2009, 13:50
|
Участник
Группа: Участник
Сообщений: 51
Регистрация: 13-01-06
Из: Санкт-Петербург
Пользователь №: 13 154
|
Цитата Да, Ваши "желания" это показывают со всей определенностью А при чем тут желания? Вы результаты не видите. Судить не можете. Рисунок Жана Эффеля богом вас не делает. Цитата Вполне, дабы подсказать, что разбираться в ней вообще не надо, ибо ошибка, как это часто и бывает в постановке задачи. Почему задача не может быть экспериментом? Цитата Тему перенес. А это с какой стати? Какое отношение конкретный вопрос, относящийся к конкретному компилятору, имеет к разделу "в помощь начинающему"? Здесь идет речь о какой-либо помощи? Цитата Ваша функция ( как это правильно сделано во всех библиотечных функциях), должна работать и соответственно в нее передаваться указатели на const. При этом любые передаваемые указатели будут преобразовываться к const * молча, бо сие безопасно. Да согласен 10 раз с этим, более того, сейчас так и сделано, но вопрос-то был не в том.
--------------------
Все врут (с) /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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|