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

 
 
> avr-gcc, строка символов во FLASH, Как заставить компилятор строки символов размещать во FLASH?
impatt
сообщение Nov 8 2006, 06:14
Сообщение #1


Частый гость
**

Группа: Validating
Сообщений: 169
Регистрация: 10-11-04
Из: Челябинск
Пользователь №: 1 088



Насколько я понимаю, gcc строки символов помещает в ОЗУ.Например:
Код
puts ("test\n");

превращается в примерно следующее:
Код
unsigned char name[] = "test\n";
puts(name);

где name во второй строке есть указатель на область ОЗУ, где находится строка.
Теперь вопрос: как сделать так, чтобы gcc в местах, подобных первому примеру, помещал строки во FLASH и брал указатели соответственно.
Вариант, когда все строки перечисляются в начале программы с атрибутом __attribute__((section(".flash"))), не годятся, ибо неудобно. Точнее, годятся, но неудобно и потому не годятся.

Есть мнения ?
Спасибо.

Сообщение отредактировал impatt - Nov 8 2006, 06:15
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jorikdima
сообщение Nov 8 2006, 06:58
Сообщение #2


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Это совсем недавно обсуждалось. На самом деле вы подумайте, ведь не могут строки располагаться не в ПЗУ. Иначе как контроллер будет "помнить" строчку test после выключения питания?? ))) Она располагается в ПЗУ (флэш в данном случае), а в момент инициализации контроллера ПРОГРАММНО подобные строки ( глобальные переменные...) перепичываются (копируются) в ОЗУ и далее используются оттуда, чтобы быстрее было.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 8 2006, 07:17
Сообщение #3


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(jorikdima @ Nov 8 2006, 14:58) *
Это совсем недавно обсуждалось. На самом деле вы подумайте, ведь не могут строки располагаться не в ПЗУ. Иначе как контроллер будет "помнить" строчку test после выключения питания?? ))) Она располагается в ПЗУ (флэш в данном случае), а в момент инициализации контроллера ПРОГРАММНО подобные строки ( глобальные переменные...) перепичываются (копируются) в ОЗУ и далее используются оттуда, чтобы быстрее было.

Наверное дело не в скорости, а в стандарте языка Си... не знаю

impatt ответ на поставленный вопрос Вы найдете в этой теме.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
impatt
сообщение Nov 8 2006, 08:09
Сообщение #4


Частый гость
**

Группа: Validating
Сообщений: 169
Регистрация: 10-11-04
Из: Челябинск
Пользователь №: 1 088



Цитата(haker_fox @ Nov 8 2006, 10:17) *
impatt ответ на поставленный вопрос Вы найдете в этой теме.

Нашел вариации на тему __attribute__((section(".flash"))), оно же макрос PROGMEM или как там его. Мож, я плохо глядел ?...
Интересует именно работоспособность варианта №1 в моём первом посте. Делать заготовки в виде переменных в начале единицы компиляции (файла *.с) неудобно.


Цитата(prottoss @ Nov 8 2006, 09:57) *
Цитата(impatt @ Nov 8 2006, 13:14) *
...Теперь вопрос: как сделать так, чтобы gcc в местах, подобных первому примеру, помещал строки во FLASH и брал указатели соответственно.
Я недавно решал такую проблему с ИАРом. Там есть хедер pgmspace.h, который надо подключить, плюс в командной строке компилера прописать команду --string_literals_in_flash

Я не пользуюсь gcc, но, возможно, там есть и хедер и в командной строке подобная директива

Боюсь, что нет, но позже погляжу: gcc не заточен на микроконтроллеры, он вообще ни на что не заточен. Потому там понятие FLASH вне закона вообще. Что можно сделать, так это, например, не копировать секцию .data в RAM, и как-то заставить линкер подставлять указатель нужным образом. Вообще-то я эту кухню не очень хорошо знаю.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 9 2006, 07:17
Сообщение #5


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(impatt @ Nov 8 2006, 16:09) *
Цитата(haker_fox @ Nov 8 2006, 10:17) *


impatt ответ на поставленный вопрос Вы найдете в этой теме.

Нашел вариации на тему __attribute__((section(".flash"))), оно же макрос PROGMEM или как там его. Мож, я плохо глядел ?...
Интересует именно работоспособность варианта №1 в моём первом посте. Делать заготовки в виде переменных в начале единицы компиляции (файла *.с) неудобно.


Цитата(prottoss @ Nov 8 2006, 09:57) *
Цитата(impatt @ Nov 8 2006, 13:14) *
...Теперь вопрос: как сделать так, чтобы gcc в местах, подобных первому примеру, помещал строки во FLASH и брал указатели соответственно.
Я недавно решал такую проблему с ИАРом. Там есть хедер pgmspace.h, который надо подключить, плюс в командной строке компилера прописать команду --string_literals_in_flash

Я не пользуюсь gcc, но, возможно, там есть и хедер и в командной строке подобная директива

Боюсь, что нет, но позже погляжу: gcc не заточен на микроконтроллеры, он вообще ни на что не заточен. Потому там понятие FLASH вне закона вообще. Что можно сделать, так это, например, не копировать секцию .data в RAM, и как-то заставить линкер подставлять указатель нужным образом. Вообще-то я эту кухню не очень хорошо знаю.


Для одиночной строки

prog_char str_ok[] = "<ok>";


--------------------
Выбор.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- impatt   avr-gcc, строка символов во FLASH   Nov 8 2006, 06:14
- - prottoss   Цитата(impatt @ Nov 8 2006, 13:14) ...Теп...   Nov 8 2006, 06:57
||- - aesok   Цитата(impatt @ Nov 8 2006, 12:09) Боюсь,...   Nov 8 2006, 18:22
|||- - impatt   Цитата(aesok @ Nov 8 2006, 21:22) GCC это...   Nov 9 2006, 03:48
|||- - aesok   Цитата(impatt @ Nov 9 2006, 07:48) Вероят...   Nov 9 2006, 16:32
|||- - prottoss   Цитата(aesok @ Nov 9 2006, 23:32) Цитата(...   Nov 9 2006, 16:44
||||- - aesok   Цитата(prottoss @ Nov 9 2006, 20:44) Почи...   Nov 9 2006, 17:26
||||- - prottoss   Цитата(aesok @ Nov 10 2006, 00:26) Религи...   Nov 9 2006, 17:37
|||- - impatt   Цитата(aesok @ Nov 9 2006, 19:32) Я писал...   Nov 10 2006, 03:04
|||- - prottoss   Цитата(impatt @ Nov 10 2006, 10:04) Может...   Nov 10 2006, 12:24
|- - impatt   Цитата(jorikdima @ Nov 8 2006, 09:58) На ...   Nov 8 2006, 07:53
- - PaulS   А что, в GCC модификаторы __flash и __eeprom не р...   Nov 8 2006, 20:24
- - klen   Назовите хотябы 3 фишек в которых avr-gcc уступает...   Nov 10 2006, 16:29
- - prottoss   Цитата(klen @ Nov 10 2006, 23:29) Назовит...   Nov 10 2006, 16:48


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

 


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


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