Codevision a indians
"Ing. K.Prokůpek"
kpr@seznam.cz
Středa Červenec 8 15:51:06 CEST 2009
Dobré odpoledne,
chtěl bych se zeptat uživatelů Codevision, jaký mají problém s konverzí
big-endian na litte-endian.
Mám pole bytů, do něj potřebuji nastrkat různé proměnné .. .char, float,
ulong ... a to vše ve rozložení little-endian.
U jazyků GCC, Turbo C, Zilog ZDS C compiler jsem problém nikdy nebyl,
protože buď to bylo little-endian nebo jednoduše fungovaly pointery.
Ovšem tady se to chová dosti zvláštně, někdy to funguje, někdy ne. Chci
se vyhnout pomalému matermatickému řešení :
horni_bajt = (unsigned char) uiCislo / 256;
dolni_bajt = (unsigned char) uiCislo & 0x00FF;
Tohle funguje,ale taky nerad...
data[0] = (unsigned char)(ulCislo >> 24);
data[1] = (unsigned char)(ulCislo >> 16);
data[2] = (unsigned char)(ulCislo >> 8);
data[3] = (unsigned char)(ulCislo);
Dlouhou dobu jsem zkoušel :
data[4] = (*((unsigned char*)(&uiCislo)-1));
data[5] = (*((unsigned char*)(&uiCislo)));
přeloží se to celkem rozumně a běhá to. Pokud pole data a uiCislo jsou
globálně definované, je spolehlivost tohoto výrazu cca 95% případů.
Pokud pole data je globálně definované a proměnná uiCislo je v těle
funkce nebo větvi hlavního programu, tak už to zlobí cca v 50% případů.
Chybovost se odstraní připsání kusu programu kamkoliv jinam a znovu
kompilací, prostě změnou kódu. Přitom nic nepřetéká, na stack jsem
vyčlenil poměrně dost.
KPR
--------------------------------
Chip: ATmega8
Clock frequency: 11,059200 MHz
Program type: Application
Memory model: Small
Optimize for: Size
(s)printf features: int, width
(s)scanf features: int, width
Promote 'char' to 'int': No
'char' is unsigned: Yes
global 'const' stored in FLASH: No
8 bit enums: Yes
Enhanced core instructions: Yes
Automatic register allocation: Yes
Smart register allocation: Yes
Build: 289
9499 line(s) compiled
No errors
7 warning(s)
Bit variables area: 2h to 2h
Bit variables size: 1 byte(s)
Data Stack area: 60h to 1EFh
Data Stack size: 400 byte(s)
Estimated Data Stack usage: 50 byte(s)
RAM Global variables area: 1F0h to 287h
RAM Global variables size: 152 byte(s)
Hardware Stack area: 288h to 45Fh
Hardware Stack size: 472 byte(s)
Heap size: 0 byte(s)
EEPROM usage: 0 byte(s), 0,0% of EEPROM
Program size: 1827 words (3654 bytes), 44,6% of FLASH
Další informace o konferenci Hw-list