9 years, 4 months ago.

Flash overflows with GCC export by adding UART

Hi, I've been using the MBED LPC1768 with the offline GNU toolchain (on Windows) for some time now and recently I switched to compiling for the FRDM-KL05Z.

A basic blinking led is not a problem. However, the second I add a uart port the linker complains about overflowing the flash.

-eabi/4.7.3/../../../../arm-none-eabi/bin/ld.exe: region `FLASH' overflowed by 5344 bytes
collect2.exe: error: ld returned 1 exit status

This is by simply calling the exported makefile. The command line this generates is:

arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -fno-common -fmessage-length
=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointe
r -MMD -MP -DNDEBUG -Os -DTARGET_KL05Z -DTARGET_M0P -DTARGET_CORTEX_M -DTARGET_F
reescale -DTARGET_KLXX -DTOOLCHAIN_GCC_ARM -DTOOLCHAIN_GCC -D__CORTEX_M0PLUS -DA
RM_MATH_CM0PLUS -DMBED_BUILD_TIMESTAMP=1418324231.0 -D__MBED__=1 -DTARGET_FF_ARD
UINO  -std=gnu++98 -fno-rtti -I. -I./external/mbed -I./external/mbed/TARGET_KL05
Z -I./external/mbed/TARGET_KL05Z/TARGET_Freescale -I./external/mbed/TARGET_KL05Z
/TARGET_Freescale/TARGET_KLXX -I./external/mbed/TARGET_KL05Z/TARGET_Freescale/TA
RGET_KLXX/TARGET_KL05Z -I./external/mbed/TARGET_KL05Z/TOOLCHAIN_GCC_ARM  -o main
.o main.cpp

Then the linker generates the error:

arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -Wl,--gc-sections --specs=nano.specs 
-u _printf_float -u _scanf_float -Wl,-Map=frdm_serial.map,--cref -T./external
/mbed/TARGET_KL05Z/TOOLCHAIN_GCC_ARM/MKL05Z4.ld 
-L./external/mbed/TARGET_KL05Z/TOOLCHAIN_GCC_ARM  -o frdm_serial.elf main.o 
external/mbed/TARGET_KL05Z/TOOLCHAIN_GCC_ARM/retarget.o 
external/mbed/TARGET_KL05Z/TOOLCHAIN_GCC_ARM/system_MKL05Z4.o
external/mbed/TARGET_KL05Z/TOOLCHAIN_GCC_ARM/board.o 
external/mbed/TARGET_KL05Z/TOOLCHAIN_GCC_ARM/cmsis_nvic.o 
external/mbed/TARGET_KL05Z/TOOLCHAIN_GCC_ARM/mbed_overrides.o 
external/mbed/TARGET_KL05Z/TOOLCHAIN_GCC_ARM/startup_MKL05Z4.o 
-lmbed  -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys -lmbed  -lstdc++ -lsupc++ -lm -lc
-lgcc -lnosys

The code is surprisingly simple...

Serial uart(PTA0, PTA1);
DigitalOut blinky(LED1);

int main()
{
    for(;;)
    {

        wait_ms(100);
        blinky = !blinky

    }

    return 0;
}

Compiling much more complex programs in the online compiler is not an issue. So is this a bug from the GCC toolchain? Or related to my building on Windows?

Any help would be greatly appreciated

Question relating to:

The FRDM-KL05Z is an ultra-low-cost development platform enabled by the Kinetis L Series KL0x MCU family built on the ARM® Cortex™-M0+ processor. Features include easy access to MCU I/O, battery-ready, …

2 Answers

9 years, 4 months ago.

Edit: Yeah, what Martin said :)

Try removing these two options from the linker command line and see what happens:

-u _printf_float -u _scanf_float

That should discard a bunch of floating point code that the UART streaming support pulls in.

I hope that helps,

Adam

Accepted Answer

Hot diggity! Removing -u _printf_float -u _scanf_float did it.

arm-none-eabi-size Blinky.elf text data bss dec hex filename 16912 136 460 17508 4464 Blinky.elf

I already played with optimizations without any luck.

For future reference the KL05z has 32kB of flash:

Blinky with  -u _printf_float -u _scanf_float:

arm-none-eabi-size Blinky.elf
   text    data     bss     dec     hex filename
  32360     228     608   33196    81ac Blinky.elf

Blinky without  -u _printf_float -u _scanf_float:

arm-none-eabi-size Blinky.elf
   text    data     bss     dec     hex filename
   9720     128     352   10200    27d8 Blinky.elf


Blinky without  -u _printf_float -u _scanf_float with serial:

arm-none-eabi-size Blinky.elf
   text    data     bss     dec     hex filename
  16912     136     460   17508    4464 Blinky.elf

Still seems high for just a LED and uart though?

posted by K. N. L. V. 12 Dec 2014
9 years, 4 months ago.

Hi,

you did not specify the size of blinky without uart, the size of KL05Z (not all of us know all flash/ram sizes from top of our heads).

I would start removing floating support specs=nano.specs -u _printf_float -u _scanf_float, and play with optimizations, use LTO?