Fórum témák
» Több friss téma |
Sziasztok!
Van-e a Microchip C18-ban direktíva arra, hogy adatokat helyezzek el az EEPROM-ban ( pl. asm-ben DE ) ? Steve
Gondolom a #pragma romdata, és a cím megadása megteszi. Bővebben: Link
Üdv.
Az lenne a kérdésem, hogy hogyan lehet (ha egyáltalán lehet) a C18 fordítóból kikényszeríteni, hogy egy egyetlen char paraméterrel redelkező függvény paraméterét WREG regiszterben adja át?
Ha jól értem a feladatot, akkor így:
Bővebben: Link Megjegyzés: A paraméter átadása a veremtárban történik,a fenti utasításokkal lehet elővenni a veremkeret-mutató felhasználásával.
Arra gondoltam, hogy a fordítót utasítani arra, hogy WREG regisztert használja paraméterátadásra, verem helyett, ha az eljárásban nincs szükség veremre. Static módosítóval nem veremben adja át a paramétert, és ezért nem is generál verem kezelő kódot, mivel lokális változója sincs az eljárásnak, de arra nem jön rá, hogy WREG-ben is átadhatná.
Ez az eljárás:
(Ami már nem a paraméterátadáshoz tartozik, hogy a 0200 címen található utasítás teljesen és egyértelműen fölösleges, de ezt a txb változó volatile módosítója hatására teszi oda.)
Van még egy kérdésem.
Az előzőre úgy sejtem, az a helyes válasz, hogy ennyire nem lehet beleszólni a compiler dolgába. Próbáltam keresni ebben a topic-ban a ment, visszaállít, megőriz szavakra, de nem sokat találtam arról, amit tudni szeretnék. Melyik regiszterek tartalmát kell megőrizni a C-ből hívott assembly rutinokban? Vegyesen írok programot C-ben és assemblyben (nem betétként, hanem külön fájlban, majd az object fájlokat linkerrel összeszerkesztve) Az világos, hogy a szoftveres adat vermet rendben kell tartani, de ezen kívül, ha használni szeretném FSR0, TBLPTR regisztereket, és az ezekhez tartozó egyéb regisztereket, akkor azokat kell-e menteni és helyreállítani? Elvárja-e ezek megőrzését a C fordító normál (nem megszakításkezelő) eljárásoktól és függvényektől? C18-at és MPASM-et használok. Köszönöm icserny előző válaszát, arra a tudásra is szükségem lesz (habár azt már elolvastam a "C18 user guide"-ban, de magyarul mégiscsak egyszerűbb)
Én nem ismerem annyira a fordítót, hogy belelássak, észre veszi-e, hogy az asm betétben milyen regisztereket használsz és annak megfelelően gondoskodik-e a kényes regiszterek mentéséről, de egy szimuláció ezt könnyen kiderítheti.
Írsz egy olyan C forrást, amiben az FSR, vagy a TBLPTR befordításra kerül, majd beleszúrsz egy asm betétet, amiben használod ezeket. Megnézed mit fordított. Ha lesz a fordított asm listában mentés a kérdéses regiszterekről, akkor nagyon okos a fordító! Ezen nagyon meglepődnék! ![]()
Úgy tudom, hogy a visszaadott eredmény méretétől függően W, PRODL
![]()
Azon én is meglepődnék, ha assembly betétbe belenézne, de jelen esetben ezt biztos nem teszi meg, mert külön object fájlba fordítódik külön asm fájlból az assembly függvény, ráadásul előbb fordítja a C fájlt, az után az ASM fájlt. Ettől függetlenül lehet, hogy az eljárások szabadon módosíthatják TBLPTR, TABLAT és FSR0 értékét, úgyhogy marad a próbakód+disassembly.
Illetve az a felvetés ellenőrzése, amit icserny 'nagymester' írt. Ha valóban nem tárolnak infókat bennük, akkor szabadon módosíthatóak. Ezt is le lehet ellenőrizni szimulációval.
Bocs, én PRODL : PRODH-t akartam írni az előző beírásomban, csak a fórummotor túlbuzgóságból vigyori pofát csinált belőle.
Sziasztok!
Próbálkozom icserny Bővebben: Link leírása alapján az LCD ( és a többi ) könyvtár újrafordításával, de valami nem jó: az LCD-re kiíráskor
Steve
Meg kellene nézni a függvény deklarációját, include-jat, már ha egyáltalán beincludolod. Nincs se hibaüzi se warning rá? ugye a string jöhet a ram-ból meg a flash-ból is, ezért lényeges a deklaráció a programod elején
Szerintem ilyen gond nem lehet: a fv. deklaráció is megvan. A fordításnál lehet valami opciós probléma ( ha a fv-t beépítem a projektbe, akkor lefordítja és azt használja --> így jól működik! ). Hibaüzenet, warning nincs!
A string egyébként ilyen parancsnál ( amit írtam ) a ROM-ban helyezkedik el tudtommal. Köszi a segítő szándékot, ha van bármi ötleted, akkor várom... Steve Idézet: Lehet, hogy pont ezt? A gyári könyvtárak ugyanis LARGE opciókkal vannak fordítva. De a fordító pampogásán kívül ez nálam nem szokott gondot okozni.„A projekt beállításnál SMALL van kiválasztva. Mit állítok be rosszul?!” Idézet: Ennek így is kell lennie, ügyanis a függvény deklarációjában szerepela "rom" módosító, ami 24 bites mutatót jelent:„putrsXLCD("ZORRO"); valami nagy mutatót ad át” void putrsXLCD(const rom char *); Idézet: Arra vigyázni kell a gyári könyvtár újrafordításánál, hogy a réhi és az új (módosított állományok) ne keveredjenek össze! Ha az alkalmazás fordításakor az új library és a régi header kerül becsatolásra, akkor nem fog működni. Legbölcsebb a régi változatot elmenteni, és minden módosított állomány lecserélni (.lib, .h). Ha csak az LCD-vel kapcsolatos állományok módosultak, akkor a c018.o állományt nem szükséges lecserélni. „Szerintem ilyen gond nem lehet: a fv. deklaráció is megvan.”
Szia!
Mellékelem, hogy mit látok... A Jó_LCD-nél a projekthez csatoltam a putrxLCD-t és így fordítottam ( ezért azt újrafordítja ! ), a rossznál az általad leírt módszerrel lefordítottam és beraktam a könyvtárba. Az xlcd.h biztosan jó, mert a 2 soros üzemmód és a villogó kurzor megjelenik, csak a szövegkiírás marad el a rossz mutató miatt! Látszik, hogy a jó mutató valóban jó helyre mutat, a másik meg nem is létező helyre ( a PIC-en belül! )! A LARGE opciót kipróbáltam, a hibajelenség megmaradt. Steve
Ha a szöveget a RAM-ba teszem és a
![]() Steve
A rossz változatnál nekem úgy tűnik, hogy csak két bájtos címet kap, és hozzáolvas egy harmadik bájtot, aminek semmi köze a címzéshez.
A könyvtár és az alkalmazás tehát láthatóan különböző memória modell beállítással volt fordítva. A projekt opcióknál a C18 code model: Large (> 64K) beállítással próbálkoztál? Annak jónak kellene lennie! Ha a könyvtárak forrását becsatolod a projektbe, akkor nyilvánvalóan konzisztens lesz a fordítás, akármilyen memória modellt választasz.
A rossz változatnál engem semmi nem emlékeztet a jó címre, Te hol látod az 1 hibás byte-ot?!
A LARGE-ot az előbb próbáltam ( írtam! ), most újra, de nem jó! Steve
Most néztem meg, hogy végül is kell-e vigyázni FSR0 értékére, ha C-ből assembly függvényt hívok. Egy egyszerű ciklust írtam C-ben, ami csupán egy tömböt nulláz, ha semmi függvényhívás nincs benne, akkor is mindig újratölti FSR0-t a mutató értékével, hiába van bekapcsolva minden optimalizálás. Ez alapján arra következtetek, hogy a függvényeknek csak arra kell vigyázniuk hogy maguk után rendben hagyják a vermet.
Ha a próbaidő letelte csak a kiterjesztett utasításkészletet és a procedurális absztrakciót tiltja le akkor ez a C18 fordító még nagyon gyerekcipőben jár (legalábbis a 3.36-os verzió, amit használok), hiszen egy unsigned short változó növelését sem a legrövidebb úton oldja meg. Idézet: A szöveged a 03FA címen van, ha jól látom, s a pointered átvett értéke is tartalmazza ezt a két bájtot, csak van utána egy fölösleges 0x01 bájt.„A rossz változatnál engem semmi nem emlékeztet a jó címre” A szubrutin meghívásának (putrsXLCD("ZORRO"); hogy néz ki a disassembly listája LARGE modell esetén?
Nálam ez a különbség: SMALL modell esetén kétbájtos, LARGE modell estén hárombájtos cím kerül átadásra.
Aha, igazad lehet, én előtte néztem a roszat...
Megcsináltam amit kértél, hátha Te észreveszed a problémát! Steve
Most látom, hogy mire gondoltál, mindjárt megnézem...
Itt van akkor a megfelelő részlet... Itt úgy látom, csak 2 byte-ot ad át!?
De nem értem, hogy miért adnak át adott esetben 3 byte-ot, ha az adott PIC-nél max. 2 byte a ROM címe ?! Steve Idézet: Ez elég érdekes! Tudniillik így nem fog működni...„Itt úgy látom, csak 2 byte-ot ad át!?” Idézet: A fordítót nem izgatja az adott PIC memória-mérete, az majd a linkelésnél derül ki.„De nem értem, hogy miért adnak át adott esetben 3 byte-ot, ha az adott PIC-nél max. 2 byte a ROM címe ?!” Mellesleg a konfigurációs bitek, az EEPROM, az eszközazonosító és a felhasználói azonosító akkor is 24 bites címzést igényel, ha a memória kisebb, vagy egyenlő mint 64 kbyte. A könyvtárakat pedig azért fordítják gyárilag LARGE modellel, mert nincs külön batch fájl a 128 kbites típusokhoz.
HI-TECH-ben hogyan tudom megadni a fordítónak, hogy programozáskor töltse fel az eepromot bizonyos adattal? Gondolok itt arra, hogy pl. az eeprom első byte-jában legyen 1, a másodikban 5, harmadikban 7, stb., és ezt csak programozáskor írja bele. Tudom, hogy programozás előtt direktbe át tudom írni az eeprom regisztereit, és azt tölti be, de nekem a programba kellene ezt megmondanom.
|
Bejelentkezés
Hirdetés |