[elektro] C - memset
hg12345
hg12345 at freemail.hu
Sat Feb 13 16:50:27 CET 2016
Hi,
ezt irkáltuk ez előtt!
Ha nem utasítod másra a fordítót, akkor az ARM esetén minden "int" tárolási méretnél kisebb tárolási méretű változót "int" méretben tárolja! Ha a változó elé beteszed a __packed módosítót, akkor szorosan tárolási méret szerint fogja elhelyezni a memóriában. Ez esetben is érdemes a kisebb tárolási méretű változókat egymás mellé helyezni (sorban egymás után), mert lassítja a load/store, ha nem "regiszter méret"-re van igazítva változó elhelyezése. ((( Igazából a strukturában teljesen mindegy hogy hol helyezed el az adott tagot... )))
#define PACKED //ahogy az adott fordító esetén kell definiálni
pl.:
typedef struct {
uint32_t a0;
int32_t a1;
uint64_t a2; ///mivel ez a többszöröse az alap tárolási méretnek így ezzel nem lehet problémád...
PACKED uint16_t a3;
PACKED int8_t a4;
PACKED uint8_t a5;
int a6;
} proba_t
Ezzel az elhelyezéssel 16+8+8 bit = 32bit vagyis az utána jövők is DWORD lesznek illesztve.
-----------------------------------------------------------
Van még egy megoldás, hogy tömören tároljad a alapegységnél kisebb méretet, ez a bitszelet struktura...
strutc {
unsigned int a3:8; //ugyanazt adja mint fent, de packed nélkül.
int a4:8;
unsigned int a5:16;
}
Ezt a struct- akár melyik struktba beágyazhatod, így, fontos a fordítóban engedélyezni kell az unnamed struct/union-t amúgy hibával megáll. Ez általával #pragma-val megadható. Ha nem akarsz vagy nem tudod beállítani, akkor ennek a struct-nak is nevet kell adni, így egy kicsit hosszabb lesz a hivatkozás.
------------------------------------------------------------------
Amúgy nem értem a problémádat, mivel az írás az EEPROM-ban write bufferen keresztűl történik, ennek mérete általában 2 egész számú hatványa ami a E2PROM méretétől függ, vagyis ha van elegendő memória akkor az E2PROM tárolást is a buffer kezdetére érdemes illeszteni, így jobban kihasználható az "endurance"
mert egy buffer méretet egyszerre ír és az egy írásnak és törlésnek számít.
Egy 32K EEPROM-ban általában 64bytes ez a buffer, így teljesen mindegy 51 vagy 64 byte-ot írsz ki.
A fenti megoldás sokkal jobban jársz, ha a EEPROM-t nem közvetlenül éred el a programból, hanem egy írási buffer méretre igazított 2 vagy 4 utas asszociativ CACHE-n keresztül, ez esetben semmi sem számít! Mert a CACHE program mindent megcsinál, az olvasások sokkal gyorsabbak, az írás meg optimalizálható, csak akkor írsz, ha tényleg változott a tárolandó byte. Ez kb. ugyanannyi utasítás mint a közvetlen kezelés, illetve két dologgal több CACHE FLUSH amit leállításkor kell megcsinálni (de ez is a csak az írás többszöri meghívása, illetve az öregedéssel járó CACHE buffer felszabadítás.
"uprogc ." <uprogc at gmail.com> írta:
>Mostmar tudom,...memsetnel sizeof-ot kell hasznalni. Erdekes ez. Mert pl ha
>at akarod a struktura tartalmat byteonkent (pl. i2c eepromba) masolni,
>akkor 50 byteot masolsz at vagy sizeof (struktura) byteot ?:)
>
>2016-02-13 12:18 GMT+02:00 SZIGETI Szabolcs <szigiszabolcs at gmail.com>:
>
>> Hali!
>>
>> Ez így normális. Pl. A receiveDelay1előtt valószínűleg van kitöltés, hogy 4
>> bájt határra essen és 32 bites adatbusszal egy ciklus alatt lehessen
>> kezelni. Az is lehet, hogy a tagok sorrendjének átrenezésével (végén
>> legyenek a páratlan számú 8 bites adatok) változni fog a méret. Stb.
>>
>> Szabolcs
>> 2016.02.12. 14:21 ezt írta ("uprogc ." <uprogc at gmail.com>):
>>
>> Sziasztok.
>>
>> Ez bizony nem 50 byte sizeof-fal. GCC, PCn.
>>
>> typedef struct _FN_SaveToRTC_RAM_t {
>> int8_t link_addr_datarate;
>> int8_t link_addr_txpower;
>> uint16_t link_addr_chmask;
>> uint8_t link_addr_nbRep;
>> int8_t rx2Channel_DR ;
>> uint32_t rx2Channel_Freq ;
>> int8_t rx1DrOffset;
>> uint32_t receiveDelay1;
>> uint32_t receiveDelay2;
>> uint32_t chParam_freq;
>> int8_t chParam_drRange_value;
>> uint32_t w1_bandwidth;
>> bool w1_cont;
>> uint32_t w2_bandwidth;
>> bool w2_cont;
>> uint32_t DownLinkCounter;
>> uint32_t UpLinkCounter;
>> uint32_t RxWindow1Delay;
>> uint32_t RxWindow2Delay;
>> }FN_SaveToRTC_RAM_t;
>>
>> Udv.
>> Szabi
>> -----------------------------------------
>> elektro[-flame|-etc]
>> -----------------------------------------
>> elektro[-flame|-etc]
>>
>-----------------------------------------
> elektro[-flame|-etc]
More information about the Elektro
mailing list