/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
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,

> > 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.



Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste