Перейти к содержанию
    

GCC 4.3.2 Расположение данных вр флэш памяти

Есть функция (в проекте для ИАРа) вида:

lcdPrintText(__flash char * text);

и её вызoв:

lcdPrintText("Some shit");

 

Как сделать подобное в новом GCC так, чтобы строка распологалась в памяти программ?

Компилер упорно грузит её в ОЗУ!

Ключевые слова prog_char и PROGMEM совершенно не помогают!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за наводку. Буду штудировать! :-)
Читай между строк:)

Таким способом можно сильно повысить читаемость кода

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

В общем проект создан на C++. Не пойму в чем дело, компилятор не хочет компилировать

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

post-29246-1228299325_thumb.jpg

Изменено пользователем Vitaliy_ARM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем проект создан на C++. Не пойму в чем дело, компилятор не хочет компилировать

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

Судя по всему он не понял слова class. Значит, он компилирует в режиме С, а не С++. Какое расширение имеет ваш файл (должен иметь .cpp)? Покажите командную строку компилятора - может там принудительно задан режим С.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Судя по всему он не понял слова class. Значит, он компилирует в режиме С, а не С++. Какое расширение имеет ваш файл (должен иметь .cpp)? Покажите командную строку компилятора - может там принудительно задан режим С.

 

Расширение файла правильное - cpp. Где эту строчку можно посмотреть?

На всякий случай положу майкфайл.

Makefile.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Расширение файла правильное - cpp. Где эту строчку можно посмотреть?
На прикрепленной вами картинке есть вкладка Console. Откройте ее, там же будут и более подробные сообщения об ошибке.

На всякий случай положу майкфайл.
Вижу в нем два С-файла:

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.

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

Может кто-то из модераторов отделит это обсуждение в отдельную ветку?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На прикрепленной вами картинке есть вкладка 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

Вижу в нем два С-файла:

SRC = Rc6\Rc6.c

SRC += Fldr\Fldr.c

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

 

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

А можно ли сделать и здесь сделать игнорирование?

 

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

 

Исправил

 

P.S.

Напрасно. Оно совсем с темой топика не коррелирует.

Может кто-то из модераторов отделит это обсуждение в отдельную ветку?

 

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

Изменено пользователем Vitaliy_ARM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно ли сделать и здесь сделать игнорирование?
Самый простой путь - заключить "плюсовые" определения или #include этого файла в
#ifdef __cplusplus
....
#endif

Но грамотнее, конечно, включать плюсовые заголовки только в плюсовые файлы или перевести Сишные исходники на плюсы. Или попробуйте просто переименовать Rc6.c в Rc6.cpp - может он скомпилится в плюсовом режиме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Самый простой путь - заключить "плюсовые" определения или #include этого файла в
#ifdef __cplusplus
....
#endif

Но грамотнее, конечно, включать плюсовые заголовки только в плюсовые файлы или перевести Сишные исходники на плюсы. Или попробуйте просто переименовать Rc6.c в Rc6.cpp - может он скомпилится в плюсовом режиме.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...