RE: C: XC8 velikost objektu při překladu.
Miroslav Draxal
evik na volny.cz
Středa Leden 29 13:57:34 CET 2025
Při překladu programu mohu nasypat do eeprom hodnoty.
__EEPROM_DATA(0, 0, 0, 0, 0, 0, 0, 0);
První použití to nasype od 0x0000 v eeprom, v délce 8 bytů.
Pak další
__EEPROM_DATA(0, 0, 0, 0, 0, 0, 0, 0);
To uloží od 0x0008 v délce 8 bytů atd.
Uložené struktury mám v EEPROM, pak je vyčítám do RAm.
Tam pak s nimi pracuji a na pozadí se projíždí jestli se něco někde změnilo v ram, tak pak se to uloží do EEPROM.
Jedna struktura mi přetekla přes délku EEPROM do druhé a to byl problém. Stálé zápisy do EEPROM atd.
Také si hlídám opakované zápisy do stejné adresy eeprom. Proto jsem to zjistil, protože to na mě začalo řvát, že je něco špatně.
Takže to teď hlídám nějak takhle (asi by musel být vidět celý projekt )
} else if ((NumSave_t) EEpromDirect.SaveObjektRAMToEEprom == NumBazen) {
_Static_assert(sizeof (Bazen.EEprom) <= EEPROM_BAZEN__SIZEOF,
"SizeOF (Bazen.EEprom) > EEPROM_BAZEN__SIZEOF !");
EEprom_WriteObjectSekvence(&EEpromWriteStatus.Bazen, EEPROM_BAZEN__, &Bazen.EEprom, sizeof (Bazen.EEprom));
}
Staré 18fxxxx v XC8 nemají podporu přímou podporu práce s EEPRom. Nové už mám dojem že ano.
Míra
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Pavel Hudeček
Sent: Wednesday, January 29, 2025 10:10 AM
To: hw-list na list.hw.cz
Subject: Re: C: XC8 velikost objektu při překladu.
Nemá XC8 taky nějakou podporu pro práci s EEPROM?
GCC má eeprom.h, pak se dá deklarovat něco jako:
EEMEM sMojeStrukt eMS = {1, 2, "bbb"};
EEMEM uint32_t eCount = 0;
A překladač se postará o správné rozmístění v EEPROM a já si to pak adresuju přes &.
Jestli je to ale externí EEPROM, tak tam jsem zas kdysi použil řetězený definy se sizeof. Vstupem je předchozí adresa a nový objekt, výstupem adresa aktuálního konce. Jen je pak potřeba nezapomenout, že adresa objektu je výstupem předchozího použití definu.
Že to pak překladač může zoptimalizovat na menší jsem neřešil, místa bylo dost, takže nevadilo že se ušetřený místo nepoužilo.
PH
Dne 28.01.2025 v 20:52 Miroslav Draxal napsal(a):
Zdravím ve spolek.
Pro PICaře.
Docela jsem měl problém se zjišťováním, jak veliké budou struktury v době překladu. Pak jsem je ukládal do EEPROM. Pomocí
#define se vybíraly různé konfigurace, dost do toho házeli vidle enum, protože za překladu se předpokládá dvou bitová délka, následně kompilátor to pokud lze seřízne na jeden byt. Samozřejme pokud platí pravidlo hodnoty do 255.
Takže
//----------------------------------------------------------------------------------------------------
// Toto zajistí, že xc8 na to bude na enum přihlížet při překladu rovnou jako na jeden byt.
typedef enum __attribute__((packed)) {
leden = 1,
unor,
brezen,
duben,
kveten,
cerven,
cervenec,
srpen,
zari,
rijen,
listopad,
prosinec
} Mesic_t;
//----------------------------------------------------------------------------------------------------
Totok zase vypíše jako chybové hlášení délku objektu v bytech
// <editor-fold defaultstate="collapsed" desc="Zjistí velikost objektu v době překladu a vypíše jej jako chybové hlášení">
// uint8_t Objekt[20];
# define OBJECT_SIZE(name) \
typedef enum { \
STRUCT_SIZE = sizeof(name) \
}_Size_t; \
_Static_assert(STRUCT_SIZE != 1, "Velikost objektu je 1 byt."); \
_Static_assert(STRUCT_SIZE != 2, "Velikost objektu je 2 byty."); \
_Static_assert(STRUCT_SIZE != 3, "Velikost objektu je 3 byty."); \
_Static_assert(STRUCT_SIZE != 4, "Velikost objektu je 4 byty."); \
_Static_assert(STRUCT_SIZE != 5, "Velikost objektu je 5 bytu."); \
_Static_assert(STRUCT_SIZE != 6, "Velikost objektu je 6 bytu."); \
_Static_assert(STRUCT_SIZE != 7, "Velikost objektu je 7 bytu."); \
_Static_assert(STRUCT_SIZE != 8, "Velikost objektu je 8 bytu."); \
_Static_assert(STRUCT_SIZE != 9, "Velikost objektu je 9 bytu."); \
_Static_assert(STRUCT_SIZE != 10, "Velikost objektu je 10 bytu."); \
_Static_assert(STRUCT_SIZE != 11, "Velikost objektu je 11 bytu."); \
_Static_assert(STRUCT_SIZE != 12, "Velikost objektu je 12 bytu."); \
_Static_assert(STRUCT_SIZE != 13, "Velikost objektu je 13 bytu."); \
_Static_assert(STRUCT_SIZE != 14, "Velikost objektu je 14 bytu."); \
_Static_assert(STRUCT_SIZE != 15, "Velikost objektu je 15 bytu."); \
_Static_assert(STRUCT_SIZE != 16, "Velikost objektu je 16 bytu."); \
_Static_assert(STRUCT_SIZE != 17, "Velikost objektu je 17 bytu."); \
_Static_assert(STRUCT_SIZE != 18, "Velikost objektu je 18 bytu."); \
_Static_assert(STRUCT_SIZE != 19, "Velikost objektu je 19 bytu."); \
_Static_assert(STRUCT_SIZE != 20, "Velikost objektu je 20 bytu."); \
_Static_assert(STRUCT_SIZE != 21, "Velikost objektu je 21 bytu."); \
_Static_assert(STRUCT_SIZE != 22, "Velikost objektu je 22 bytu."); \
_Static_assert(STRUCT_SIZE != 23, "Velikost objektu je 23 bytu."); \
_Static_assert(STRUCT_SIZE != 24, "Velikost objektu je 24 bytu."); \
_Static_assert(STRUCT_SIZE != 25, "Velikost objektu je 25 bytu."); \
_Static_assert(STRUCT_SIZE != 26, "Velikost objektu je 26 bytu."); \
_Static_assert(STRUCT_SIZE != 27, "Velikost objektu je 27 bytu."); \
_Static_assert(STRUCT_SIZE != 28, "Velikost objektu je 28 bytu."); \
_Static_assert(STRUCT_SIZE != 29, "Velikost objektu je 29 bytu."); \
_Static_assert(STRUCT_SIZE != 30, "Velikost objektu je 30 bytu."); \
_Static_assert(STRUCT_SIZE != 31, "Velikost objektu je 31 bytu."); \
_Static_assert(STRUCT_SIZE != 32, "Velikost objektu je 32 bytu."); \
_Static_assert(STRUCT_SIZE != 33, "Velikost objektu je 33 bytu."); \
_Static_assert(STRUCT_SIZE != 34, "Velikost objektu je 34 bytu."); \
_Static_assert(STRUCT_SIZE != 35, "Velikost objektu je 35 bytu."); \
_Static_assert(STRUCT_SIZE != 36, "Velikost objektu je 36 bytu."); \
_Static_assert(STRUCT_SIZE != 37, "Velikost objektu je 37 bytu."); \
_Static_assert(STRUCT_SIZE != 38, "Velikost objektu je 38 bytu."); \
_Static_assert(STRUCT_SIZE != 39, "Velikost objektu je 39 bytu."); \
_Static_assert(STRUCT_SIZE != 40, "Velikost objektu je 40 bytu."); \
_Static_assert(STRUCT_SIZE != 41, "Velikost objektu je 41 bytu."); \
_Static_assert(STRUCT_SIZE != 42, "Velikost objektu je 42 bytu."); \
_Static_assert(STRUCT_SIZE != 43, "Velikost objektu je 43 bytu."); \
_Static_assert(STRUCT_SIZE != 44, "Velikost objektu je 44 bytu."); \
_Static_assert(STRUCT_SIZE != 45, "Velikost objektu je 45 bytu."); \
_Static_assert(STRUCT_SIZE != 46, "Velikost objektu je 46 bytu."); \
_Static_assert(STRUCT_SIZE != 47, "Velikost objektu je 47 bytu."); \
_Static_assert(STRUCT_SIZE != 48, "Velikost objektu je 48 bytu."); \
_Static_assert(STRUCT_SIZE != 49, "Velikost objektu je 49 bytu."); \
_Static_assert(STRUCT_SIZE != 50, "Velikost objektu je 50 bytu."); \
_Static_assert(STRUCT_SIZE != 51, "Velikost objektu je 51 bytu."); \
_Static_assert(STRUCT_SIZE != 52, "Velikost objektu je 52 bytu."); \
_Static_assert(STRUCT_SIZE != 53, "Velikost objektu je 53 bytu."); \
_Static_assert(STRUCT_SIZE != 54, "Velikost objektu je 54 bytu."); \
_Static_assert(STRUCT_SIZE != 55, "Velikost objektu je 55 bytu."); \
_Static_assert(STRUCT_SIZE != 56, "Velikost objektu je 56 bytu."); \
_Static_assert(STRUCT_SIZE != 57, "Velikost objektu je 57 bytu."); \
_Static_assert(STRUCT_SIZE != 58, "Velikost objektu je 58 bytu."); \
_Static_assert(STRUCT_SIZE != 59, "Velikost objektu je 59 bytu."); \
_Static_assert(STRUCT_SIZE != 60, "Velikost objektu je 60 bytu."); \
_Static_assert(STRUCT_SIZE != 61, "Velikost objektu je 61 bytu."); \
_Static_assert(STRUCT_SIZE != 62, "Velikost objektu je 62 bytu."); \
_Static_assert(STRUCT_SIZE != 63, "Velikost objektu je 63 bytu."); \
_Static_assert(STRUCT_SIZE != 64, "Velikost objektu je 64 bytu."); \
_Static_assert(STRUCT_SIZE <= 64, "Velikost objektu je větší než 64 bytu!");
//Použití pro zjištění velikosti objektu v bytech
// OBJECT_SIZE(Objekt);
// </editor-fold>
//--------------------------------------------------------------------------------------------------------
Dost mi to pomohlo v hledání chyby.
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20250129/7e87b026/attachment.htm>
Další informace o konferenci Hw-list