C programmering och pekare till uc

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

C programmering och pekare till uc

Inlägg av björn »

När är det lämpligt att använda pekare vid C-programmering av uc och när är det inte lämpligt?
Hur hanterar uc'n pekare?
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Tja.... det är väl du som bestämmer om det är lämpligt eller hur?

Om du deklarerar:
const char TestText[] = "This is a test";
och sedan referar till den med:
sprintf(Buffer,"%s!!",TestText);
kommer TestText att faktisk vara en pekare, likaså 'Buffer'.

En pekare är när man referer till ett värde med dess adress i stället för värdet själv, det är väldigt användbart om man t.ex. har en block data som kan bytas ut (t.ex. olika över/under variabler), då kan man peka på blocken när man kaller rutinen, skitsmidigt.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Dessutom varierar stödet för "indexerad adressering" mycket
mellan olika "uc", så båda frågorna är lite svåra att svara på.

Om man har en viss specifik C-kompilator och en viss processor,
så blir det enklare. Men det räcker inte med bara t.ex "PIC" eftersom
det skiljer sig en del i detta avseende mellan PIC16 och PIC18.
PIC18 har betydligt bättre möjlighet till indexerad adressering.
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Inlägg av björn »

Ok, ja det var i första hand AVR atmega8 och atmega88 jag tänkte på. Och frågan var igentligen mest tänkt som en uindran om pekare tar mindre plats eller om assembler koden blir effektivare.

EDIT: Kompilator är iccavr eller avr-gcc.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

"Problemet" med Harvard-arkitekturen är att kompilatorn även måste hålla reda på vilket minne pekaren pekar på, vilket oftast verkar sparas i ytterligare en byte intill pekaren.
Alltså, en 16-bitars pekare tar i praktiken upp 3 byte.
Har man en rutin som anropas ofta eller måste utföras väldigt snabbt, så kan det löna sig att skriva den i (inline) assembler om man vet vilket minne den ska hämta allt ifrån.
Dels går man omkring hela kontrollen av den extra byten, och den "switch"-sats den i sin tur genererar, och dels sparar man lite minne.

Mvh
speakman
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Det blir ingen större skillnad utom i vissa fall, assemblerkodens effektivitet beror definitivt inte på om man använder pekare eller inte men mycket mer på kompilerns optimering.

Effektivitet uppnås med bra programmering, inte med pekare/inte-pekare.
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Inlägg av björn »

OK, då har jag fått lite mer insikt tror jag. Då använder jag endast pekare när jag tycker att det känns bra/enklare.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Som vanligt är allt en "trade-off".

D.v.s att om C-koden blir "renare" på ett visst sätt, och processorn
har tillgängliga cykler (även om det inte är den allra snabbast lösningen)
så är det bara att köra... :-)
Skriv svar