Programování PICů v C (XC8)
Moderátor: Moderátoři
SDCC pro Z80 taky dává konstantní řetězce automaticky do programové paměti. Ale Z80 nemá oddělený programový a datový adresní prostor jako AVR nebo PIC, takže ke konstantnímu řetězci přistupuje přes pointer stejně jako k proměnnému řetězci. AVR má pro čtení z programové paměti instrukci LPM, takže se k tomu řetězci v programové paměti dostane oklikou, jak popsal mtajovsky. Ale jak to dělá PIC, když žádnou instrukci pro čtení programové paměti nemá?
Ten C překladač pro PIC negeneruje při překladu jako mezikrok kód v assembleru? Že by se to z něj dalo vykoukat.
Ten C překladač pro PIC negeneruje při překladu jako mezikrok kód v assembleru? Že by se to z něj dalo vykoukat.
- forbidden
- Příspěvky: 8808
- Registrován: 14 úno 2005, 01:00
- Bydliště: Brno (JN89GF)
- Kontaktovat uživatele:
Konečně jsem pochopil, na co se ptáš. Prolezl jsem celou složku projektu, ale asm jsem neobjevil.
Možná to dělá pomocí registrů pro nepřímý adresování FSR a INDF, ale je pravda, že neznám jak nastavit pointer FSR na programovou paměť. Ani v datasheetu o tom nic nepíšou. Vůbec by mě nenapadlo o tom přemýšlet, dokud jsi se nezeptala.
Zkusil jsem ještě jednou nadefinovat:
unsigned char *test = "test promenne ulozene v programove pameti PIC16F628A";
a po zkompilování se zabraná datová paměť zvětšila a o 1 B, programová o 53 B.
Pokud dobře počítám, tak to sedí, včetně té nuly na konci. Proč se zvětšila datová o 1 B nevím, tipoval bych ten pointer, ale nesedí mi velikost, měly by to být dva B.
Možná to dělá pomocí registrů pro nepřímý adresování FSR a INDF, ale je pravda, že neznám jak nastavit pointer FSR na programovou paměť. Ani v datasheetu o tom nic nepíšou. Vůbec by mě nenapadlo o tom přemýšlet, dokud jsi se nezeptala.
Zkusil jsem ještě jednou nadefinovat:
unsigned char *test = "test promenne ulozene v programove pameti PIC16F628A";
a po zkompilování se zabraná datová paměť zvětšila a o 1 B, programová o 53 B.
Pokud dobře počítám, tak to sedí, včetně té nuly na konci. Proč se zvětšila datová o 1 B nevím, tipoval bych ten pointer, ale nesedí mi velikost, měly by to být dva B.
A jseš si jistý, že to je v programové paměti? Není to v EEPROM paměti? Programová paměť má přece 14 bitů na slovo, tak by to nezabíralo 53 bytů ale (2x?) víc. EEPROM má 8 bitů na slovo a navíc má velikost méně než 256B, takže stačí 8 bitový pointer.
Edit: Na netu píšou: The compiler implements ROM arrays with an ADDWF PC instruction followed by a series of RETLW instructions. To read an array element, the compiler places the index in the W register and generates a CALL to the start of the array. The compiler then adds the W register to the program counter and a RETLW returns the value in the W register.
Pak by ten 52 znakový string musel zabírat víc než 53 bytů.
Edit: Na netu píšou: The compiler implements ROM arrays with an ADDWF PC instruction followed by a series of RETLW instructions. To read an array element, the compiler places the index in the W register and generates a CALL to the start of the array. The compiler then adds the W register to the program counter and a RETLW returns the value in the W register.
Pak by ten 52 znakový string musel zabírat víc než 53 bytů.
Naposledy upravil(a) lesana87 dne 10 pro 2016, 13:22, celkem upraveno 1 x.
- forbidden
- Příspěvky: 8808
- Registrován: 14 úno 2005, 01:00
- Bydliště: Brno (JN89GF)
- Kontaktovat uživatele:
EEPROM tu vůbec nepoužívám, dost pochybuju, že by ji ten překladač začal používat sám od sebe. Má to takovejto hezkej ukazatel, tak leda že by kecal.
Třeba se to v té programové ukládá kontinuálně za sebou po osmi bitech, kvůli šetření místem. Nepravděpodobný, vím.
Třeba se to v té programové ukládá kontinuálně za sebou po osmi bitech, kvůli šetření místem. Nepravděpodobný, vím.
- Přílohy
-
- paměť.gif
- ukazatel
- (19.37 KiB) Staženo 83 x
Naposledy upravil(a) forbidden dne 10 pro 2016, 13:23, celkem upraveno 1 x.