Memory available to the Cortex-M4 on the Colibri iMX7

Hi!

A customer is developing an application using the Cortex-M4 core on the Colibri iMX7D.
They’re reporting that they m_text memory is overflowing - which means their application is too large.
Here’s a log of a compilation:

-- TOOLCHAIN_DIR: /home/fnery/gcc-arm-none-eabi-4_9-2015q3/
-- BUILD_TYPE: Release
-- Configuring done
-- Generating done
-- Build files have been written to: /home/fnery/Vibracao/M4/firmware/rpmsg/str_echo_bm/armgcc/release
Scanning dependencies of target rpmsg_str_echo_bm
[  1%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/multicore/open-amp/porting/imx7d_m4/platform_info.c.obj
[  1%] Building ASM object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/platform/devices/MCIMX7D/startup/gcc/startup_MCIMX7D_M4.S.obj
[  2%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/multicore/open-amp/common/hil/hil.c.obj
[  3%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/multicore/open-amp/porting/imx7d_m4/platform.c.obj
[  4%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/multicore/open-amp/common/llist/llist.c.obj
[  5%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/multicore/open-amp/common/shm/sh_mem.c.obj
[  6%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/multicore/open-amp/porting/config/config.c.obj
[  7%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/multicore/open-amp/rpmsg/remote_device.c.obj
[  8%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/multicore/open-amp/rpmsg/rpmsg_ext.c.obj
[  9%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/multicore/open-amp/rpmsg/rpmsg.c.obj
[ 10%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/multicore/open-amp/rpmsg/rpmsg_core.c.obj
[ 11%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/multicore/open-amp/virtio/virtqueue.c.obj
[ 12%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/multicore/open-amp/virtio/virtio.c.obj
[ 13%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/multicore/open-amp/porting/env/bm/rpmsg_porting.c.obj
[ 14%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/platform/drivers/src/ccm_analog_imx7d.c.obj
[ 15%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/platform/drivers/src/lmem.c.obj
[ 16%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/platform/drivers/src/ccm_imx7d.c.obj
[ 17%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/platform/drivers/src/rdc.c.obj
[ 18%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/platform/drivers/src/wdog_imx.c.obj
[ 19%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/platform/utilities/src/debug_console_imx.c.obj
[ 21%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/platform/utilities/src/print_scan.c.obj
[ 21%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/platform/devices/MCIMX7D/startup/system_MCIMX7D_M4.c.obj
[ 22%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/firmware/pin_mux.c.obj
[ 23%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/firmware/board.c.obj
[ 24%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/firmware/clock_freq.c.obj
[ 25%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/firmware/rpmsg/str_echo_bm/hardware_init.c.obj
[ 26%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/firmware/rpmsg/str_echo_bm/str_echo_bm.c.obj
[ 27%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/platform/drivers/src/uart_imx.c.obj
[ 28%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/platform/drivers/src/mu_imx.c.obj
[ 29%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/common/rt_nonfinite.c.obj
[ 30%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/common/rtGetInf.c.obj
[ 31%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/common/rtGetNaN.c.obj
[ 32%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeAMR/computeAMR.c.obj
[ 33%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeAMR/computeAMR_initialize.c.obj
[ 34%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeAMR/computeAMR_terminate.c.obj
[ 35%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeAren/computeAren_initialize.c.obj
[ 36%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeAren/computeAren.c.obj
[ 37%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeAren/computeAren_terminate.c.obj
[ 38%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeCrestFactor/computeCrestFactor.c.obj
[ 39%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeCrestFactor/computeCrestFactor_initialize.c.obj
[ 40%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeCrestFactor/computeCrestFactor_terminate.c.obj
[ 41%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeFT/computeFT_data.c.obj
[ 42%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeFT/computeFT.c.obj
[ 43%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeFT/computeFT_emxAPI.c.obj
[ 44%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeFT/computeFT_emxutil.c.obj
[ 45%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeFT/computeFT_initialize.c.obj
[ 46%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeFT/computeFT_terminate.c.obj
[ 47%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeFT/updateFT.c.obj
[ 48%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeMSDV/computeMSDV.c.obj
[ 49%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeMSDV/computeMSDV_initialize.c.obj
[ 50%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeMSDV/computeMSDV_terminate.c.obj
[ 51%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeMSDV/updateMSDV.c.obj
[ 52%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeMTVV/computeMTVV.c.obj
[ 53%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeMTVV/computeMTVV_data.c.obj
[ 54%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeMTVV/computeMTVV_initialize.c.obj
[ 55%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeMTVV/computeMTVV_terminate.c.obj
[ 56%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computePeak/computePeak.c.obj
[ 57%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computePeak/computePeak_initialize.c.obj
[ 58%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computePeak/computePeak_terminate.c.obj
[ 59%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computePeak/computePeak_data.c.obj
[ 60%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeRMSAcc/computeRMSAcc.c.obj
[ 61%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeRMSAcc/computeRMSAcc_data.c.obj
[ 62%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeRMSAcc/computeRMSAcc_initialize.c.obj
[ 63%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeRMSAcc/computeRMSAcc_terminate.c.obj
[ 64%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeRunningRMSAcc/computeRunningRMSAcc.c.obj
[ 65%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeRunningRMSAcc/computeRunningRMSAcc_data.c.obj
[ 66%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeRunningRMSAcc/computeRunningRMSAcc_initialize.c.obj
[ 67%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeRunningRMSAcc/computeRunningRMSAcc_terminate.c.obj
[ 68%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeVDV/computeVDV_data.c.obj
[ 69%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeVDV/computeVDV.c.obj
[ 70%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeVDV/computeVDV_initialize.c.obj
[ 71%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeVDV/computeVDV_terminate.c.obj
[ 72%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeVDV/updateVDV.c.obj
[ 73%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeVDVExp/computeVDVExp_initialize.c.obj
[ 74%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeVDVExp/computeVDVExp.c.obj
[ 75%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeVDVExp/computeVDVExp_terminate.c.obj
[ 76%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeVDVR/computeVDVR.c.obj
[ 77%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeVDVR/computeVDVR_initialize.c.obj
[ 78%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/computeVDVR/computeVDVR_terminate.c.obj
[ 79%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/filterWb/filterWb.c.obj
[ 80%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/filterWb/filterWb_data.c.obj
[ 81%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/filterWb/filterWb_initialize.c.obj
[ 82%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/filterWb/filterWb_terminate.c.obj
[ 83%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/filterWb/filterWc.c.obj
[ 84%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/filterWb/filterWd.c.obj
[ 85%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/filterWb/filterWe.c.obj
[ 86%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/filterWb/filterWf.c.obj
[ 87%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/filterWb/filterWh.c.obj
[ 88%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/filterWb/filterWj.c.obj
[ 89%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/filterWb/filterWk.c.obj
[ 90%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/filterWb/filterWm.c.obj
[ 91%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/filtroAntiAlias/filtroAntiAlias.c.obj
[ 92%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/filtroAntiAlias/filtroAntiAlias_data.c.obj
[ 93%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/filtroAntiAlias/filtroAntiAlias_initialize.c.obj
[ 94%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/filtroAntiAlias/filtroAntiAlias_terminate.c.obj
[ 95%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/octaveFilters/octaveFilters.c.obj
[ 96%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/octaveFilters/octaveFilters_data.c.obj
[ 97%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/octaveFilters/octaveFilters_emxutil.c.obj
[ 98%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/octaveFilters/octaveFilters_initialize.c.obj
[ 99%] Building C object CMakeFiles/rpmsg_str_echo_bm.dir/home/fnery/Vibracao/M4/middleware/lib/octaveFilters/octaveFilters_terminate.c.obj
[100%] Linking C executable rpmsg_str_echo_bm.elf
CMakeFiles/rpmsg_str_echo_bm.dir/build.make:2660: recipe for target 'rpmsg_str_echo_bm.elf' failed
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/rpmsg_str_echo_bm.dir/all' failed
Makefile:83: recipe for target 'all' failed
/home/fnery/gcc-arm-none-eabi-4_9-2015q3/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld: rpmsg_str_echo_bm.elf section `.text' will not fit in region `m_text'
/home/fnery/gcc-arm-none-eabi-4_9-2015q3/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/bin/ld: region `m_text' overflowed by 884 bytes
collect2: error: ld returned 1 exit status
make[2]: *** [rpmsg_str_echo_bm.elf] Error 1
make[1]: *** [CMakeFiles/rpmsg_str_echo_bm.dir/all] Error 2
make: *** [all] Error 2

They want to know if they can change the m_text and m_data allocation sizes on the linker script and make sure that the Linux side on the A7 core is aware of that.

Their goal is to run the application as fast as possible, but they’re aware the TCM memory is kind of low (32kB). So they also want to know how much space they have in OCRAM for the M4 and in the case of DDR, how much DDR they can allocate without affecting Linux (I know this is too application specific, but they want general pointers).

Dear @gustavo.tx
There’s no check Linux can do to query what part of the RAM is used by the M4 application. Therefore all we can do is:

  1. using the RAM which is anyway left untouched by Linux, or
  2. reconfigure Linux to leave additional memory untouched.

I strongly assume sticking with option 1 is sufficient in this case, as there is plenty of On-chip SRAM available, and even some Megabytes of DDR already reserved.

The build log shows an overlap of only 884 bytes.

  1. If this is the amount of memory we’re looking for, I suggest to reduce the heap and/or stack size in TCMU, and place the code there. This is almost as fast as TCML.
  2. The next option would be to use OCRAM, which is available except a small portion of it (compare to community question “starting m4 application from ocram imx7”,
  3. OCRAM_EPDC, OCRAM_PXP and OCRAM_S area also available (refer to the developer page article “FreeRTOS on the Cortex-M4 of a Colibri iMX7”
  4. If this is still not enough, there’s DRAM available. Let me know if I need to lookup the details for you.

Regards, Andy