[elektro] C - memset
Moravcsik Szilard
levlista.mszilard at gmail.com
Wed Feb 3 15:20:14 CET 2016
Kb. erről írtál jan. 26-án:
"/.../ sok múlik a változók illesztésen, ha nem állítsz be mást akkor
ALIGN 4 illesztéssel dolgozik, és minden változó még char is regiszter
méreten tárolódik. Vagyis, a konstansok és konstanssal feltöltött
változók is akár 4x helyet igényelhetnek. Kivétel ez alól a tömb. Ha
tömörségre kell menni akkor érdemes ahol lehet kisebb illesztéssel
dolgozni ALIGN 2 vagy __packed elő/utó tagot használni.
"
Akkor pont az ARM Cortex-M0 memória kapacitásról volt szó.
Megjegyzem, az FTDI FT8xx display vezérlő IC is pont ALIGN4-et használ
mindenhol, kötelező érvénnyel. Az elején jól meg is szívtam, ha nem
megfelelő címen kezdtem el beírni a display utasításokat. Rejtélyes
képernyő zavarok léptek elő, a hajam meg szálanként őszült, mert egy
darabig el sem tudtam képzelni, mi a bánat lehet a gond... :)
Üdv:
Szilárd
2016.02.03. 14:51 keltezéssel, hg12345 írta:
> Hi,
> csak annyit jelent, hogy szorosan pakolja a változókat.
>
> Normál esetben regiszter határra teszi a változókat, ez egy 32 bites eszköznél 4 byte (align 4),így gyorsabb a beolvasás, és nem kell beolvasáskor előjel kiterjesztést csinálni, vagyis gyorsabb a program futása.
>
> PACKED esetén pontosan egymás után szorosan, helyezi el a memóriában a változót, de ez esetben felhasználáskor (mem->reg) esetén ki egészíti 32 bitre, előjel szerint vagy nullával tölti unsigned esetben. Ugyan erre van speciális beolvasó és kiíró parancs ARM M6V és M7V utasítás készletben de még így is lassabb a futási ideje.
>
> Használat?! Gyakorlat teszi a mestert.
>
> Ha nagy struktrurákkal vagy struktura tömbökkel dolgozol ilyen esetben elég jelentős memória területet lehet felszabadítani jól irányzott __packed-vel.
>
> pl.:
>
> typedef struct { int32_t counter ;
> uint8_t semafor; } proba_t ;
>
> proba_t parray[1000];
>
> a fenti esetben proba_t 8 byte-nyi helyet foglal, és a teljes tömb 8000byte lesz.
>
> ha kicseréled __packed uin8_t a definíciót akkor ez egyből csak 5000byte lesz.
>
> Amúgy nem biztos hogy C szintem ezeket az értékeket kapod, de fordítás esetén a memória foglalásban látszik, &parray[999]-parray két pointer különbsége már tényleg a valós méretet adja.
>
> Továbbiakban ha változóid inicializáláskor értéket kapnak, akkor nem csak RAM-ban spórolsz, hanem kisebb lesz az inicializálás terület nagysága a FLASH-ben is. A ZERO inicializálásnál ez nem számít.
>
>
>
>
> elight <elight at gmail.hu> írta:
>> 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]
>
---
A levél vírus, és rosszindulatú kód mentes, mert az avast! Antivirus védelme ellenőrizte azt.
https://www.avast.com/antivirus
More information about the Elektro
mailing list