KEIL ARM Big Endian Problemi

Başlatan baran123, 02 Ocak 2018, 18:11:26

baran123

KEIL ARM ile çalışırken union içerisindeki uint8_t tipindeki verileriz uint16_t ye dönüştürülürken hep LSB de olan verilerin MSB ye kaydığını gördüm.
Bunu nasıl düzeltebilirim ?

__packed typedef union 
{
	__packed struct 
	{
		uint8_t u8[8];
	};
	
	__packed struct 
	{
		uint16_t u16[4];
	};
	
}U8toU16;

U8toU16 myType;
	
myType.u8[0] = 0;
myType.u8[1] = 10;
	
myType.u8[2] = 0;
myType.u8[3] = 11;
	
myType.u8[4] = 0;
myType.u8[5] = 12;

myType.u8[6] = 0;
myType.u8[7] = 13;


Çıktı şu şeklide
u16[0] = 0x0A00;
u16[1] = 0x0B00;
u16[2] = 0x0C00;
u16[3] = 0x0D00;

Beklenen çıktı
u16[0] = 0x000A;
u16[1] = 0x000B;
u16[2] = 0x000C;
u16[3] = 0x000D;

Elektroemre

Yapılacak çok bir şey yok. Mimarinin endian'ı neyse ona tabisin. Veriyi hızlı işlemen gerekiyorsa byte'ları swap eden ARM komutları mevcut diye hatırlıyorum.

Tagli

Olan şey normal little endian çalışma şekli. LSB'den MSB'ye kayma yok. Küçük adrestekiler küçük byte olmalı zaten. Bildiğim kadarıyla piyasadaki işlemcilerin büyük çoğunluğu bu şekilde çalışıyor (aslında ARM mimarisi bu konuda bir kısıtlama getirmiyor ve tercihi üreticilere bırakıyor). Eğer sana big endian tarzı bir davranış gerekiyorsa bunu kendin elle ters çevirerek halletmelisin.
Gökçe Tağlıoğlu

baran123

uint16 ya çevirmeyi elle yaptım artık :)
Çok hızlı yapmam gerekirse SWAP benzeri yöntemler kullanırım.
Teşekkür ederim.