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