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