int2str / NoSpark

AVR C++ based firmware for the OpenEVSE
GNU General Public License v3.0
6 stars 8 forks source link

compile issue with avr-g++ 5: PSTR string constants #5

Closed geith closed 5 years ago

geith commented 6 years ago

When building NoSpark on Ubuntu 17.10 (avr-gcc 5.4.0, avr-libc 2.0.0), the compiler has problems with the string constants using the PSTR() macro from avr/pgmspace.h:

[C++] lcdstaterunning.cpp
In file included from customcharacters.h:18:0,
                 from lcdstaterunning.cpp:27:
lcdstaterunning.cpp: In member function 'void ui::LcdStateRunning::drawDefault()':
strings_en.h:24:37: warning: uninitialized variable '__c' put into program memory area [-Wuninitialized]
 #define STR_STATE_ERROR             PSTR("ERROR    ")
                                     ^
lcdstaterunning.cpp:152:39: note: in expansion of macro 'STR_STATE_ERROR'
                 lcd << stream::PGM << STR_STATE_ERROR;

...

obj/libui.a(serialconsole.o): In function `ui::SerialConsole::handleCommand(char const*, unsigned char)':
/home/geith/src/openevse/NoSpark/ui/serialconsole.cpp:164: undefined reference to `ui::SerialConsole::SerialConsole(stream::UartStream&)::__c'
/home/geith/src/openevse/NoSpark/ui/serialconsole.cpp:164: undefined reference to `ui::SerialConsole::SerialConsole(stream::UartStream&)::__c'
/home/geith/src/openevse/NoSpark/ui/serialconsole.cpp:164: undefined reference to `ui::SerialConsole::SerialConsole(stream::UartStream&)::__c'
/home/geith/src/openevse/NoSpark/ui/serialconsole.cpp:164: undefined reference to `ui::SerialConsole::SerialConsole(stream::UartStream&)::__c'
/home/geith/src/openevse/NoSpark/ui/serialconsole.cpp:164: undefined reference to `ui::SerialConsole::SerialConsole(stream::UartStream&)::__c'
/home/geith/src/openevse/NoSpark/ui/serialconsole.cpp:165: undefined reference to `ui::SerialConsole::SerialConsole(stream::UartStream&)::__c'
/home/geith/src/openevse/NoSpark/ui/serialconsole.cpp:165: undefined reference to `ui::SerialConsole::SerialConsole(stream::UartStream&)::__c'
/home/geith/src/openevse/NoSpark/ui/serialconsole.cpp:165: undefined reference to `ui::SerialConsole::SerialConsole(stream::UartStream&)::__c'
/home/geith/src/openevse/NoSpark/ui/serialconsole.cpp:165: undefined reference to `ui::SerialConsole::SerialConsole(stream::UartStream&)::__c'
collect2: error: ld returned 1 exit status
Makefile:70: recipe for target 'obj/NoSpark.elf' failed
make: *** [obj/NoSpark.elf] Error 1

A solution in my version was to change the string constant definition from #define ... PSTR(...) to const variables. Currently, they are defined like this:

#define STR_STATE_READY             PSTR("READY    ")

I changed that in my version to a variable declaration in the header file and an assignment in a .cpp file:

extern char const STR_STATE_READY[];
#ifdef LANG_DE

char const STR_STATE_READY[] PROGMEM             = "BEREIT   ";
...
#else
// default language: EN

char const STR_STATE_READY[] PROGMEM             = "READY    ";
...
#endif

This changes the compile time language selection too (by CXXFLAG). As additional side effect, this change reduces also the image size a little from

avr-size NoSpark/NoSpark.hex 
   text    data     bss     dec     hex filename
      0   26514       0   26514    6792 NoSpark/NoSpark.hex

to

avr-size NoSpark-dai/NoSpark-dai.hex 
   text    data     bss     dec     hex filename
      0   26348       0   26348    66ec NoSpark/NoSpark.hex

I could prepare a pull request for this change too.

int2str commented 5 years ago

Thanks for the detailed report and suggested fix. I've made the recommended changes (untested).