C programmering och pekare till uc
C programmering och pekare till uc
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?
Hur hanterar uc'n pekare?
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.
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.
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.
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.
"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
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