[elektro] C - memset

SZIGETI Szabolcs szigiszabolcs at gmail.com
Wed Feb 3 14:35:44 CET 2016


A C szabvány szerint bárhova berakhat kitöltő bájtokat, ha valamiért így
kívánja. Bizonyos esetben nem is lehet másként, pl a 68000 cpu csak páros
címen tud 16 bites értéket címezni, különben bus error. De ugyanennek lehet
teljesítmény oka is, hiszen nem mindegy, hogy egy vagy két memóriaciklussal
érsz el egy adatot. Manapság általában ez az indok.
Ezért a fordító úgy pakolja az változókat, hogy páros vagy néggyel osztható
stb. címre essenek.
De ez neá mindig jó, pl. ha memóriába ágyazott io van kötött
regiszterekkel, vagy egy fájlból kell egy kötött formátumú rekordot
beolvasni, vagy csak simán meg kell spórolni pár bájtot.
Ekkor utasítod a fordítót, hogy ne rakjon be kitöltő bájtokat.
Megjegyzés: ezért is javasolt a sizeof() használata mindig.

Szabolcs
2016.02.03. 14:24 ezt írta ("elight" <elight at gmail.hu>):

> Szia
>
> Elöljáróban,
>   ennek még nem néztem utána
> de GCC nél nekem is már bökte a listában a szemem
>
> __attribute__((packed))
>
> ez alatt pontosan mit is kellene értenem,
> hogyan is működik? Vagyis mikor illik használni?
>
> Üdv István
>
>
>
> 2016-02-03 14:19 keltezéssel, Moravcsik Szilard írta:
> > 2016.02.03. 13:26 keltezéssel, uprogc . írta:
> >> Sziasztok,
> >>
> >> ( STM32, gcc )
> >>
> >> Van egy strukturam, amelyben van egy 32 bites es ket 8 bites valtozo.
> >> Ennek a merete 6 byte.
> >>
> >> Ha memset() eseten a struktura meretet sizeof(tipus)-al megadom, akkor
> >> rendben van, ha viszont konstans 6 ertekkel adom meg a meretet, akkor az
> >> elso byteot nem allitja be a memset :)
> >>
> >> Ez mi ?
> >>
> > Sziasztok!
> >
> > Érdekelt, kipróbáltam (EmBlocks bare-metal-gcc), amíg a friss kávémat
> > kortyolgattam:
> >
> > /* A struktúrám típusa: */
> > typedef struct{
> >     uint32_t tag32;
> >     uint8_t tag8_1;
> >     uint8_t tag8_2;
> > } __attribute__((packed)) TEST_t;
> >
> > /* A kód: */
> > int main(void){
> > TEST_t test;
> > uint8_t len;
> >
> >     len = sizeof(TEST_t);     /* 6 byte lett a pakolás után */
> >
> >     memset(&test, 0, 6);
> >
> >     test.tag32  = 0x12345678;
> >     test.tag8_1 = 0x55;
> >     test.tag8_2 = 0xAA;
> >
> >     memset(&test, 0xFF, 6);
> >
> >     return 0;
> > }
> >
> > Nálam rendben megcsinálta azt, amit vártam tőle. Először memset()-tel
> > feltöltöttem 0-kkal, azután egyenként értékekkel, a végén meg
> > memset()-tel az egészet 0xFF-fel.
> >
> > Persze az __attribute__((packed)) attribútum nélkül 8 byte méretű lett
> > volna.
> >
> > Üdv:
> > Szilárd
> >
> >
> >
> > ---
> > A levél vírus, és rosszindulatú kód mentes, mert az avast! Antivirus
> védelme ellenőrizte azt.
> > https://www.avast.com/antivirus
> >
> > -----------------------------------------
> >            elektro[-flame|-etc]
> >
>
> -----------------------------------------
>           elektro[-flame|-etc]
>


More information about the Elektro mailing list