Hei,
En tiedä onko ajatukseni oikein:
Minulla on kuvitteellinen struct:
typedef struct{
BYTE stx; /* stx-byte */
BYTE length; /* length of the incoming msg (120 bytes) */
BYTE data[120]; /* The message from the Hospal */
BYTE crc[2]; /* The two CRC-byrtes */
BYTE eot;
} query_def;
Tuohon structiin luen seuraavanlaisen sarjaporttiviestin (huom kenttien koot):
Name******# of bytes*****value
stx*******1**************002 (0x02)
lenght*****1**************1 to 255
data******120************-
crc*******2**************0 to 65535
eot*******1**************004 (0x04)
Muuttuvatko nuo sarjaporttiviestin "kentät" oikein structissa, eli esim.
stx structissa on kooltaan tavu, eli vastaa yhtä tavua viestissä, jolloin siihen otetaan 8 ensimmäistä bittiä viestistä?
...
data-kenttään structissa luetaan 120 tavua viestistä
ja crc:hen 2 tavua crc-kohdasta viestiä?
Onko ajatukseni oikein? Luku structiin tapahtuu näin: query_def = (query_def*)serial_buffer;
Serial buffer on char-jono.
En tiedä onko ajatukseni oikein:
Minulla on kuvitteellinen struct:
typedef struct{
BYTE stx; /* stx-byte */
BYTE length; /* length of the incoming msg (120 bytes) */
BYTE data[120]; /* The message from the Hospal */
BYTE crc[2]; /* The two CRC-byrtes */
BYTE eot;
} query_def;
Tuohon structiin luen seuraavanlaisen sarjaporttiviestin (huom kenttien koot):
Name******# of bytes*****value
stx*******1**************002 (0x02)
lenght*****1**************1 to 255
data******120************-
crc*******2**************0 to 65535
eot*******1**************004 (0x04)
Muuttuvatko nuo sarjaporttiviestin "kentät" oikein structissa, eli esim.
stx structissa on kooltaan tavu, eli vastaa yhtä tavua viestissä, jolloin siihen otetaan 8 ensimmäistä bittiä viestistä?
...
data-kenttään structissa luetaan 120 tavua viestistä
ja crc:hen 2 tavua crc-kohdasta viestiä?
Onko ajatukseni oikein? Luku structiin tapahtuu näin: query_def = (query_def*)serial_buffer;
Serial buffer on char-jono.
Vastaukset 3
Vanhimmat
Jos haluat kopioida suoraan serial_buffer -> query_def, niin käytä memcpy:tä.
Jos taas haluat kopioida osoittimen tyyppiin query_def, niin silloin voi käytellä = -merkkiä.
Olenko ymmärtänyt oikein, että kaikki kääntäjät eivät aseta structin kenttiä peräkkäin muistissa, vaan täydentävät ne 32 bitin monikertoihin. Koneet lukevat muistia nopeammin, jos luku alkaa 32 bitin kerrannaisista.
Vai kuinka tämä menee?
Aivan. Tietueen kentät ovat peräkkäin, mutta välissä voi olla ylimääräisiä tavuja. Tuo monikerta voikin sitten olla: 1, 2, 4, 8, 16 tai koodaajan määrittämä tavun monikerta.
Tuokin on kääntäjän asetuksissa. Jos esim. käytössä on 8, niin
typedef struct{
BYTE stx;
BYTE length;
//6 ylimääräistä tavua
BYTE data[120];
//0 ylimääräistä tavua (120 on jaollinen 8:lla)
BYTE crc[2];
BYTE eot;
//5 ylimääräistä tavua
} query_def;
Koneen luennan nopeus on pääosin riippuvainen:
- 32 bittisellä koodilla 4 tavun monikerta
- 64 bittisellä koodilla 8 tavun monikerta
Poikkeuksena 32 bittisellä koodilla on 8 -tavuinen luku (esim. tietotyypistä double), joka pitäisi olla 8 tavun monikerta. Molemmilla on lisäksi poikkeuksena xmm -rekisterien tietotyypit, jotka vievät 16 tavua (16 tavun monikerta). Nuo xmm -tietotyypit ovat sikäli vaativampia, että jos tieto ei ole 16 tavun monikerrannainen, ohjelma kaatuu.
Lisäpoikkeuksia ja aiheesta muutenkin tarkemmin löytyy esim.:
www.intel.com/design/processor/manuals/248966.pdf