|
|
View previous topic :: View next topic |
Author |
Message |
smanzer
Joined: 14 Sep 2009 Posts: 24 Location: Ontario, Canada
|
How do you find remaining free memory? |
Posted: Fri Jun 11, 2010 8:19 am |
|
|
Good Morning,
Can someone tell me how to find out how much free ram memory is left on the PIC?
I use a lot of dynamic linked lists and it would be nice to be able to find out how much is left prior to starting a routine.
The lists use malloc and free which allocate and free memory. I do not know how to find out how much unused memory is left though.
Thanks in advance,
Steven _________________ "I am always doing that which I can not do, in order that I may learn how to do it."
- Pablo Picasso |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19535
|
|
Posted: Fri Jun 11, 2010 8:29 am |
|
|
After compiling, open the .lst file (in the IDE, 'C/ASM List').
At the top, it show you the ROM used, and the RAM used. The 'worst case' figure. Subtract this from the total RAM available.
Best Wishes |
|
|
smanzer
Joined: 14 Sep 2009 Posts: 24 Location: Ontario, Canada
|
|
Posted: Fri Jun 11, 2010 8:52 am |
|
|
Thank you Ttelmah,
Is there any way to find out during program execution how much ram is still available?
Steven _________________ "I am always doing that which I can not do, in order that I may learn how to do it."
- Pablo Picasso |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19535
|
|
Posted: Fri Jun 11, 2010 9:01 am |
|
|
It won't change.
There is no 'dynamic' memory allocation, unless you are using a library like STDIBM.
If so, the variables holding the memory size, and where the nodes currently point, are available to you, to tell you what space is still available.
Best Wishes |
|
|
smanzer
Joined: 14 Sep 2009 Posts: 24 Location: Ontario, Canada
|
|
Posted: Sun Jun 13, 2010 7:13 am |
|
|
Hi Ttelmah,
You are right, malloc uses <stdlibm.h>
I must not know how malloc works. It was my understanding that malloc (from Wikipedia: In computing, malloc is a subroutine for performing dynamic memory allocation in the C and C++ programming languages, though its use in C++ has been largely superseded by operators new and new[]. malloc is part of the standard library for both languages and is declared in the stdlib.h header (for C++, it is also declared within the std namespace via the cstdlib header).)
I use many linked lists (http://en.wikipedia.org/wiki/Linked_list) and the individual data structure is defined once (which the compiler can see), but the memory locations for the actual data is dynamically allocated and released as needed.
I have looked through the getenv() documentation and do not see anything for RAM. There are entries for the following:
getenv("PROGRAM_MEMORY") getenv("DATA_EEPROM"));
Is it possible that an eerom is used with malloc? The ccs help states: "The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate." It does not specify they type of memory that is allocated.
Does anyone know of a way to figure out how much RAM memory is available during the execution of the program? Obviously I will know where the individual nodes reside in memory (from malloc), but I have no idea how that would tell me how much space is available. Do you use the pointer to the node and compare it to the end of RAM location? If that is how it is done, what is the variable that is used to find the end of RAM?
I am hoping someone has come across a similar need and has figured out a work around....
Thanks,
Steven _________________ "I am always doing that which I can not do, in order that I may learn how to do it."
- Pablo Picasso |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Jun 13, 2010 1:45 pm |
|
|
Here's a little test program that I made to experiment with the problem.
Initially, I think the heap_size() macro that I wrote would tell you the size
of available ram. But if you use malloc(), and then you free some
blocks so it becomes segmented, then the simple method shown below
would not work.
Code: |
#include <18F452.h>
#USE DYNAMIC_MEMORY
#fuses XT,NOWDT,PUT,BROWNOUT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
//int8 array[1516];
#define initial_heap_size() (__DYNAMIC_HEAD ? (getenv("RAM") - __DYNAMIC_HEAD) : 0)
//======================================
void main(void)
{
int16 temp;
temp = initial_heap_size();
//printf("Dynamic Head: %lu \r", __DYNAMIC_HEAD);
printf("Free RAM: %lu \r", temp);
while(1);
}
|
I don't really want to work on it much more than this. This was just an idea. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|