CCS-C error - #opt9
Andras Tantos
andras at tantosonline.com
Sat Jul 16 15:57:24 CEST 2005
Hali!
> Az error log:
> ----------------------------------------------------------------------
> Error[300] C:\ccs\cpu.c 461 : More info: Access violation at address
> 014A9D9E in module 'PCH.DLL'. Read of address 022E801A
> Error[44] C:\ccs\cpu.c 461 : Internal Error - Contact CCS OUTPUT FILE O
> ----------------------------------------------------------------------
Gratulalok! Talaltal egy fordito bug-ot. A CCS forditas kozben olyan
memoriahoz akart hozzaferni, ami nem elerheto (NULL-pointer dereference,
kerszeres felszabaditas, arva pointer, string tuliras, vagy olvasas, vagy
valami hasonlo). Ha jelenteni akarod a hibat, akkor 'Contact CCS'. Fogjak
kerni toled a forraskodot, es az osszes forditasi opciot, a verzio szamot,
es a generalt output-ot, hogy diagnosztizalni tudjak a hibat.
Bar lehet, hogy ez egy ismert hiba:
http://www.hcilab.org/resources/ccsc/ccsc-howto.htm
Itt azt irjak, hogy rendezgesd at a forraskododat, es lehet, hogy el fog
mulni.
> Mi a franc ez???
> #opt8 és #opt7 esetén is ugyanez a jelenség; viszont #opt6-tal már megint
> befordul, szépen, hiba nélkül. A mérleg viszont:
> ROM used: 25026 bytes (76%)
> Largest free fragment is 7738
> RAM used: 751 (49%) at main() level
> 811 (53%) worst case
> Stack: 8 worst case (4 in main + 4 for interrupts)
>
> Szal #opt9 és #opt6 között 16% ROM a különbség; nem rossz!
>
> De mi lehet az egész hátterében, amiért #opt9-el nem tudok tovább menni,
> #opt6-tal meg vigan beforditja?
#opt8 es #opt9 engedelyez valami olyan optimalizaciot, ami a te programod
eseteben bug-os, es elszall tole a fordito. Amugy szerencses vagy, ez az
egyik leg kellemesebb fordito-bug, ami elofordulhat. Legalabb nem generalt
egy szo nelkul hibas kodot... Bar nem tudom, ez vigasztal-e :-).
> Mik ezek az optimizációs szintek? Ez valami C szabvány, vagy a CCS-nek
> saját belső szabványa?
Nem, nem C szabvany, viszont minden (szora erdemes) C forditonak vannak. A
kulonbozo szinteken kulonbozo melysegu kod-analizaciot engedelyeznek a
programon, illetve kulonbozo aggreszivitassal optimalizaljak a kodot. Pl. a
tail-code-elimination optimalizaciot, ami annyit takar, hogy ha egy fuggveny
ugy er veget, hogy meghiv egy masik fuggvenyt, es utana mar csak visszater,
akkor meghivas helyett lehet ugrani is arra a fuggvenyre, felteve persze,
hogy a stack-et is elo lehet ehhez kesziteni megfeleloen, valoszinuleg eleg
hamar, talan mar #opt1-nel engedelyezik.
A pointer aliasing analizist viszont, ami annyit tesz, hogy megnezi, hogy
ket pointer mutathat-e ugyanarra a memoriacimre, es ha nem, akkor (leven az
egyik pointer-en keresztuli iras nem modosithatja a masik pointer altal
mutatott erteket) a pointerek altal mutatott ertekeket lehet regiszterben
tarolni valoszinuleg csak valahol #opt5-6 korul kapcsoljak be.
Persze fogalmam sincs, es a website se ad semmi tampontot erre nezve, hogy
pontsan mit is csinalnak a kulonbozo #opt kapcsoloknal. A legtobb fordito
egyebkent inkabb 3-4 szintet kulonboztet meg:
- nincs optimalizacio
- meretre optimalizal
- sebessegre optimalizal
- aggressziven sebessegre optimalizal.
Udv,
Tantos Andras
More information about the Elektro
mailing list