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

 
 
 
Reply to this topicStart new topic
> GCC 4.3.2 Расположение данных вр флэш памяти, компилер упорно кладёт текст в ОЗУ
sonycman
сообщение Nov 22 2008, 06:07
Сообщение #1


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Есть функция (в проекте для ИАРа) вида:
lcdPrintText(__flash char * text);
и её вызoв:
lcdPrintText("Some shit");

Как сделать подобное в новом GCC так, чтобы строка распологалась в памяти программ?
Компилер упорно грузит её в ОЗУ!
Ключевые слова prog_char и PROGMEM совершенно не помогают!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 22 2008, 07:41
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(sonycman @ Nov 22 2008, 08:07) *
Как сделать подобное в новом GCC так, чтобы строка распологалась в памяти программ?
Прочитать WinAVR/doc/avr-libc/FAQ.html? Ключевое слово PSTR(), но прочитать FAQ нужно от начала до конца.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 22 2008, 08:23
Сообщение #3


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Спасибо за наводку. Буду штудировать! :-)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 22 2008, 09:10
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(sonycman @ Nov 22 2008, 11:23) *
Спасибо за наводку. Буду штудировать! :-)
Читай между строкsmile.gif
Таким способом можно сильно повысить читаемость кода
Код
void lcd_print_str  (unsigned char x, unsigned char y, char* p);          // print RAM str
void lcd_print_cstr (unsigned char x, unsigned char y, const char* p);    // print FLASH str

#define  lcd_print_PSTR(X,Y,LCDPSTR)   lcd_print_cstr(X,Y,PSTR(LCDPSTR))  // put str in to FLASH and then print


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Dec 3 2008, 10:13
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Не хотелось плодить тем, поэтому напишу прямо сюда.

В общем проект создан на C++. Не пойму в чем дело, компилятор не хочет компилировать
заголовки классов в h-файлах. Яр эту конструкцию кушает нормально. В чем может быть дело?

Сообщение отредактировал Vitaliy_ARM - Dec 3 2008, 10:16
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 3 2008, 11:05
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Vitaliy_ARM @ Dec 3 2008, 12:13) *
В общем проект создан на C++. Не пойму в чем дело, компилятор не хочет компилировать
заголовки классов в h-файлах. Яр эту конструкцию кушает нормально. В чем может быть дело?
Судя по всему он не понял слова class. Значит, он компилирует в режиме С, а не С++. Какое расширение имеет ваш файл (должен иметь .cpp)? Покажите командную строку компилятора - может там принудительно задан режим С.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Dec 3 2008, 12:59
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Цитата(Сергей Борщ @ Dec 3 2008, 14:05) *
Судя по всему он не понял слова class. Значит, он компилирует в режиме С, а не С++. Какое расширение имеет ваш файл (должен иметь .cpp)? Покажите командную строку компилятора - может там принудительно задан режим С.


Расширение файла правильное - cpp. Где эту строчку можно посмотреть?
На всякий случай положу майкфайл.
Прикрепленные файлы
Прикрепленный файл  Makefile.zip ( 5.63 килобайт ) Кол-во скачиваний: 31
 


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 3 2008, 13:27
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Vitaliy_ARM @ Dec 3 2008, 14:59) *
Расширение файла правильное - cpp. Где эту строчку можно посмотреть?
На прикрепленной вами картинке есть вкладка Console. Откройте ее, там же будут и более подробные сообщения об ошибке.
Цитата(Vitaliy_ARM @ Dec 3 2008, 14:59) *
На всякий случай положу майкфайл.
Вижу в нем два С-файла:
SRC = Rc6\Rc6.c
SRC += Fldr\Fldr.c

Вы уверены, что Trg.h не включен (возможно косвенно) в один из этих файлов? В консоли вы увидете, при компиляции какого именно файла подключился этот заголовок.

Еще вижу у вас сообщение, что Эклипса не может найти генератор инфо. Зайдите в Project->Options->C/C++ Build->Discovery options и в поле Compiler invokation command впишите arm-elf-gcc.exe вместо gcc.exe. Увидите много полезного, в частности - в окне Outline

P.S.
Цитата(Vitaliy_ARM @ Dec 3 2008, 12:13) *
Не хотелось плодить тем, поэтому напишу прямо сюда.
Напрасно. Оно совсем с темой топика не коррелирует.
Может кто-то из модераторов отделит это обсуждение в отдельную ветку?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Dec 3 2008, 14:03
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Цитата(Сергей Борщ @ Dec 3 2008, 16:27) *
На прикрепленной вами картинке есть вкладка Console. Откройте ее, там же будут и более подробные сообщения об ошибке.

Вот консоль.
Код
Assembling (ARM-only): crt0.S  arm-elf-gcc -c -mcpu=arm7tdmi-s  -I. -x assembler-with-cpp -DRAM_RUN -D__WinARM__ -D__WINARMSUBMDL_LPC2468__ -Wa,-adhlns=crt0.lst,-gdwarf-2 crt0.S -o crt0.o    Compiling C: Rc6\Rc6.c  arm-elf-gcc -c  -mcpu=arm7tdmi-s  -I. -gdwarf-2 -DRAM_RUN -D__WinARM__ -D__WINARMSUBMDL_LPC2468__  -Os -Wall -Wcast-align -Wimplicit  -Wpointer-arith -Wswitch -ffunction-sections -fdata-sections -Wredundant-decls -Wreturn-type -Wshadow -Wunused -Wa,-adhlns=Rc6\Rc6.lst  -ICommon/inc -Wcast-qual -MD -MP -MF .dep/Rc6.o.d -Wnested-externs  -std=gnu99 -Wmissing-prototypes  -Wstrict-prototypes -Wmissing-declarations Rc6\Rc6.c -o Rc6\Rc6.o   In file included from Rc6\/..\includes.h:30,                   from Rc6\Rc6.c:5:  Rc6\/..\/Target\Trg.h:64: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'LPCTARGET'  Rc6\/..\/Target\Trg.h:71: warning: data definition has no type or storage class  Rc6\/..\/Target\Trg.h:71: warning: type defaults to 'int' in declaration of 'TARGET'  Rc6\/..\/Target\Trg.h:71: warning: type defaults to 'int' in declaration of 'pTARGET'  make: *** [Rc6\Rc6.o] Error 1

Цитата(Сергей Борщ @ Dec 3 2008, 16:27) *
Вижу в нем два С-файла:
SRC = Rc6\Rc6.c
SRC += Fldr\Fldr.c
Вы уверены, что Trg.h не включен (возможно косвенно) в один из этих файлов?


Подключены через один глобальный файл! Этого я не знал. Всегда делал так в одном глобальном файле прописывал все инклюды и потом его уже цеплял во всех исходниках. При этом IAR игнорировал слова C++ и выдавал ошибки, если этот класс непосредственно был использован.
А можно ли сделать и здесь сделать игнорирование?

Цитата(Сергей Борщ @ Dec 3 2008, 16:27) *
Еще вижу у вас сообщение, что Эклипса не может найти генератор инфо. Зайдите в Project->Options->C/C++ Build->Discovery options и в поле Compiler invokation command впишите arm-elf-gcc.exe вместо gcc.exe. Увидите много полезного, в частности - в окне Outline


Исправил

Цитата(Сергей Борщ @ Dec 3 2008, 16:27) *
P.S.
Напрасно. Оно совсем с темой топика не коррелирует.
Может кто-то из модераторов отделит это обсуждение в отдельную ветку?


Согласен, вопрос разросся.

Сообщение отредактировал Vitaliy_ARM - Dec 3 2008, 14:04


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 3 2008, 14:14
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Vitaliy_ARM @ Dec 3 2008, 16:03) *
А можно ли сделать и здесь сделать игнорирование?
Самый простой путь - заключить "плюсовые" определения или #include этого файла в
Код
#ifdef __cplusplus
....
#endif
Но грамотнее, конечно, включать плюсовые заголовки только в плюсовые файлы или перевести Сишные исходники на плюсы. Или попробуйте просто переименовать Rc6.c в Rc6.cpp - может он скомпилится в плюсовом режиме.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Dec 3 2008, 16:50
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Цитата(Сергей Борщ @ Dec 3 2008, 17:14) *
Самый простой путь - заключить "плюсовые" определения или #include этого файла в
Код
#ifdef __cplusplus
....
#endif
Но грамотнее, конечно, включать плюсовые заголовки только в плюсовые файлы или перевести Сишные исходники на плюсы. Или попробуйте просто переименовать Rc6.c в Rc6.cpp - может он скомпилится в плюсовом режиме.


В общем поменял расширение Rc6.c на cpp. Помогло. Этот вариант мне подходит. Спасибо!


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post

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

 


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


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