3 Replies Latest reply on Nov 10, 2019 10:43 PM by GeonaP_26

    PSOC4 Initial SRAM Consumption


      Hi all,


      I,m working on a PSOC4 CY8C4245AXI-483. After create, configure and compile an empty project, I'm getting high SRAM usage.


      Flash used: 3096 of 32768 bytes (9,4%).

      SRAM used: 1616 of 4096 bytes (39,5%). Stack: 128 bytes. Heap: 128 bytes.


      The map file shows that the compiler is using libc.a, but i've disabled the usage of libraries on Buld Settings:

      Use Default Libraries = False

      Use newlib-nano = False

      Use newlib-nano Float Formating= False




                      0x200000e0      0x428 c:/program files (x86)/cypress/psoc creator/4.2/psoc creator/import/gnu/arm/5.4.1/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv6-m\libc.a(lib_a-impure.o)



      The GCC settings are these:


      -nodefaultlibs -Wl,--gc-sections -g -ffunction-sections -Og -ffat-lto-objects -Wl,--end-group


      What's wrong?



        • 1. Re: PSOC4 Initial SRAM Consumption


          Have you turned off Debug?

          Is GCC compiler optimization options set for Speed or Size?

          Is this a Bootloadable project or Normal project?


          All above changes SRAM (and FLASH) usage.  Just some suggestions to look at.


          Open the .map file and scroll down (or search) for 0x20000000.  This is the start of .ramvectors.  By adding up all the used bytes, you should reach 1616 SRAM byte used.


          When I compiled an empty project, using same processor, Creator 3.1, this is what it generated  (I've deleted some lines to shorten the text):

          Flash used: 776 of 32768 bytes (2.4 %).

          SRAM used: 1404 of 4096 bytes (34.3 %). Stack: 1024 bytes. Heap: 128 bytes.


          .ramvectors     0x20000000       0xc0

                          0x20000000                __cy_region_start_ram = .



          .noinit         0x200000c0        0x4


          .noinit        0x200000c0        0x4 .\CortexM0\ARM_GCC_484\Release\Cm0Start.o


          .data           0x200000c8       0x18 load address 0x000002f0

                          0x200000c8                __cy_region_start_data = .


          .jcr           0x200000c8        0x4 c:/program files/cypress/psoc creator/3.1/psoc creator/import/gnu_cs/arm/4.8.4/bin/../lib/gcc/arm-none-eabi/4.8.4/armv6-m/crtend.o


          *(.data .data.* .gnu.linkonce.d.*)

          .data          0x200000cc       0x10 .\CortexM0\ARM_GCC_484\Release\Design02.a(CyLib.o)

                          0x200000cc                cydelay32kMs

                          0x200000d0                cydelayFreqKhz

                          0x200000d4                cydelayFreqMhz

                          0x200000d8                cydelayFreqHz

                          0x200000e0                . = ALIGN (0x8)

          *fill*         0x200000dc        0x4



          .bss            0x200000e0       0x20 load address 0x00000308



                          0x20000100                . = ALIGN (0x8)



          .heap           0x20000100       0x80 load address 0x00000308

                          0x20000180                . = (. + 0x80)



          .stack          0x20000c00      0x400

                          0x20000c00                __cy_stack_limit = .

                          0x20001000                . = (. + 0x400)



          When I add up SRAM used, it does equal 1404 (in my example build).


          For the most part, it's the Stack and Heap, that takes up most SRAM.


          The rest is taken up with other variables for Vectors,Timers, fill bytes,2 sets of Load Addresses,



          1152+252=1404 as reported by Creator.


          Maybe I could reduce SRAM usage if I also disabled the library options.



          I changed the linker build settings similar to yours and I had the same result as you did.

          I then set each of the libraries back to True (one-by-one) and found the Use newlib-nano = False is the culprit.  If you set this back to TRUE, less SRAM is used and the .data.impure_data will dissappear.


          This appears to be a bug.


          I hope somebody from Cypress will comment.



          • 2. Re: PSOC4 Initial SRAM Consumption



            To utilize Cypress provided initialize and startup function it is better using

            the default settings.


            And I think that the initial SRAM usage is more depending on the stack and heap size.

            So in the Workspace Explorer > Project > Design Wide Resources > System

            I tried to change

                Heap Size 0x80 > 0x10

                Stack Size 0x0400 > 0x0040

            Although I'm not sure if this is practical, the result SRAM usage was 464 bytes (11.3%)


            As the output said Stack 64 bytes Heap 16 bytes, rest of 384 byte must have been reserved for the library.

            And IMHO, 384 does not seem to be very big for a 32 bit CPU.