|
avr-gcc, строка символов во FLASH, Как заставить компилятор строки символов размещать во FLASH? |
|
|
|
Nov 8 2006, 06:14
|
Частый гость
 
Группа: 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
|
|
|
|
|
 |
Ответов
|
Nov 8 2006, 07:17
|

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

|
Цитата(jorikdima @ Nov 8 2006, 14:58)  Это совсем недавно обсуждалось. На самом деле вы подумайте, ведь не могут строки располагаться не в ПЗУ. Иначе как контроллер будет "помнить" строчку test после выключения питания?? ))) Она располагается в ПЗУ (флэш в данном случае), а в момент инициализации контроллера ПРОГРАММНО подобные строки ( глобальные переменные...) перепичываются (копируются) в ОЗУ и далее используются оттуда, чтобы быстрее было. Наверное дело не в скорости, а в стандарте языка Си... не знаю impatt ответ на поставленный вопрос Вы найдете в этой теме.
--------------------
Выбор.
|
|
|
|
|
Nov 8 2006, 08:09
|
Частый гость
 
Группа: 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, и как-то заставить линкер подставлять указатель нужным образом. Вообще-то я эту кухню не очень хорошо знаю.
|
|
|
|
|
Nov 9 2006, 07:17
|

Познающий...
     
Группа: Свой
Сообщений: 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>";
--------------------
Выбор.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|