[elektro] C - memset
elight
elight at gmail.hu
Wed Feb 3 15:42:09 CET 2016
Részvétem.
Az FTDI vel nekem is némi honosítási gondjaim akadnak,
esetleg tudsz egy jó (bevált) C++ libet hozzá M4-re Coocox alá?
Persze ami publikus
és csak szigorúan tanulmányozási célzattal! :-)
Valahogy a FTDI-set nem karódzik átbütykölni..
Üdv István
2016-02-03 15:20 keltezéssel, Moravcsik Szilard írta:
> 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
>
> -----------------------------------------
> elektro[-flame|-etc]
>
More information about the Elektro
mailing list