View previous topic :: View next topic |
Author |
Message |
Geps
Joined: 05 Jul 2010 Posts: 129
|
Memory And Variables |
Posted: Wed May 18, 2011 7:18 am |
|
|
Hi,
Is there any way to section off an area of memory so I can declare two sets of variables in the same section? To explain further....I'm creating a device that has a standalone mode and a PC mode. The issue I'm having is finding a way to ONLY declare the PC-mode-related variables when in PC mode and the standalone-mode-related variables only when in standalone.
The functions they use are the same but obviously the interface is different so don't want my graphic LCD string variables utilising memory than can be reallocated to create a larger PC buffer.
I could use alloc() but wasn't sure if there was a better (CCS specific) way?
Regards, |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19535
|
|
Posted: Wed May 18, 2011 8:34 am |
|
|
You do realise that variables declared 'locally' to a function, are _local_. If you declare variables inside a function, the memory space used by these can be re-used in any other function, and _will_ be re-used automatically. Only functions that are declared inside other functions, reserve memory space when they exit (or variables declared as static).
So:
Code: |
#include <16F628.h>
#device *=16
#fuses INTRC
#use delay(clock=4MHz)
void function1(void) {
char buffer[80];
//do something with buffer
int8 val;
for (val=0;val<80;val++)
buffer[val]=val;
}
void function2(void) {
float calcval[20];
//do something with calcval
int8 val;
for (val=0;val<20;val++)
calcval[val]=val*3.14;
}
void main(void) {
function1();
function2();
do {
delay_us(1);
}while(TRUE);
}
}
|
If you compile this, and look at the symbol table, you see:
Code: |
004-005 @READ_PROGRAM_MEMORY8.P1
015 CCP_1_LOW
015 CCP_1
016 CCP_1_HIGH
01F.6 C1OUT
01F.7 C2OUT
021-070 function1.buffer
021-070 function2.calcval
071 function2.val
071 function1.val
072 function1.@SCRATCH1
072 function2.@SCRATCH1
073 function1.@SCRATCH2
073 function2.@SCRATCH2
|
with function1.buffer, and function2.calcval, _both using the same memory_.
This is not CCS specific, but general to the concept of 'local' variables. It is done exactly to allow multiple routines that are never called inside each other, and require lots of local storage, to re-use memory space.
Best Wishes |
|
|
Geps
Joined: 05 Jul 2010 Posts: 129
|
|
Posted: Wed May 18, 2011 9:06 am |
|
|
Yes sorry I perhaps should have mentioned that. The issue is though, is that I need to have global variables since their contents is changed by multiple functions and interrupt handlers. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19535
|
|
Posted: Wed May 18, 2011 9:28 am |
|
|
Just use #byte, or a union.
Code: |
int8 buffer[128];
struct somedata {
int16 silly[10];
int32 another[26];
} storage;
#byte storage=buffer //Locates 'storage' to the same location as buffer.
union {
buffer[128];
struct somedata fred;
} shared;
|
shared.buffer, is then a 128byte buffer, and shared.fred is a structure accessing the same memory area.
Best Wishes |
|
|
Geps
Joined: 05 Jul 2010 Posts: 129
|
|
Posted: Wed May 18, 2011 9:31 am |
|
|
Excellent thanks Ttelmah, I'll give it ago. |
|
|
|