[elektro] C - memset
elight
elight at gmail.hu
Wed Feb 3 14:43:02 CET 2016
Köszi,
Csak az okokat kerestem
..szóval történelmi oka van..
Tehát mindig az alapértelmezett a gyártó szerinti,
és ahogy ettől függetlenül használom
azt kell időnként beállítani.
Így már értem, miért van tele az a progam ilyesmivel,
amit nézegettem. :-)
Üdv István
2016-02-03 14:35 keltezéssel, SZIGETI Szabolcs írta:
> 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]
>>
> -----------------------------------------
> elektro[-flame|-etc]
More information about the Elektro
mailing list