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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Разместить переменную во 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
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

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

 


RSS Текстовая версия Сейчас: 5th June 2024 - 23:59
Рейтинг@Mail.ru


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