Hvordan erklære store arrays i C compiler til PIC18-enheder

K

kekon

Guest
Jeg bruger Microchip C compiler til PIC18 enheder.Mit design består PIC18F252 anordning, der har omkring 1500 bytes af interne RAM.På trods af at jeg ikke kan erklære arrays større end 256 byte, som linker rapporter fejl, at det ikke er i stand til at reservere hukommelse.

char buffer [255]; - dette skaber linker fejl
char buffer [120]; - ingen fejl

Det vedrører også fordeling af data i montage sprog med RES direktiv:

buffer IC 255 - dette medfører linker fejl samt
buffer IC 120 - ingen fejl

Det samme problem vises, når andre variabler indtager mere end 255 byte RAM.Hvorfor er det så?Er der nogen løsning?

 
Det virker som et fælles problem i nogle af compiler bruger med standard settings.I er ikke sikker, men du kan spille med compiler valgmuligheder, hukommelse modeller noget etc. ..

 
Du skal definere større datafelter i linker script.Her er et eksempel program, der tildeler vifte af 350 unsigned char's.<img src="http://www.edaboard.com/images/smiles/icon_eek.gif" alt="Chokeret" border="0" />Beklager, men du skal logge ind for at se denne vedhæftede fil

 
Tak for hjælp.Jeg har også fundet en løsning i C-compiler dokumentation på Microchip hjemmeside.Men de siger ikke har adgang til sådanne arrays skal ske ved pegepinde som følger:

# include <p18f452.h>

# pragma udata FIELD
unsigned char r [350];
# pragma udata

void main (void)
(

char * ptr;

pp = & r [0];
ptr [300] = 0x12;
)

Dette skyldes formentlig, at den compiler, der er i stand til at opdage, når det er nødvendigt at skifte RAM bank, når accesing "r" buffer direkte.Så sandsynligvis en indirekte adgang er korrekt:

ptr [300] = 0x12;

 
Samt jeg har set på adskillelse af min kode C18 tager sig af indsamlede adgang, når du direkte skriver værdi som:
r [300] = 0x12;

11: r [200] = 0x12;
0000E2 0.102 MOVLB 0x2
0000E4 0E12 MOVLW 0x12
0000E6 6FC8 MOVWF 0xc8, krænges

og for indekseret adgang C18 bruger FSR0.

pp = 120;
r [PP] = 0x15;

12: PR = 120;
0000E8 0E78 MOVLW 0x78
0000EA 0.100 MOVLB 0
0000EC 6F8A MOVWF 0x8a, krænges
0000EE 6B8B CLRF 0x8b, krænges
13: r [PR] = 0x15;
0000F0 0E00 MOVLW 0
0000F2 258A ADDWF 0x8a, krænges W,
0000F4 6EE9 MOVWF 0xfe9, ADGANG
0000F6 0E02 MOVLW 0x2
0000F8 218b ADDWFC 0x8b, krænges W,
0000FA 6EEA MOVWF 0xfea, ADGANG
0000FC 0E15 MOVLW 0x15
0000FE 6EEF MOVWF 0xfef, ADGANG

Men hvis du siger, at Microchip recomands indirekte adgang, der skal være en god grund til dette.

 
kekon skrev:

Tak for hjælp.
Jeg har også fundet en løsning i C-compiler dokumentation på Microchip hjemmeside.
Men de siger ikke har adgang til sådanne arrays skal ske ved pegepinde som følger:# include <p18f452.h># pragma udata FIELD

unsigned char r [350];

# pragma udatavoid main (void)

(char * ptr;pp = & r [0];

ptr [300] = 0x12;

)Dette skyldes formentlig, at den compiler, der er i stand til at opdage, når det er nødvendigt at skifte RAM bank, når accesing "r" buffer direkte.
Så sandsynligvis en indirekte adgang er korrekt:ptr [300] = 0x12;
 

Welcome to EDABoard.com

Sponsor

Back
Top