PIC MCC18 romdata/idata problem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47013
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

PIC MCC18 romdata/idata problem

Inlägg av TomasL »

Deklarerar en konstant enligt följande:

Kod: Markera allt

const rom unsigned char d_b_c[] = {..........}
MCC18 skall då lägga denna konstant i ROM (romfdata, .stringtable), men av någon outgrundlig anledning så vill MCC18 placera den i idata-sektionen dvs RAM, där den naturligtvis inte får plats.

Så här skriver uChip i MCC18 ug:
2.7.3 String Constants
The primary use of data located in program memory is for static strings. In keeping
with this, MPLAB C18 automatically places all string constants in program memory.
This type of a string constant is “array of char located in program memory”, (const
rom char []). The .stringtable section is a romdata (see 2.9.1 “#pragma
sectiontype”) section that contains all constant strings. For example the string
“hello” in the following would be located in the .stringtable section:
strcmppgm2ram (Foo, “hello”);
Due to the fact that constant strings are kept in program memory, there are multiple
versions of the standard functions that deal with strings. For example, the strcpy
function has four variants, allowing the copying of a string to and from data and
program memory
samt
The rom keyword tells the compiler that a variable should be placed in program
memory. The compiler will allocate this variable into the current romdata type section.
Så varför i h-te har mcc18 fått för sig att placera romdata i idata-sektionen.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: PIC MCC18 romdata/idata problem

Inlägg av dangraf »

Ett långskott, testa ta bort unsigned, blir det samma resultat?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: PIC MCC18 romdata/idata problem

Inlägg av dangraf »

Jag testade nyss att kompilera in följande rad i mitt projekt:

Kod: Markera allt

const rom unsigned char hej[] = {1,2,3,4,5,67,8,9,0,1};
och den lade sig väldigt fint i programminnet och förändrade inte ram-minnet nått alls.

vad får du för felmeddelanden?

Om jag bara ska brain-storma fram en lösning så skulle det kunna bero på:
* Projektet-filerna kan ibland bli väldigt underliga av sig själv. jag har ett projekt som ger varningar på alla möjliga rader som t.ex if( 0 == a) så kom felet "warning comparsion between signed and unsigned" etc. Testa att göra ett nytt projekt och se om felet försvinner.

* buildoptions->project->MPLAB C18 kolla om "Enable Integer promotions" är ikryssad. I vanligafall så kan denna omvandla en uint8 till en uint16 etc men eftersom C18 har lite egenheter för sig kanske den promotar din variabel till att lägga sig i ram?

* Har du senaste versionen av mplab och C18?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47013
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: PIC MCC18 romdata/idata problem

Inlägg av TomasL »

Senaste versionen, nedladdad i går.
Felmeddelandet är av typ cannot fit prog.o in idata, size...

Kommenterar jag bort en konstant i taget minskar size... med motsvarande antal byte.
Nu vet jag inte om den lägger konstanten i rom också, kan ju vara så att den försöker lägga konstanten i både romdata och idata.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: PIC MCC18 romdata/idata problem

Inlägg av stekern »

>Nu vet jag inte om den lägger konstanten i rom också, kan ju vara så att den försöker lägga konstanten i både romdata och idata.
Ingen lösning på problemet, men om den ligger i ram så innebär det att den finns i rom också eftersom den måste laddas därifrån.
Skriv svar