|
| Deklarere en dynamisk var på bestemt adres~ Fra : Kåre |
Dato : 21-09-05 21:19 |
|
Kan man i C (IAR embedded C compiler) tvinge en variabel til at ligge på en
betsemt adresse når man deklarerer den?
I princippet vil jeg gerne kunne deklarere et 200 byte stort statisk RAM
område sådan:
static unsigned char usRAM_area;
Herefter vil jeg i en rutine gerne kunne deklarere en dynamisk variabel, så
den ikke kommer til at ligge på stacken, men på en bestemt adresse i
usRAM_area.
Ideen er at kunne bruge den statiske RAM fra flere rutiner. I de enkelte
rutiner bruges så dynamiske variabler, som egentlig bliver statiske fordi de
ligger i et statisk RAM område.
Hvis jeg i en rutine som kaldes hvert sekund, deklarerer den samme variabel
på samme plads i usRAM_area, vil den så blive "husket" fra gang til gang.
Eller rettere, vil adressen nulstilles hver gang variablen deklareres?
På forhånd tak
Kåre
| |
Bertel Brander (21-09-2005)
| Kommentar Fra : Bertel Brander |
Dato : 21-09-05 22:21 |
|
Kåre wrote:
> Kan man i C (IAR embedded C compiler) tvinge en variabel til at ligge på en
> betsemt adresse når man deklarerer den?
Det kan man sansynligvis. Enten ved et pragma til compileren eller
når du kører locateren. Jeg kender ikke IAR så jeg ved ikke
præcist hvordan.
> I princippet vil jeg gerne kunne deklarere et 200 byte stort statisk RAM
> område sådan:
>
> static unsigned char usRAM_area;
Mener du:
static unsigned char usRAM_area[200];
En anden mulighed er:
static unsigned char *usRAM_area = 0xC800;
> Herefter vil jeg i en rutine gerne kunne deklarere en dynamisk variabel, så
> den ikke kommer til at ligge på stacken, men på en bestemt adresse i
> usRAM_area.
Du kan gøre det med en pointer:
unsigned int *p = (unsigned int *)(&usRAM_area[40]);
> Ideen er at kunne bruge den statiske RAM fra flere rutiner. I de enkelte
> rutiner bruges så dynamiske variabler, som egentlig bliver statiske fordi de
> ligger i et statisk RAM område.
>
> Hvis jeg i en rutine som kaldes hvert sekund, deklarerer den samme variabel
> på samme plads i usRAM_area, vil den så blive "husket" fra gang til gang.
> Eller rettere, vil adressen nulstilles hver gang variablen deklareres?
Jeg er lidt usikker på hvad du mener med det sidste og på hvad formålet
med hele konstruktionen er.
--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel
| |
Kåre (21-09-2005)
| Kommentar Fra : Kåre |
Dato : 21-09-05 22:43 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:4331cecf$0$684$edfadb0f@dread12.news.tele.dk...
> Kåre wrote:
> > Kan man i C (IAR embedded C compiler) tvinge en variabel til at ligge på
en
> > betsemt adresse når man deklarerer den?
>
> Det kan man sansynligvis. Enten ved et pragma til compileren eller
> når du kører locateren. Jeg kender ikke IAR så jeg ved ikke
> præcist hvordan.
Ja, det er også det jeg er kommet frem til må være det nemmeste og mest
elegante.
Var så småt igang med at lave det med pointere, men det blev lidt "griset"
at se på...
>
> > I princippet vil jeg gerne kunne deklarere et 200 byte stort statisk RAM
> > område sådan:
> >
> > static unsigned char usRAM_area;
>
> Mener du:
> static unsigned char usRAM_area[200];
> En anden mulighed er:
> static unsigned char *usRAM_area = 0xC800;
>
> > Herefter vil jeg i en rutine gerne kunne deklarere en dynamisk variabel,
så
> > den ikke kommer til at ligge på stacken, men på en bestemt adresse i
> > usRAM_area.
>
> Du kan gøre det med en pointer:
> unsigned int *p = (unsigned int *)(&usRAM_area[40]);
Ja det var sådan noget jeg var i gang med. Men de data der skal bruges er
alt fra enkelte bytes, til strukturer.
Det bliver grimt i den sidste ende.
>
> > Ideen er at kunne bruge den statiske RAM fra flere rutiner. I de enkelte
> > rutiner bruges så dynamiske variabler, som egentlig bliver statiske
fordi de
> > ligger i et statisk RAM område.
> >
> > Hvis jeg i en rutine som kaldes hvert sekund, deklarerer den samme
variabel
> > på samme plads i usRAM_area, vil den så blive "husket" fra gang til
gang.
> > Eller rettere, vil adressen nulstilles hver gang variablen deklareres?
>
> Jeg er lidt usikker på hvad du mener med det sidste og på hvad formålet
> med hele konstruktionen er.
>
Formålet er at spare bytes. Er ved at løbe tør.
Jeg har nogle rutiner som bruger nogle hundrede bytes. De bliver nødt til at
være statiske.
Rutinerne kører bare kun i 0.00001 promille af tiden, og aldrig samtidig, så
det er lidt spild.
Derfor vil jeg gerne kunne bruge den samme blok RAM til formålet.
Men som sagt, så bruge jeg bare #pragma memory= .......
Ved bare ikke helt om indholdet bliver resat hver gang jeg deklarerer min
variabel eller struktur i memory området.
Men det vil en test jo nok vise.
Kåre
| |
Kåre (21-09-2005)
| Kommentar Fra : Kåre |
Dato : 21-09-05 22:52 |
|
....
> Men som sagt, så bruge jeg bare #pragma memory= .......
> Ved bare ikke helt om indholdet bliver resat hver gang jeg deklarerer min
> variabel eller struktur i memory området.
> Men det vil en test jo nok vise.
>
Hmmmmmm...
Kan ikke deklarere dynamisk variabel i et memeory segment. Hvorfor nu ikke
det?
#pragma memory = dataseg(RAMAREA)
unsigned char ram_area_num;
#pragma memory = default
Vil ikke oversætte hvis jeg laver den inde i en rutine, men vil godt hvis
jeg laver den i headeren.
Kåre
| |
Bertel Brander (21-09-2005)
| Kommentar Fra : Bertel Brander |
Dato : 21-09-05 23:11 |
|
Kåre wrote:
> ...
>
>>Men som sagt, så bruge jeg bare #pragma memory= .......
>>Ved bare ikke helt om indholdet bliver resat hver gang jeg deklarerer min
>>variabel eller struktur i memory området.
>>Men det vil en test jo nok vise.
>>
>
>
> Hmmmmmm...
> Kan ikke deklarere dynamisk variabel i et memeory segment. Hvorfor nu ikke
> det?
>
> #pragma memory = dataseg(RAMAREA)
> unsigned char ram_area_num;
> #pragma memory = default
>
> Vil ikke oversætte hvis jeg laver den inde i en rutine, men vil godt hvis
> jeg laver den i headeren.
Den kan sansynligvis kun locate på bestemte adresser ved
statiske variable.
Lokale variable kommer altid på stakken. Du kan evt prøve at
lave dem static, ved at putte static foran.
--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel
| |
Richard Flamsholt (21-09-2005)
| Kommentar Fra : Richard Flamsholt |
Dato : 21-09-05 23:50 |
|
"Kåre" <kaare@raffish.dk> skrev:
>Derfor vil jeg gerne kunne bruge den samme blok RAM til formålet.
Et hint: du kunne lave din datastruktur som en union. Members i en union
ligger fysisk det samme sted. Fordelen er et pænt, typesikkert interface
til dine forskellige data, fremfor kode der vælter rundt i byte-pointere
og casts osv. Det vil sikkert endda ligefrem spare nogle instruktioner.
Fx
typedef struct { data til funktion FA } A;
typedef struct { data til funktion FB } B;
....
typedef struct { osv osv osv } N;
typedef union { A a; B b; .... ; N n; } U;
static U u; // eller hvordan du nu definerer din union-variabel
Så kan du have sytten forskellige typer data til brug i funktion FA(),
og andre ti til når funktion FB() kommer i spil osv. I FA() bruger du
u.a.hvad_A_nu_ellers_indeholder, i FB() bruger du u.b.Bs_indhold, osv.
--
Richard Flamsholt
richard@flamsholt.dk - www.richard.flamsholt.dk
| |
Kåre (22-09-2005)
| Kommentar Fra : Kåre |
Dato : 22-09-05 18:38 |
|
>
> Et hint: du kunne lave din datastruktur som en union. Members i en union
> ligger fysisk det samme sted. Fordelen er et pænt, typesikkert interface
> til dine forskellige data, fremfor kode der vælter rundt i byte-pointere
> og casts osv. Det vil sikkert endda ligefrem spare nogle instruktioner.
>
Det var lige sagen!
Det er mange år siden jeg sidst brugte unions, og havde helt fortrængt deres
fortræffeligheder!
Tak for hjælpen
Kåre
| |
Michael Rasmussen (21-09-2005)
| Kommentar Fra : Michael Rasmussen |
Dato : 21-09-05 22:36 |
|
On Wed, 21 Sep 2005 22:18:45 +0200, KÃ¥re wrote:
>
> I princippet vil jeg gerne kunne deklarere et 200 byte stort statisk RAM
> område sådan:
>
> static unsigned char usRAM_area;
>
> Herefter vil jeg i en rutine gerne kunne deklarere en dynamisk variabel,
> så den ikke kommer til at ligge på stacken, men på en bestemt adresse i
> usRAM_area.
>
> Ideen er at kunne bruge den statiske RAM fra flere rutiner. I de enkelte
> rutiner bruges så dynamiske variabler, som egentlig bliver statiske fordi
> de ligger i et statisk RAM område.
>
Om det virker med din compiler, ved jeg ikke, men hvis du har K&R 2.
udgave ved hånden, har de et eksempel på side 101 og 102, der præcis
gør det, du efterspørger.
--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917
| |
Kåre (21-09-2005)
| Kommentar Fra : Kåre |
Dato : 21-09-05 22:50 |
|
>
> Om det virker med din compiler, ved jeg ikke, men hvis du har K&R 2.
> udgave ved hånden, har de et eksempel på side 101 og 102, der præcis
> gør det, du efterspørger.
>
K&R ???
mvh
Kåre
| |
Michael Rasmussen (21-09-2005)
| Kommentar Fra : Michael Rasmussen |
Dato : 21-09-05 23:12 |
|
On Wed, 21 Sep 2005 23:49:37 +0200, KÃ¥re wrote:
> K&R ???
Kernighan & Ritchie (1978): The C Programming Language 2nd edition.
Prentice Hall, Upper Saddle River: 1988. ISBN: 0-13-110362-8.
NB. Er også en af mine favoritter. Personligt mener jeg, at det er en af
de bedst skrevne bøger om noget programmeringssprog.
--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917
| |
Michael Rasmussen (21-09-2005)
| Kommentar Fra : Michael Rasmussen |
Dato : 21-09-05 23:18 |
|
On Thu, 22 Sep 2005 00:11:53 +0200, Michael Rasmussen wrote:
> Kernighan & Ritchie (1978): The C Programming Language 2nd edition.
> Prentice Hall, Upper Saddle River: 1988. ISBN: 0-13-110362-8.
Du kan lige få funktionerne.
#define ALLOCSIZE 200
static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf;
char *alloc(int n)
{
if (allocbuf + ALLOCSIZE - allocp >= n) {
allocp += n;
return allocp - n;
} else
return 0;
}
void afree(char *p)
{
if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
allocp = p;
}
God fornøjelse
--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917
| |
Kåre (21-09-2005)
| Kommentar Fra : Kåre |
Dato : 21-09-05 23:35 |
|
"Michael Rasmussen" <mir@miras.org> wrote in message
news:pan.2005.09.21.22.17.48.94241@miras.org...
> On Thu, 22 Sep 2005 00:11:53 +0200, Michael Rasmussen wrote:
>
> > Kernighan & Ritchie (1978): The C Programming Language 2nd edition.
> > Prentice Hall, Upper Saddle River: 1988. ISBN: 0-13-110362-8.
> Du kan lige få funktionerne.
>
> #define ALLOCSIZE 200
>
> static char allocbuf[ALLOCSIZE];
> static char *allocp = allocbuf;
>
> char *alloc(int n)
> {
> if (allocbuf + ALLOCSIZE - allocp >= n) {
> allocp += n;
> return allocp - n;
> } else
> return 0;
> }
>
> void afree(char *p)
> {
> if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
> allocp = p;
> }
>
> God fornøjelse
> --
Det kigger jeg nærmere på i morgen. Det er blevet mørkt udenfor, så jeg må
hellere liste i seng for nu...
Kåre
| |
Bertel Brander (21-09-2005)
| Kommentar Fra : Bertel Brander |
Dato : 21-09-05 23:13 |
|
Kåre wrote:
>>Om det virker med din compiler, ved jeg ikke, men hvis du har K&R 2.
>>udgave ved hånden, har de et eksempel på side 101 og 102, der præcis
>>gør det, du efterspørger.
>>
>
> K&R ???
Biblen for C programmører:
http://cm.bell-labs.com/cm/cs/cbook/
--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel
| |
Leo Havmøller (22-09-2005)
| Kommentar Fra : Leo Havmøller |
Dato : 22-09-05 08:37 |
|
"Kåre" <kaare@raffish.dk> wrote in message
news:4331bff0$0$73155$edfadb0f@dread14.news.tele.dk...
> Kan man i C (IAR embedded C compiler) tvinge en variabel til at ligge på
> en
> betsemt adresse når man deklarerer den?
>
> I princippet vil jeg gerne kunne deklarere et 200 byte stort statisk RAM
> område sådan:
>
> static unsigned char usRAM_area;
F.eks. på adresse 0x1234:
static unsigned char usRAM_area @ 0x1234;
Leo Havmøller.
| |
|
|