Hi There,
I am trying to get an idea of the RAM and Flash use of my program as I have recently bumped into a region overflow issue:
section .bss will not fit in region "m_data"
I am using the MK64FN1M0VLL12 uc with 256KB RAM and 1MB Flash.
I want to statically add an array which is 170*128*2=43520 bytes long.
From what I see in the print size before adding the array only 66560 Bytes are used in RAM so far.
Alas, I get a m_data region overflown by 31732 bytes when I add the array.
Below are code snippets and print size. What am I doing wrong?
Thanks a lot for your help,
S.
-----------------------------------------------
data.h:
extern uint16_t data_current_raw[MEASURES_MAX][BUFLEN];
data.c:
uint16_t data_current_raw[MEASURES_MAX][BUFLEN] = {{0}};
measure.c
#include "data.h"
#DEFINE MEASURES_MAX 170
#DEFINE BUFLEN 128
static uint16_t meas_data_all[MEASURES_MAX][BUFLEN] = {{0}};
(write important data in meas_data_all)
memcpy(data_current_raw, meas_data_all, sizeof(meas_data_all));
Here is the size print before adding data_current_raw:
Invoking: Cross ARM GNU Print Size
arm-none-eabi-size --format=sysv --totals "XXX.elf"
section size addr
.interrupts 1024 0
.flash_config 16 1024
.text 129536 1040
.ARM 8 130576
.init_array 4 130584
.fini_array 4 130588
.interrupts_ram 1024 536805376
.data 1016 536806400
.bss 50172 536807416
.heap 1024 536870912
.stack 1024 536871936
.ARM.attributes 48 0
.debug_info 266651 0
.debug_abbrev 42800 0
.debug_aranges 9744 0
.debug_ranges 10288 0
.debug_macro 243827 0
.debug_line 133816 0
.debug_str 1898995 0
.comment 112 0
.debug_frame 32100 0
.debug_loc 48696 0
.stab 156 0
.stabstr 387 0
Total 2872472
Solved! Go to Solution.
 
					
				
		
 ZhangJennie
		
			ZhangJennie
		
		
		
		
		
		
		
		
	
			
		
		
			
					
		Hi Sylvain,
we can refer K64 reference manual for why SRAM is separated into two parts.
becuase SRAM_L and SRAM_U are accessible by different bus. in some low power mode, for example VLLS2 (Very Low Leakage Stop2), SRAM_L is powered off. A portion of SRAM_U remains powered on.
if your project uses SRAM_L and SRAM_U in same way, I think you can use them together.
for example in ld file, we define m_data as
| m_data | (RW) : ORIGIN = 0x1FFF0000, LENGTH = 0x00040000 | 
| /* m_data_2 | (RW) : ORIGIN = 0x20000000, LENGTH = 0x00030000 */ | 
then don't forget allocate related stack and heap to m_data too
after build, there is no error. in map file. we can see meas_data_all and and data_current_raw succesfully allocated.
.bss.meas_data_all
0x1fff00a4 0xaa00 ./source/main.o
.bss.data_current_raw
0x1fffaaa4 0xaa00 ./source/main.o
0x1fffaaa4 data_current_raw
can this help you?
Zhang Jun
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------
 
					
				
		
 ZhangJennie
		
			ZhangJennie
		
		
		
		
		
		
		
		
	
			
		
		
			
					
		hi Sylvain,
I just copied your code in one of K64 KSDK project, I can reproduce your problem.
you defined
uint16_t data_current_raw[MEASURES_MAX][BUFLEN] = {{0}};
static uint16_t meas_data_all[MEASURES_MAX][BUFLEN] = {{0}};
each of the size is 170*128*2=43520 , so two arrays use 43520*2=87040 bytes code size .
both of these arrays are distributed to .bss section.
in linker file(under C:\Freescale\KSDK_1.3.0\platform\devices\MK64F12\linker\gcc), there are two data areas:
 
and .bss section is allocated to m_data which total size is 65535 bytes
if we allocate larger memory to .bss. this can solve the problem. here I allocate .bss to m_data2 which has 196608 bytes size, .bss can hold the arrays.
then i built the project again. there is no error.
can you please try the same?
can this help you?
Have a great day,
Zhang Jun
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------
Hi Zhang,
Thanks a lot for the tip, I will have a go and give you an update.
In the meantime can you tell me why the RAM is cut in two part with respectively 25% and 75% of the memory?
What if I want to make use of the full 256KB of RAM?
Thanks,
Sylvain.
 
					
				
		
 ZhangJennie
		
			ZhangJennie
		
		
		
		
		
		
		
		
	
			
		
		
			
					
		Hi Sylvain,
we can refer K64 reference manual for why SRAM is separated into two parts.
becuase SRAM_L and SRAM_U are accessible by different bus. in some low power mode, for example VLLS2 (Very Low Leakage Stop2), SRAM_L is powered off. A portion of SRAM_U remains powered on.
if your project uses SRAM_L and SRAM_U in same way, I think you can use them together.
for example in ld file, we define m_data as
| m_data | (RW) : ORIGIN = 0x1FFF0000, LENGTH = 0x00040000 | 
| /* m_data_2 | (RW) : ORIGIN = 0x20000000, LENGTH = 0x00030000 */ | 
then don't forget allocate related stack and heap to m_data too
after build, there is no error. in map file. we can see meas_data_all and and data_current_raw succesfully allocated.
.bss.meas_data_all
0x1fff00a4 0xaa00 ./source/main.o
.bss.data_current_raw
0x1fffaaa4 0xaa00 ./source/main.o
0x1fffaaa4 data_current_raw
can this help you?
Zhang Jun
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------
