Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Разместить переменную во flash без модификатора const
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Dreamer
Здравствуйте.
Хочу разместить переменную во 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, это сильно упростило бы мне жизнь. Такое возможно?
zltigo
Цитата(Dreamer @ Nov 6 2009, 18:18) *
Такое возможно?

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

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


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

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

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

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

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

Именно так. Автор даже не видел, например, банальной memcpy() sad.gif....
Dreamer
GetSmart, с принудительным преобразованием типов понятно.

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

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

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

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

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

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

Мне нужен был простой ответ на простой вопрос - можно ли так сделать, как я хочу.
Исходя из ответа я и определю, каким образом лучше спроектировать код для моей задачи.
А высокомерные насмешки "свысока" в исполнении zltigo мне вообще непонятны.
zltigo
Цитата(Dreamer @ Nov 9 2009, 14:22) *
А высокомерные насмешки "свысока" в исполнении zltigo мне вообще непонятны.

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

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


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

А вместо этого - философия какая-то...
KRS
А чего вы хотите? Как линкер может разместить данные которые можно модифицировать в readonly секцию?
В конфигурации линкера укажите что у вас флеш не read only wink.gif и секция не readonly wink.gif
А то что кейл это позволял - это серьезный недостаток!
И IMHO тут не только zltigo считает что это через ж..., а большинство.
Это даже не черз ж... - это хуже!
Dreamer
Цитата
Как линкер может разместить данные которые можно модифицировать в readonly секцию?

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

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

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

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

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

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

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

Судя по содержательной части топика - мое предположение не верно и так сделать нельзя. Тогда оставляю как есть и больше не парюсь над этим вопросом.
zltigo
Цитата(Dreamer @ Nov 9 2009, 16:07) *
считаете, что у меня вообще нет опыта в программировании?

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

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

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

Moderator:
Тему перенес.
Dreamer
Цитата
Да, Ваши "желания" это показывают со всей определенностью

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

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

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

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

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

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

Да согласен 10 раз с этим, более того, сейчас так и сделано, но вопрос-то был не в том.
zltigo
Цитата(Dreamer @ Nov 9 2009, 16:50) *
Какое отношение конкретный вопрос, относящийся к конкретному компилятору...

Нималейшего отношения к конкретному компилятору вопрос не имеет. А вопросы "как через ж..." переносятся к начинающим.
V_G
Цитата(Dreamer @ Nov 7 2009, 01:18) *
Здравствуйте.
Хочу разместить переменную во flash, а не в ОЗУ.

Мне бы очень хотелось, чтобы во флаш можно было размещать переменные без модификатора соnst, это сильно упростило бы мне жизнь. Такое возможно?


Это смотря для какого процессора. Почему-то здесь не обсуждают способы доступа к флэшу, как будто программируют в винде какой-нибудь.
Если конкретный микроконтроллер позволяет обеспечить доступ к флэшу, аналогичный доступу к ОЗУ, то и на Си для этого контроллера наверняка его можно организовать.

Например, в семействе avr (не xmega) доступ к флэшу идет довольно сложно: надо записать в адресные регистры адрес переменной, в управляющий регистр дать строб чтения (если надо прочитать), и потом считать регистр данных. Не думаю, что в Си для такого контроллера можно просто разместить данные во флэше и манипулировать ими так же, как в ОЗУ.

В xmega есть memory-mapped режим доступа к флэшу, переменные легко разместить в сегменте ESEG (для ассемблера) и адресоваться к ним для чтения как к простой ячейке памяти просто (со смещением адреса на 0x1000). На Си это тоже реализовать должно быть легко, возможно, уже реализовано. При записи несколько сложнее, т.к. при записи в ячейку, принадлежащую области EEPROM, фактически данные пишутся в буферную память и переписываются во флэш командой записи. Плюс имеется ограничение на объем страницы для записи, так что в компиляторе Си вряд ли кто с этим будет заморачиваться.
Dreamer
Итить, опять двадцать пять.

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

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

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








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


NXP LPC2388.

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


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

Модератор (rezident). Фиксирую нарушение п.2.1в (флейм) и п.3.7 (пока еще не внесенный, публичное обсуждение действий модератора) Правил форума. Рекомендую внимательно ознакомится с Правилами и структурой форума.
zltigo
Цитата(Dreamer @ Nov 9 2009, 17:37) *
В теме "начинающих" на такие вопросы даже отвечать не будут.

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

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

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

Это только до тех пор, пока Вы помните, где и какие Вы заложили грабли. Как только код передается другому человеку, или Вы в него полгода не заглядываете, следует удар по лбу (а то и не один). Понятно, что сделать так можно, в этом никто не сомневается, равно как и в Вашей способности разобраться самостоятельно.
Сергей Борщ
Цитата(V_G @ Nov 9 2009, 16:26) *
В xmega есть memory-mapped режим доступа к флэшу, переменные легко разместить в сегменте ESEG (для ассемблера) и адресоваться к ним для чтения как к простой ячейке памяти просто (со смещением адреса на 0x1000). На Си это тоже реализовать должно быть легко, возможно, уже реализовано. При записи несколько сложнее, т.к. при записи в ячейку, принадлежащую области EEPROM, фактически данные пишутся в буферную память и переписываются во флэш командой записи. Плюс имеется ограничение на объем страницы для записи, так что в компиляторе Си вряд ли кто с этим будет заморачиваться.
Это не имеет никакого отношения к обсуждаемому вопросу. Модификатор const показывает только то, что есть в его названии: данные только для чтения. Менять их запрещено. Все. Точка. Никакого отношения к размещению во флеше/не во флеше этот модификатор не имеет. Данные с модификатором const могут располагаться и в ОЗУ (что и происходит в "больших" компьютерах) но компилятор будет не менее активно стоять на страже этих данных. Если функция не изменяет передаваемые ей по указателю данные - она должна быть описана как принимающая указатель на константу. Если функция иногда может их менять - ей нельзя передавать указатель на константу. Это требование языка. Или меняйте алгоритм, чтобы удовлетворять требованиям языка, или сам себе злобный Буратина (это о хаке с явным приведением указателя).
Dreamer - старайтесь изначально максимально полно описывать все подробности в вопросе. Изначальный ваш вопрос "функция не меняет значение по указателю, но имеет параметром указатель на неконстанту" подразумевает только один правильный ответ - опишите эту функцию как принимающую указатель на константу. Что и спровоцировало все эти эмоции. Ибо ваше описание (данное, кстати, не сразу в вопросе, а после наводящих вопросов) подразумевает что функция никогда не меняет данные, на которые получает указатель. Вы получили совершенно точный ответ на ваш вопрос. Каков вопрос - таков ответ. Все подробности про "иногда" вы выдали уже позже, так что обижаться можете только на себя.
Dreamer
Сергей Борщ, я сначала специально не давал дальнейшего описания как раз на тот случай, если был возможен краткий ответ. Был бы возможен краткий ответ - не бы ло бы и споров.

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

В комментариях к программе все было подробно описано, в том числе и это. Устройство с этой программой работает уже 6 лет без единого сбоя без какой-либо модификации или апгрейда.
KRS
да можно это сделать в IAR, можно! Просто надо написать icf файл правильно ( вернее не правильно wink.gif )
Но как это сделать - IMHO вам объяснять не будут, потому что... уже видно из обсуждения выше.
defunct
Цитата(V_G @ Nov 9 2009, 16:26) *
Например, в семействе avr (не xmega) доступ к флэшу идет довольно сложно: надо записать в адресные регистры адрес переменной, в управляющий регистр дать строб чтения (если надо прочитать), и потом считать регистр данных.

Таких ужасов как Вы понаписали в AVR нет. Там просто два отдельных адресных просранства (АП) - флеш и ОЗУ, из первого данные читаются инструкцией LPM, из второго - LD. Для первого АП нет инструкции записи ячейки, для второго - есть ST.

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

В этом Вы абсолютно правы, раз команды разные, то компилятор должен точно знать какую команду ему использовать в том или ином случае, а значит без подсказки компилятору в виде __flash и проч. - это сделать никак нельзя. Даже если команды чтения в ARM и для флеш и для ОЗУ одинаковые, то по крайней мере одного только факта, что во флеш __нельзя__ писать, - уже достаточно чтобы понять, что и компилятору надо об этом как-то сказать, чтобы тот ненароком не писанул туда чего.
V_G
Цитата(defunct @ Nov 13 2009, 23:26) *
Таких ужасов как Вы понаписали в AVR нет. Там просто два отдельных адресных просранства (АП) - флеш и ОЗУ, из первого данные читаются инструкцией LPM, из второго - LD. Для первого АП нет инструкции записи ячейки, для второго - есть ST.


К Вашему сведению, в AVR (а также pic-е и в большинстве современных микроконтроллеров) есть 2 (две) области памяти, сделанные по flash-технологии (c электрическим стиранием): программ и данных. Область данных называется EEPROM, и доступ к ней осуществляется именно так, как я описал. Согласен, мне доверять не обязательно, но можно почитать datasheet.
Если топикстартер под флэшью имел в виду область программ, то Вы отчасти правы: LPM. Отчасти, потому, что есть и SPM - несколько более сложная, многовариантная и геморройная инструкция, чем ST (STS), но вполне реализуемая.
zltigo
Цитата(V_G @ Nov 13 2009, 18:00) *
К Вашему сведению...

В вашему сведению, про ЕЕPROM типа Flash, Вы написали полный бред. И не надо фантазировать на темы "если имел ввиду". Ну и загляните на досуге в документацию, на любимый AVR на предмет того, где там вообще EEPROM находится и почему оно в принципе НЕ является областью памяти контроллера.
defunct
Цитата(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.
Доверие - доверием, а технические термины не могут иметь двойного значения.
V_G
Согласен, есть определенная путаница с терминологией. В расширительном толковании флэш - память с электрическим стиранием, и под нее и попадает 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 или любым другим, сигнализирующем об особом порядке работы с данной ячейкой.
zltigo
Цитата(V_G @ Nov 14 2009, 03:44) *
Загляните в Xmega manual....

А это кто за все писал:
Цитата
...в AVR (а также pic-е и в большинстве современных микроконтроллеров)

Причем выделяя xmega:
Цитата
Например, в семействе avr (не xmega) доступ к флэшу идет довольно сложно..

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

Цитата
Более того, если не касаться существующих Си-компиляторов, а рассуждать теоретически, то в принципе можно написать компилятор, который бы предоставлял Си-программисту доступ к EEPROM любого контроллера как к ячейке памяти, хотя бы и с модификатором

Почему не касаться? Уже существующие позволяют, а уж в C++ и сами можете написать функции и перегрузить нужные операторы.
V_G
Цитата(zltigo @ Nov 14 2009, 11:22) *
А это кто за все писал:

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

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


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

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

А вот это уже по делу и фактически является ответом на вопрос топикстартера. Если это прозвучало раньше, то мы зря ломаем здесь копья, давайте жить дружно!
Сергей Борщ
Цитата(V_G @ Nov 14 2009, 02:44) *
В расширительном толковании флэш - память с электрическим стиранием, и под нее и попадает EEPROM.
Вот только с точностью до наоборот. EEPROM = Electricaly Erasable Programmable Read Only Memory. То есть флешь является одной из разновидностей общего понятия EEPROM, а не наоборот, как пытаетесь доказать нам вы.


Цитата(V_G @ Nov 14 2009, 03:56) *
А вот это уже по делу и фактически является ответом на вопрос топикстартера.
Вопрос был совсем о другом.
V_G
Цитата(Сергей Борщ @ Nov 14 2009, 23:58) *
Вот только с точностью до наоборот. EEPROM = Electricaly Erasable Programmable Read Only Memory. То есть флешь является одной из разновидностей общего понятия EEPROM, а не наоборот, как пытаетесь доказать нам вы.


Вопрос был совсем о другом.


Вопрос топикстартера:
Мне бы очень хотелось, чтобы во флаш можно было размещать переменные без модификатора соnst, это сильно упростило бы мне жизнь. Такое возможно?

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

Чем не ответ на вопрос? Особенно, если спрашивающему все-таки (случайно) удобнее держать константы на во флэше программ, а в EEPROM данных.
Хотя если задача состоит не в том, чтобы ответить на вопрос (может быть, даже начинающего), а пофлеймить, уличить участника в глупости и помериться ммм... интеллектами, то на здоровье!
defunct
Цитата(V_G @ Nov 15 2009, 02:16) *
Хотя если задача состоит не в том, чтобы ответить на вопрос
... уличить участника

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


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

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

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

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

Изначальный вопрос автора - как заставить компилятор положить RW данные в RO регион памяти. Ответ - никак.
Сергей Борщ
Цитата(V_G @ Nov 15 2009, 02:16) *
Вопрос топикстартера:
Мне бы очень хотелось, чтобы во флаш можно было размещать переменные без модификатора соnst, это сильно упростило бы мне жизнь. Такое возможно?
Ну и где здесь про необходимость модифицировать данные, размещенные во флешь? Вы ветку читали, или только первое и последнее сообщение? Автору надо передать в функцию указатель на данные, размещенные во флешь. Функция ингода (в зависимости от других параметров) может модифицировать передаваемые ей по указателю данные (поэтому автор не может объявить параметр как указатель на константу), но в моменты вызова функции с указателем на флешь другие параметры не допускают такой модификации.

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

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

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

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

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

Впрочем, ввиду мутности "идеи" гадать можно долго.
Dreamer
Сергей Борщ. Вы абсолютно правильно меня поняли.

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


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

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

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

Во многих местах, как выяснилось, мне оказалось достаточным дефолтных значений структуры, и создавать лишний объект в стеке (или в хипе) только лишь ради корректного приведения указателей мне показалось лишним, я хотел соптимизировать этот момент, перебрал несколько идей - в том чиле и этот пост, так как повторюсь, в Кейле для 51 процессоров, с которыми я работал до этого процессора, это прокатывало.
Приведение указателя "конст" к "не конст" с помощью круглых скобок при вызове функции мне не показалось лучшим решением.
Но на данный момент я оставил это место как есть и иду дальше, так как сроки проекта короткие, и если вдаваться в глубокие рассуждения на тему "кто круче, а кто дурак" - то так я точно в сроки не уложусь. Пусть лучше считают дураком, но при этом делается мое дело. А обсуждать что-либо на форуме больше не хочу. Перехожу обратно в разряд читателей.
zltigo
Цитата(Dreamer @ Nov 17 2009, 13:57) *
Сергей Борщ. Вы абсолютно правильно меня поняли.
...
Модифицировать эти данные мне действительно не нужно.

Э... вообще-то это взаимоисключающие утверждения sad.gif
sigmaN
Не понял.
Если НЕ НУЖНО, то чего бы там const не вписать то?????
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.