Kaip efektyviai konvertuoja 32-bitų į 8 bitų duomenis?

T

Thomson

Guest
Labas,
Šiuo metu, aš susiduria viena paini problema, apie perėjimą prie 32 bitų kintamąjį į 4 8 bitų duomenų kintamieji.Nors aš ieškojote kai C nuoroda knygų apie šio perskaičiavimo, tačiau aš ne idėja whetehr tai geras dabartinis mano įterptųjų sistemų plėtra.

Dalis informacijos: Projekto I'm įgyvendinimo yra apie 8.051 MCU, kurie gali naudotis baitų per ciklą, tačiau vidaus duomenų autobusas AHB autobusų, kurie yra 32 bitų.Todėl atominės duomenų apdorojimo vienetas yra 32 bitų, įskaitant duomenis ir adresą!Ar gera suggestios?Thansk anksto!Thomson

 
Viena galimybė yra naudotis 4-uostų 89C52 mikrovaldiklio, bet tai reiškia, kad beveik visi Pins Wired ..
Kitas variantas būtų taikyti išorinių "Hardware" ir prijungti 4 8-bit D-užraktai (74LS/HCT374, pavyzdžiui), kad visus 32 bitus, laikrodis ir sklende duomenis, o paskui skaityti 4 8 bitų ICS seka. .
Tai turėtų konvertuoti vieną 32-bitų žodį į keturias 8 bitų žodžius ..

Linkėjimai,
IanP
Paskutinį kartą redagavo IanP m. kovas 23, 2006 10:44, edited 1 kartą

 
IanP rašė:

Viena galimybė būtų prijungti 4 8-bit D-užraktai (74LS/HCT374, pavyzdžiui), kad visus 32 bitus, laikrodis ir sklende duomenis, o paskui skaityti 4 8 bitų ICS seka ..

Tai turėtų konvertuoti vieną 32-bitų žodį į keturias 8 bitų žodžius ..Linkėjimai,

IanP
 
Hi Thomson,

jei nebus pakeisti duomenų išorėje, tai reiškia, kad jūs tiesiog reikia perduoti 32-bitų duomenis per 8-bitų magistralės.Tai galėtų būti padaryta, nes užgožia 4 8 bitų duomenų (kiekvienos grupės 8-bitų duomenų užmaskuotas atitinkamai), o vėliau perkelti duomenis į rungtynes 8-bit autobusų avalailable.

Tačiau, jei jūs taip pat ketinate tvarkyti / keisti duomenų ribų, tada problema tampa daug sudėtingesnis, nes tai reiškia, kad jūs turite susikurti sistemą, kovoti su aritmetines ir logines operacijas 4 8 bitų duomenų, pavyzdžiui, 32-bitų duomenų.

geriausias

 
Labas

Paprastas sprendimas yra toks.

Int32 var32bit;
int8 var8bit1;
int8 var8bit2;
int8 var8bit3;
int8 var8bit4;

var8bit1 = var32bit / / Žemutinė Užsakyti baitas
var8bit2 = var32bit>> 8;
var8bit3 = var32bit>> 16;
var8bit4 = var32bit>> 24; / / Aukštasis Užsakyti Baitas
-------------------------------------------------- -----------------
Kitas approch

Int32 var32bit;
int8 var8bit [4];
int8 I

for (i = 0; i <4; i )
(
var8bit = var32bit <<(i *

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Vėsus" border="0" />

;
)

/ / Var8bit [0] bus pateikta žemesnei baitas
/ / Var8bit [3] turės būti didesnis, kad baitas

Linkėjimai
GopiParašytas po 15 minučių:swapgo rašė:

Labasfor (i = 0; i <4; i )

(

var8bit = var32bit <<(i *
<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Vėsus" border="0" /> ;

)Gopi
 
swapgo,

kvailas klausimas:

Kodėl visada darant prielaidą, kad sudarytojas bus priskirti mažiausiai svarbus baitas į Int32 kintamasis (bits 7:0) su int8.
Kodėl ne svarbiausias baitas, tai bitai 31:24
Tai turi kažką daryti, arba kokiu nors būdu susijusi su duomenų saugojimo mažai arba Big endian formatas?

Toliau, jums rašė: "var8bit2 = var32bit>> 8;"
Tada šiek tiek žemiau: "var8bit = var32bit <<(i * 8)", darant prielaidą, kad i = 1
Hope it's not erzina klounas, kurie keičia pamainą kryptimi.

 
Silvija rašė:

swapgo,kvailas klausimas:Kodėl visada darant prielaidą, kad sudarytojas bus priskirti mažiausiai svarbus baitas į Int32 kintamasis (bits 7:0) su int8.

Kodėl ne svarbiausias baitas, tai bitai 31:24

Tai turi kažką daryti, arba kokiu nors būdu susijusi su duomenų saugojimo mažai arba Big endian formatas?Toliau, jums rašė: "var8bit2 = var32bit>> 8;"

Tada šiek tiek žemiau: "var8bit = var32bit <<(i * 8)", darant prielaidą, kad i = 1

Hope it's not erzina klounas, kurie keičia pamainą kryptimi.
 
Tamson

Kada turėčiau naudoti duomenis keliais skirtingais būdais Aš paprastai naudoju Sąjungos reikalingų struktūrų tipai.Sukūrę šios sąjungos galite pamatyti bet kokio formato duomenų apibrėžti savo struktūras.
Jūsų atveju viena struktūrą būtų į 32-bitų kintamasis ir keturias 8 bitų kitų kintamųjų.

Ji nėra sunaudoja daug kodas.

Regards, yego

 
Manau taip pat galima naudoti sąjunga duomenų tipą išspręsti problemą, nėra tiesa?
Galbūt tai gali atrodyti taip:Typedef Sąjungoje (
Uint32 long_var;
Uint8 char_var [4];
MyUnion);

Tada jūs neturite paversti iš tikrųjų, tik prieigos teisę baitas gauti norimą baitų norite.

nuoširdžiausi linkėjimai,

 
Būtent įvedimo sąjungų į C kalbą,

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Šypsotis" border="0" />Regards, yego

 
typedef unsigned char byte;
typedef unsigned trumpas žodis;
typedef unsigned ilgai DWORD;
Typedef bitų BOOL;

Typedef Sąjungoje (
DWORD long_var;
Byte char_var [4];
MyUnion);unsigned char ahb_sg_wr (MyUnion ahb_addr, MyUnion ahb_data)
(
unsigned char op_ready;
op_ready = 0;
/ / op_start_address_reg = ahb_addr;
/ / op_start_address_reg0 = (byte) (0x000000ff & ahb_addr);
/ / op_start_address_reg1 = (byte) ((0x0000ff00 & ahb_addr)>>

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Vėsus" border="0" />

;
/ / op_start_address_reg2 = (byte) ((0x00ff0000 & ahb_addr)> 16);
/ / op_start_address_reg3 = (byte) ((0xff000000 & ahb_addr)> 24);
op_start_address_reg0 = ahb_addr.char_var [3];
op_start_address_reg1 = ahb_addr.char_var [2];
op_start_address_reg2 = ahb_addr.char_var [1];
op_start_address_reg3 = ahb_addr.char_var [0];

/ / op_data_count_reg = 4; / / 4 baitai skaityti
/ / op_type_reg = 2;

/ / op_data_fifo_reg2 = ahb_data [0]; / / tiesiog pridėti
/ / op_data_fifo_reg2 = ahb_data [1]; / / tiesiog pridėti
/ / op_data_fifo_reg2 = ahb_data [2] / / tiesiog pridėti
/ / op_data_fifo_reg2 = ahb_data [3]; / / tiesiog pridėti
/ / Op_data_fifo_reg2 = (byte) (0x000000ff & ahb_data);
/ / op_data_fifo_reg2 = (byte) ((0x0000ff00 & ahb_data)>>

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Vėsus" border="0" />

;
/ / op_data_fifo_reg2 = (byte) ((0x00ff0000 & ahb_data)> 16);
/ / op_data_fifo_reg2 = (byte) ((0xff000000 & ahb_data)> 24);

op_data_fifo_reg2 = ahb_data.char_var [3];
op_data_fifo_reg2 = ahb_data.char_var [2];
op_data_fifo_reg2 = ahb_data.char_var [1];
op_data_fifo_reg2 = ahb_data.char_var [0];

op_cs_reg = 6;

while (! op_ready)
op_ready = op_cs_reg & 1;

op_data_fifo_cs_reg2 = 4;
op_data_fifo_cs_reg2 = 0;

return TRUE;
)

ahb_addr.long_var = 0x01020304;
ahb_data.long_var = 0x10203040;
ahb_sg_wr (ahb_addr, ahb_data);Po kodo fragmentus yra dalis mano prašymą naudojami 8.051 MCU!

Deja, šis approache taip pat sukuria pernelyg didelis atitinkamų surinkimo kodais ir mažos modeliavimo greičio (už ahb_sg_wr užduotis).

Ir šią schemą, taip pat susijęs baitas paskirstymo tikrasis C Compliler taip pat.Iš tikrųjų, kaip veikia kompiliatorius alignes atitinkantis baitas su konkrečia vieta ir ilgas žodis (32 bitų čia)?

Tačiau šis metodas turi pranašumą greitį correspoding metodą, nurodytą pagal minėto perkėlimo operacijos.Tai yra didelis patobulinimas faktas!

Šiuo metu, aš naudojamas vienas metodas pravažiuojančių 4-BYTE parametrai izoliuotos ir tiesiogiai, o ne 32-bit tik viena, kaip nurodyta toliau:
ahb_sg_wr (A1, A2, A3, A4 D1, D2, D3, D4), siekiant sumažinti pertvarkos.

Faktiškai, tokiu būdu bus geriau kodo dydį ir greičio mano Keil Kompiliatorius.Nepaisant to, greitis yra dar klausimas, nes užduotis telefonu kainuos gana daug ciklų (ar surinkimo kodais taip pat).

Šiuo metu Man įdomu, ar 32-bitų MCU turi būti naudojamas vietoj 8-bitų MCU sumažinti laiko spaudimo, bet kai kurie geriau metodai gali būti naudojami siekiant įgyvendinti šį tikslą, tai daug geriau, nes aš tikrai don ' T norite pakeisti šio 8 bitų MCU!

Čia ačiū už visą jūsų pagalba daug!

Thomson

 
Labas,

Dėkojame už jūsų patarimus!

Dabar greitis buvo patobulinta iki 73 MCU ciklų, kurie gali būti pakenčiamas, nors nėra labai geras!Taip mano požiūris gali būti naudingas kitiems:
<1> sumažinti unnessary parametrus taip, kad šie parametrai gali būti įmontuota į registrų!
<2> sumažinti unnessary užduotims užduotis.
<3> padaryti grįžti duomenų tipas void, jei viskas gerai
<4> padaryti sąlyga kintamos vietoj char varaible kuo sbit
<5> padaryti funkcija daugiau specifci vietoj apskritai, kuri, žinoma, bus pridėti papildomi kodai, o greitis gali būti geriau!

Thomson

 
Tokį metodą naudoja savo grupę dabar!

# define MSB (Word) (byte) (((WORD) (word)>>

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Vėsus" border="0" />

& 0xFF)
# define LSB (Word) (byte) ((WORD) (Word) & 0xFF)

# define SWAP_ENDIAN (Word) ((BYTE *) & Word) [0] ^ = ((BYTE *) & Word) [1]; \
((BYTE *) & Word) [1] ^ = ((BYTE *) & Word) [0]; \
((BYTE *) & Word) [0] ^ = ((BYTE *) & Word) [1]

 
Hi Silvija,

Taip Valio teisę mes negalime manyti, kad visi kompiliatoriai laikytis tos pačios konvencijų!

Bet aš davė čia dirbs PIC ir Atmel 8.051 mikrokontrolerio.Ir poslinkio kryptimi, kuri man davė negerai!Man gaila jo rašybos klaidą!
Thanks for pointing this out!

Linkėjimai
Gopi

 

Welcome to EDABoard.com

Sponsor

Back
Top