Fórum témák
» Több friss téma |
#include <16F874.H>
#fuses HS,NOPROTECT,NOWDT #use delay(clock=16000000) #define BACK RC6 #define UP RB5 #define DOWN RC7 #define RESET_BUTTON PIN_B4 #define Lcd_BL PIN_E2 #define DAL_SCL PIN_C3 #define DAL_SDA PIN_C4 #include "flex_lcd_2.c" #include "DS1621.c" //#byte PORT_B=6 int current_temp, max_temp, min_temp; void reset_temp() { current_temp = read_temp(); min_temp=current_temp; max_temp=current_temp; } void main() { init_temp(); lcd_init(); delay_ms(6); output_high(Lcd_BL); //blacklight reset_temp(); while(TRUE) { current_temp = read_temp(); if(input(RESET_BUTTON)!=0) reset_temp(); if(current_temp>max_temp) max_temp=current_temp; if(current_temp printf(lcd_putc,"\fAktualis hom: %U F\nMin: %U Max: %U",current_temp,min_temp,max_temp); delay_ms(1000); } }
Az include fájlok közül a ds1621 a gyári ccs-é a
"flex_lcd_2.c ha esetleg kell azt is felteszem.
A read_temp() függvénynek nézz utána (gondolom, a CCS könyvtári modulok között megtalálod a forrását). Erős a gyanúm, hogy a hőmérőből beolvasott értéket átkonvertálja Fahrenheit skálára. Erről kellene lebeszélni valahogy.
Én sem figyeltem fel erre még, de azért ebben is van valami logika: a 'C' utasítás fordítását írja mellé szerintem és ha nem figyeljük a címeket, akkor ezek szerint eltévedhetünk! Megint tanultam valami újat, érdemes ezt a listát olvasni!
Steve
Igazad lehet!
Csak írnom kéne egy fgv-t ami a visszatérési értéket átkonvertálja Celsiusra. Megpróbálom, hátha tényleg ennyi a baja. Köszönöm a segítségedet! Idézet: Inkább a Fahrenheit skálára történő konvertálást hatástalanítsd! Ugyanis az IC Celsiusban nyomja ki az eredményt, a könyvtári függvény meg fölöslegesen Fahrenheit-re konvertálja. „Csak írnom kéne egy fgv-t ami a visszatérési értéket átkonvertálja Celsiusra.”
Igen, igazad volt.
Valóban megcsinálja, hogy a kiolvasott értéket átváltja Fahrenheit-be. Egyszerűen kikommenteztem azokat a részeket és azóta szépen működik. Mégegyszer köszi!
C18 nyelven alacsony és magas megszakításnál a fordító automatikusan kimenti a STATUS, WREG, BSR regisztereket, a végén pedig visszaállítja? Néztem a disassembly meg a program memory ablakot, de csak az FSR tartalmakat pakolgatja.
Magas prioritásnál a kontroller hardveresen menti és állítja vissza a RETFIE, FAST utasítás hatására a W, STATUS és BSR regisztereket, még a fordítónak sem kell foglalkoznia ezekkel, csak annyi a dolga, hogy RETFIE, FAST-al térjen vissza a megszakítási rutinból. Alacsony prioritásnál menteni kell mindent ugyanúgy, ahogy a 16F-nél.
Egyes kontrollereknél vannak problémák ezzel a magaszintű megszakítás hardveres mentésével, ezért ezeknél a magas szintű megszakítsásnál is "kézzel" kell menteni és visszatölteni, valamint a végén simán RETFIE-vel térni vissza.
Tehát pl. a 18F2550-nél csak alacsony prioritású megszakításnál kell kimenteni majd visszaállítani?
A 18F2550 pont az egyik ilyen problémás kontroller, negyedik pontot nézd meg: Link. Elvileg az A3-tól újabb revíziókat már nem érinti ez a probléma.
C fordítóknak nem kellene a nem használt cuccokat kigyomlálniuk a lefordított kódból? Van egy fájlom (igazából kettő, Tahoma.h és Tahoma.c), amiben csak a grafikus lcd számára karakterek leírását tartalmazó táblázatok vannak.
A Tahoma.h fájlomban ez van:
A Tahoma.c fájlban meg valami ilyesmi:
A Tahoma.h fájl egy TFT.h fájlba van beincludolva, illetve be van a Tahoma.c fájlba is. A TFT.c fájlba be van a TFT.h includolva, és ez a TFT.c az a fájl, ami ezt a táblázato(ka)t használja. Nálam jelenleg csak az Arial16x18 van használva a TFT.c fájlban, a Tahoma nincs sehol sem használva, ki van kommentezve a TFT.c-ből. De ha ezt így fordítom, akkor mindkét táblázat bekerül a hex fájlba, ez egyértelműen látható abból, hogy ha kikommentezem a Tahoma16x19-t, akkor a táblázat méretének megfelelően kisebb lesz a fordított kód mérete. Kérdés, ha nincs használva a Tahoma16x19 táblázat (márpedig mivel lefordul, ezért biztos, hogy nincs), akkor miért nem hagyja ki a fordító eleve a hex fájlból? Minden optimalizálás be van kapcsolva, C18 fordító, még a demó időszak sem járt le. A másik, hogy próbáltam, hogy az extern-t kihagyom a Tahoma.h fájlban a Tahoma16x19 elől, arra meg azt mondta, hogy "symbol 'Tahoma16x19' has multiple definitions". De miért? Vagy valamit eleve rosszul csinálok ezekkel az includolásokkal, pl. nemjó helyen includolok?
Ne támasszunk irreális elvárásokat! A fordító optimalizáláskor a generált programkódot optimalizálja, nem pedig az adattáblákat.
Arra gondolok, hogy ami nincs használva, azt egyszerűen kihagyhatná. Nekem ezt nem tűnik olyan nagy problémának megoldani. Vagy az lenne? Pl. a nem használt változókat is kihagyja. Direkt kipróbáltam, tettem a main után egy unsigned z;-t, és fordítás után ugyanaz a memóriafoglalása, mint a z nélkül.
Nem vagyok benne járatos, csak egy ötlet: honnan tudja, hogy nem használod a táblát ( nem-e címzed meg indirekt módon, vagy ki tudja mit teszel a címző regiszterekbe, akár kintről is beolvashatsz címet nyomógombokról! ) --> hogy merje kihagyni
![]() Steve
Eloszor is a fordito kepessegeitol fugg, hogy ki tudja-e optimalizalni. Masodszor pedig -- es szerintem ez a lenyeg -- a tablazat globalis igy akar egy masik C file-bol is hozza ferhetsz (eme szandekodat meg is erosited az extern kulcsszoval), amit csak a linker tudna eldonteni, hogy hozza fersz-e avagy sem. Magyaran az efajta kod optimalizacio a linker feladata lenne, nem pedig a forditoe.
Szerintem ket egyszeru megoldas letezik: 1. Forditasi feltetelekkel add meg minek kellene bele fordulnia, es akkor egy konfiguracios .h file-lal be tudod allitani milyen karakter keszletekre van szukseged 2. Szetszeded a karaktertabakat es csak azt rakod bele a projectedbe amire valoban szukseged van
Sajnos ezt sejtettem én is, hogy a linkernek kellene ezt megcsinálnia, hiszem valóban másik fájlból használom a táblát.
A feltételes fordítási direktíva viszont jó ötlet, kösz a tippet ![]()
Sziasztok
Bosszantó egyszerű kérdésem van de, atoll nekem nem megy Adott egy C progi ezt szeretném le fordítani HEX-re Köszönöm a segítséget
Szia
Bocsi a fele infot ki hagytam Mplab bal próbáltam de nekem nem megy a wizard elindítottam de, ott nem tudom, hogy mit kel tenni
Ajánlott irodalom: MPLAB 8.1 magyar nyelvű leírása
Ezek szerint nem jól gondoltam? Egyértelmű a kód alapján, hogy használom-e a táblát ( nem lehet, hogy nem tud róla, mert pl.indirekt címzést használok ? ) ?
Steve
A C18 optimalizásainál a "Dead code removal" mit jelent? Mert ahogy nézem, nem azt, amire én gondoltam, hogy a sehonnan sem hívott függvényeket kihagyná. Pedig mintha Wiki pont ezt írná. Valahogy úgy képzelem, hogy ha nincs egy függvény használva sehol sem a forráskódban, akkor azt a fordító eltávolíthatná a fordított kódból. Ezzel szemben ha kikommentelem az Init() hívást, egyetlen utasítással lesz csak kisebb a lefordított kódom, láthatóan csak magát a függvényt hívó RCALL-t hagyja ki a fordító. Jelen esetben egyetlen fájlon belül van minden, még a .h fájlban sincs a függvény létezése említve. A C18 ilyen gyengén tud optimalizálni? Egy modern fordítókat nem kellene az ilyesmiket tudnia? Vagy én nem vagyok valamivel tisztában?
A C18 User's guide alapján nekem úgy tűnik, hogy az a függvények lokális változóit tudja kigyomlálni, de magát a függvényt nem távolítja el (Ja és a Copy Propagation-nel együtt használatos).
Esetleg próbáld meg az Unreachable-code removal opciót bekapcsolni az optimalizációnál, talán az segít.
Bevan minden optimalizálás kapcsolva.
Ez ugye nem az ingyenes valtozat ahol a kod optimalizalas ki van kapcsolva gyarilag? :hide:
Ezt töltöttem le: MPLAB C for PIC18 v3.40 Standard-Eval Version. Ezt írja a build fülre:
Idézet: „ MPLAB C18 v3.40 (evaluation) Days remaining until evaluation becomes feature limited: 30” Meg ha kikapcsolgatok optimalizálásokat, akkor növekszik a kódméret, szóval valamiket optimalizál. Amire te gondolsz, az a "MPLAB C for PIC18 v3.40 in LITE mode", nem?
De arra gondoltam...
Na most megirtam kozben egy kiegeszitest, de mire vegeztem ki time-out-olt a HE ![]() Szoval sem a 'Dead Code Removal' sem pedig az 'Unreachable Code Removal' nem segit -- azok algoritmikus optimalizaciok amiket a fordito el tud vegezni. Az egyik a Copy Propagation segitsegevel felderiti azokat az ertekadasokat emelyekhez seged valtozok hasznalata nem kotelezo, es azokat kigyomlalja, a masik pedig azokat a kodreszleteket szedi ki ahol pl a feltetel forditasi idoben kiertekelheto igy a nem hasznalt kod kigyomalalhato. De egyik sem beszel fuggvenyekrol! Azokat a linkernek kellene kiszednie, de ugy nezem a linker nem ilyen okos (hacsak nem magatol csinalja ezt meg). Lehet a Librarian az okosabb es minden fuggvenyt ha kulon konyvtarba teszel akkor csak azt a konyvtarat fogja neked bepakolni amire szukseged van... Ezt at kellene nezned, ill remelem tevedek, es a linker megiscsak okos joszag -- akkor legyszi oszd meg velunk ezt ![]()
Ki kellene próbálni, hogy a HiTech 18F fordítója milyen, de azzal meg a gyári kódok fordítása nem megy. Van pár demo, ami fel van készítve rá, de közel sincs mind, ahogy néztem.
|
Bejelentkezés
Hirdetés |