Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   46 / 153
(#) Wudoou hozzászólása Szept 5, 2011 /
 
#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 min_temp=current_temp;

printf(lcd_putc,"\fAktualis hom: %U F\nMin: %U Max: %U",current_temp,min_temp,max_temp);
delay_ms(1000);
}
}
(#) Wudoou hozzászólása Szept 5, 2011 /
 
Az include fájlok közül a ds1621 a gyári ccs-é a
"flex_lcd_2.c ha esetleg kell azt is felteszem.
(#) icserny válasza Wudoou hozzászólására (») Szept 5, 2011 /
 
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.
(#) kissi válasza zenetom hozzászólására (») Szept 5, 2011 /
 
É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
(#) Wudoou válasza icserny hozzászólására (») Szept 5, 2011 /
 
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!
(#) icserny válasza Wudoou hozzászólására (») Szept 5, 2011 /
 
Idézet:
„Csak írnom kéne egy fgv-t ami a visszatérési értéket átkonvertálja Celsiusra.”
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.
(#) Wudoou válasza icserny hozzászólására (») Szept 5, 2011 /
 
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!
(#) zenetom hozzászólása Szept 11, 2011 /
 
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.
(#) potyo válasza zenetom hozzászólására (») Szept 11, 2011 /
 
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.
(#) zenetom válasza potyo hozzászólására (») Szept 11, 2011 /
 
Tehát pl. a 18F2550-nél csak alacsony prioritású megszakításnál kell kimenteni majd visszaállítani?
(#) potyo válasza zenetom hozzászólására (») Szept 11, 2011 /
 
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.
(#) zenetom válasza potyo hozzászólására (») Szept 11, 2011 /
 
Köszi!
(#) potyo hozzászólása Szept 12, 2011 /
 
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:
  1. #ifndef TAHOMA_FONT
  2. #define TAHOMA_FONT
  3.  
  4. extern rom const unsigned char Tahoma16x19[];
  5.  
  6. extern rom const unsigned char Arial16x18_Regular[];
  7.  
  8. #endif


A Tahoma.c fájlban meg valami ilyesmi:
  1. rom const unsigned char Tahoma16x19[] = {
  2.    0x00,
  3.    0x00,
  4.    0x20,0x00,
  5.    0x7F,0x00,...
  6. };
  7.  
  8. rom const unsigned char Arial16x18_Regular[] = {
  9.    0x00,
  10.    0x00,
  11.    0x20,0x00,
  12.    0x7F,0x00, ...
  13. };


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?
(#) icserny válasza potyo hozzászólására (») Szept 12, 2011 /
 
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.
(#) potyo válasza icserny hozzászólására (») Szept 12, 2011 /
 
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.
(#) kissi válasza potyo hozzászólására (») Szept 12, 2011 /
 
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
(#) trudnai válasza potyo hozzászólására (») Szept 13, 2011 /
 
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
(#) potyo válasza trudnai hozzászólására (») Szept 13, 2011 /
 
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
(#) (Felhasználó 56240) hozzászólása Szept 13, 2011 /
 
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
(#) potyo válasza (Felhasználó 56240) hozzászólására (») Szept 13, 2011 /
 
És mi a kérdés?
(#) (Felhasználó 56240) válasza potyo hozzászólására (») Szept 13, 2011 /
 
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
(#) icserny válasza (Felhasználó 56240) hozzászólására (») Szept 13, 2011 /
 
(#) kissi válasza trudnai hozzászólására (») Szept 13, 2011 /
 
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
(#) potyo válasza trudnai hozzászólására (») Szept 15, 2011 /
 
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?
(#) El_Pinyo válasza potyo hozzászólására (») Szept 15, 2011 /
 
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.
(#) potyo válasza El_Pinyo hozzászólására (») Szept 15, 2011 /
 
Bevan minden optimalizálás kapcsolva.
(#) trudnai válasza potyo hozzászólására (») Szept 15, 2011 /
 
Ez ugye nem az ingyenes valtozat ahol a kod optimalizalas ki van kapcsolva gyarilag? :hide:
(#) potyo válasza trudnai hozzászólására (») Szept 15, 2011 /
 
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?
(#) trudnai válasza potyo hozzászólására (») Szept 15, 2011 /
 
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
(#) potyo válasza trudnai hozzászólására (») Szept 15, 2011 /
 
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.
Következő: »»   46 / 153
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem