Zaslal: so srpen 06 2016, 7:58 Předmět: C - offset položky ve struktuře
Zdravím Bastlírnu.
Při pokusech s programováním v C jsem narazila na problém. Mám strukturu a potřebovala bych znát offset některé položky v té struktuře, tak abych ten offset mohla použít v inline assembleru. Překladač mám SDCC.
Struktura vypadá nějak takhle:
kód:
struct task_struct {
signed char state;
signed char counter;
char priority;
void * tstack; /* task stack */
int signal;
....
};
A já potřebuju offset položky tstack, abych se na ni mohla odkázat v:
kde current je pointer na strukturu task_struct.
S tím _tstack to nefunguje, to linker zahlásí neznámý symbol.
Mohla bych to tam napsat na tvrdo, že to je 3, ale jde mi o to, aby to fungovalo, i když tu strukturu pozměním nebo když změním překladač a ten tu strukturu jinak zapakuje. Zkrátka aby to bylo přenositelné, když už se patlám s tím C.
Poradí prosím někdo, jak to udělat?
Edit: Našla jsem makro offsetof(s, m), ale nevím, jak ho s tím inline assemblerem použít.
Inline assembler tam mám proto, že potřebuju udělat něco, co to Cčko nedá. Konkrétně přepnout task a s ním i zásobník.
Hraní s pointerama je fajn, ale já potřebuju symbolickou konstantu, kterou mi ten assembler vezme. Takže třeba
kód:
#define TSTACK 3
je OK, ale jak tam nacpu nějaké pointery, už to nefunguje.
Já nevím, že všichni chtějí furt dokola kódovat v assembleru.
Podle mě je offsetof() vestavěná funkce podobně jako sizeof()
Pokud vezmu příklad shora, potom offsetof() použiju v programu a potom se podívám do výpisu .lst, tak by to mělo fungovat dle očekávání. "offsetof" člena struktury "signal" vrací 0x06.
ten tstack (void * tstack; /* task stack */) je pointer na nějakou další strukturu ? nešlo by to do inline zapsat jako standard v cečku ?
tstack je (jak je uvedeno) ukazatel na zásobník tasku.
Nevím, co je myšleno tím "inline standard v Cčku", je to zapsané jako inline v Cčku, jestli myslíš inline s parametrama jako je v GCC, tak to v SDCC není.
No dobrá, nemusíme říkat nahlas slovo Retro. Můžeme říct třeba Vintage.
A to jako opravdu na 8 bit. procesoru poběží operační systém Linux a bude něco dělat?
Kolik máš k dispozici RAM a FLASH ROM?
Nevím, jestli poběží, snažím se.
Prozatím si vystačím se 128KB RAM a 32KB ROM, ale fyzický adresní prostor je 1MB. Každý task má k dispozici 64KB logický adresní prostor, ten je daný tou Z80kou.
Místo zatím problém není, problém je, že SDCC nemá ten inline assembler s parametrama jako má GCC a tak to musím všelijak obcházet.
Časy uváděny v GMT + 1 hodina Jdi na stránku 1, 2, 3, 4Další
Strana 1 z 4
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.