Hi,
I am working with TWR-K60D100M.
Stack Size I have used for Tasks is 21KB (Calculated from TASK_TEMPLATE_STRUCT, also seen from MQX Stack Usage).
Main Application BSS RAM is 34KB (seen from .MAP file). So total RAM used is 55KB approx.
I declared some more variables then build the project and Study .MAP file, that indicates Main Application BSS RAM is 62KB...And if I load that project it is stuck !!
From TWR-K60D100M User Manual I come to know that RAM Size is 128KB. Then why this is happening?
Is K60 RAM is divided under SRAM_L and SRAM_U of 64KB ? If yes then how can I access both RAM segments ? What changes I have to made in Linker File....?
Why I am not able to utilize 128KB of RAM?
Regards,
Utsavi Bharuchwala
Solved! Go to Solution.
Hello Utsavi,
Let me explain what I think is causing the problem and then you can do next test.
If you remember, SRAM is divided into 2 x 64-kB lenght blocks and they are accessed from different buses so we have to be sure that any object (variable, structure) is not stored by overlapping both sections, for example, next imagen shows a scenario where a 32-bit variable is stored between these blocks:
In this case, there would be an access problem and program would crash. Remember that this could be avoided in compilation-time although it is difficult to prevent this on run-time
Now, by analyzing your map file, this is how your memory is used:
You application data (like .bss objects) does use 51 520 bytes, after this, there is a segment called __KERNEL_DATA_START that signals where KERNEL will start to use data for stack or heap from different tasks. What i think could be causing the crashing is the fact that kernel could allocate any objetc in the limit of both SRAM sections, so we can make a quick test to validate if this is the problem or you are really using all the RAM in your project.
I'd recommend you to move the __KERNEL_DATA_START address to 0x2000_0000 although the left ~13kB of SRAM_L would get unnused, but this way we can be sure that kernel will not allocate memory in the middle of both sections:
For doing this, you will need to modify your linker file (located at: <MQX_4_0_PATH>\lib\twrk60d100m.cw10\debug\bsp) and add next line in memory segment:
MEMORY
{
vectorrom (RX): ORIGIN = 0x00000000, LENGTH = 0x00000400
cfmprotrom (R): ORIGIN = 0x00000400, LENGTH = 0x00000020
rom (RX): ORIGIN = 0x00000420, LENGTH = 0x0007FBE0 # Code + Const data
ram (RW): ORIGIN = 0x1FFF0000, LENGTH = 0x00020000 # SRAM - RW data
# kernel space starts after RAM variables (Location of MQX Kernel data + MQX heap)
end_of_kd (RW): ORIGIN = 0x2000FFF0, LENGTH = 0x00000000
# Boot stack reused by MQX Kernel data
bstack (RW): ORIGIN = 0x2000FA00, LENGTH = 0x00000200 # Boot stack
end_bstack (RW): ORIGIN = 0x2000FC00, LENGTH = 0x00000000
}
And also, modify:
.kernel_data :
{
__KERNEL_DATA_START = ALIGN(0x10);
As you can see, a new section called start_of_ram_u is added and __KERNEL_DATA_START should be place at this segment, this way, MQX's kernel will use all available memory in SRAM_U and we can be sure that no object will be stored in the limit of these sections.
Please take in mind that this linker files will be overwritten if you re-compile bsp library, so, modify the linker file every time you compile bsp library.
You can make this test and corroborate if program still crashes, if so, probably your are consuming all availble SRAM.
I hope this can help you!
Best regards,
Isaac Avila
Hello Utsavi,
If you look at K60's reference manual in section 3.5.3.2 SRAM Arrays, you will notice that effectively, there are two SRAM sections (SRAM_L and SRAM_U), also, in next chapter, there is a section (3.5.3.4 SRAM accesses) that specifies the access to these regions:
There is a note that says: "Burst-access cannot occur across the 0x2000_0000 boundary that separates the two SRAM arrays. The two arrays should be treated as separate memory ranges for burst accesses".
Problem here is when any object is stored sharing both sections, if this case occurs, we need to modify linker file to allocate a dummy section/variable in this limit to avoid any crashing due SRAM access.
In order to be sure that this is the problem you are facing, could you please be so kind to attach your map file?
Best Regards,
Isaac Avila
Hi Isaac,
Thanks for reply.
In my project I am using MFS and RTCS Lib.
i have not changed the .lcf file (default single 128kb block of SRAM linker
file ) and .map file find in attachment.
I our application I write like this:
1.
printf("Static RAM Usage: %d Bytes\r\n",
(uint32_t)_mqx_get_initialization()->START_OF_KERNEL_MEMORY -
0x1FFF0000);
2.
printf(" Peak RAM Usage: %d Bytes(%d%%)\r\n",
(uint32_t)_mem_get_highwater() - 0x1FFF0000,
((uint32_t)_mem_get_highwater() - 0x1FFF0000)/0x51E);
3.
printf("Current RAM Free: %d Bytes(%d%%)\r\n", memget_free(),
memget_free()/0x51E);
and show RAM usage as.,
Static RAM usage: 51520 Bytes
Peak RAM usage: 130484 Bytes(99 %)
Current RAM Free: 1484 Bytes (1%)
In MAP file BSS + DATA RAM = 51520 Bytes RAM match with Static RAM usage
Please elaborate Peak RAM usage...It is 78980 Bytes more than .MAP
file(51520)?
Where this size come from?
Is RTCS and MFS Library use 78980 Bytes RAM?
Please Elaborate this...I am confused..
Regards,
Utsavi Bharuchwala
On Wed, Feb 10, 2016 at 6:49 AM, isaacavila <admin@community.freescale.com>
Hello Utsavi,
Which MQX version are you using? I noticed that your linker file is different to mine in some aspects (extensions are also different) and _mem_get_free function is not described in MQX 4.2's reference manual.
Best Regards,
Isaac
hi isaac,
Thanks for your reply,
I am using Codewarrior version 10.6, *Freescale MQX™ RTOS Version 4.0.1 *and
Tower KIT TWRK60D100M (Proc-MK60DN512VMD10).
i upgraded Freescale MQX™ RTOS Version 4.2 but in this version our tower
TWRK60D100M lib (BSP,PSP,RTCS,MFS....) missing in cw10 folder.
(C:\Freescale\Freescale_MQX_4_2\mqx\build\cw10) (Not using GCC )
so without lib we cant use this version of MQX 4.2 . so i move further in
Version 4.0.
please help me out in RAM Scenario in MQX 4.0..
On Thu, Feb 11, 2016 at 3:34 AM, isaacavila <admin@community.freescale.com>
Hello Utsavi,
Let me explain what I think is causing the problem and then you can do next test.
If you remember, SRAM is divided into 2 x 64-kB lenght blocks and they are accessed from different buses so we have to be sure that any object (variable, structure) is not stored by overlapping both sections, for example, next imagen shows a scenario where a 32-bit variable is stored between these blocks:
In this case, there would be an access problem and program would crash. Remember that this could be avoided in compilation-time although it is difficult to prevent this on run-time
Now, by analyzing your map file, this is how your memory is used:
You application data (like .bss objects) does use 51 520 bytes, after this, there is a segment called __KERNEL_DATA_START that signals where KERNEL will start to use data for stack or heap from different tasks. What i think could be causing the crashing is the fact that kernel could allocate any objetc in the limit of both SRAM sections, so we can make a quick test to validate if this is the problem or you are really using all the RAM in your project.
I'd recommend you to move the __KERNEL_DATA_START address to 0x2000_0000 although the left ~13kB of SRAM_L would get unnused, but this way we can be sure that kernel will not allocate memory in the middle of both sections:
For doing this, you will need to modify your linker file (located at: <MQX_4_0_PATH>\lib\twrk60d100m.cw10\debug\bsp) and add next line in memory segment:
MEMORY
{
vectorrom (RX): ORIGIN = 0x00000000, LENGTH = 0x00000400
cfmprotrom (R): ORIGIN = 0x00000400, LENGTH = 0x00000020
rom (RX): ORIGIN = 0x00000420, LENGTH = 0x0007FBE0 # Code + Const data
ram (RW): ORIGIN = 0x1FFF0000, LENGTH = 0x00020000 # SRAM - RW data
# kernel space starts after RAM variables (Location of MQX Kernel data + MQX heap)
end_of_kd (RW): ORIGIN = 0x2000FFF0, LENGTH = 0x00000000
# Boot stack reused by MQX Kernel data
bstack (RW): ORIGIN = 0x2000FA00, LENGTH = 0x00000200 # Boot stack
end_bstack (RW): ORIGIN = 0x2000FC00, LENGTH = 0x00000000
}
And also, modify:
.kernel_data :
{
__KERNEL_DATA_START = ALIGN(0x10);
As you can see, a new section called start_of_ram_u is added and __KERNEL_DATA_START should be place at this segment, this way, MQX's kernel will use all available memory in SRAM_U and we can be sure that no object will be stored in the limit of these sections.
Please take in mind that this linker files will be overwritten if you re-compile bsp library, so, modify the linker file every time you compile bsp library.
You can make this test and corroborate if program still crashes, if so, probably your are consuming all availble SRAM.
I hope this can help you!
Best regards,
Isaac Avila
Thanks Issac,
As you suggest I modify Linker file but It seems that my stack reach its Limit.
Regards,
Utsavi Bharuchwala
Hello Utsavi,
Just to keep things clear, have you found the root cause for this issue? how did you realize that you are consuming all the stack? are your referring to stack for any task or your total stack size?
If this is related to stack for any task, you can increase it, on the other hand, if this is related to total stack you should pay attention to unnecessary allocation and/or avoid recursive callings, etc.
Remember that _mem_get_highwater() function returns the highest address that was assigned by MQX kernel, however, it does not imply that you are consuming all the available memory, because you can free memory below this address and you'd still have available memory.
I hope this can help you!
Best Regards,
Isaac
Hi Issac,
Sorry for the delay and thanks for reply.
I am talking about total Stack Size.
I am still not able to declare that my all RAM is consumed.
As you suggest in discussion, by modifying the .lcf file as above and program still crashed then it indicates all RAM is consumed. So I modify .lcf , I see the effect of this into .map file and my program is not working so from that suggestion I come to know that my all RAM is used.
If I am going to modify Linker File like below :
start_of_ram_u (RW): ORIGIN = 0x2000000, LENGTH = 0x0000FFFF
.kernel_data : #AT(ADDR(.main_application_bss) + SIZEOF(.main_application_bss))
{
__KERNEL_DATA_START = ALIGN(0x10);
}> start_of_ram_u
Now it wouldn't be the case of
then why my program stucks??
From the above discussion _mem_get_highwater() will not give me exact RAM occupied but, can _mem_get_free() give me exact value of Free RAM available?
Regards,
Utsavi Bharuchwala
Hello Utsavi,
If after doing the test you still got stuck, then it seems that your program is using all available memory. Are you validating every dynamic allocation so program could be able to detect when there is no enough space?
Also, system could be crashing due some invalid values (NULL pointers) or any memory corruption, you will need to debug your project and get the exact moment where the problem is gotten and check what could be causing the problem (invalid pointers, memory corruption, not enough space, etc).
Regards,
Isaac
Hi Issac,
Thanks for Reply.
I will debug the project and check if any memory corruption occurred?
Regards,
Utsavi Bharuchwala