Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

C - offset položky ve struktuře
Jdi na stránku 1, 2, 3, 4  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
lesana87



Založen: Sep 20, 2014
Příspěvky: 3329

PříspěvekZaslal: so srpen 06 2016, 7:58    Předmět: C - offset položky ve struktuře Citovat

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:
kód:
__asm
   ....
   xor A
   ....
   ld IX,(#_current)

   ld L,A
   ld H,A
   add HL,SP      ; HL = puvodni SP
   ld _tstack(IX),L   ; Ulozi do current.tstack
   ld _tstack+1(IX),H
   ....
__endasm

kde current je pointer na strukturu task_struct.
S tím _tstack to nefunguje, to linker zahlásí neznámý symbol. Sad
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. Confused
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. Sad
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
berk



Založen: Feb 07, 2014
Příspěvky: 107

PříspěvekZaslal: so srpen 06 2016, 9:21    Předmět: Citovat

citace:
Zkrátka aby to bylo přenositelné, když už se patlám s tím C.


Aby to bylo přenositelné, tak bych se vyhnul tomu inline assembleru. Co je vlastně důvodem, že ho tam máš?


Makro je kus c-čka, které preprocessor rozbalí - to ten assembler asi nedá.

Já bych si na tu položku tstack udělal pointer a ten pak použil v tom assembleru.

Nebo

Pointer na tstack mínus pointer na strukturu je ten offset.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3329

PříspěvekZaslal: so srpen 06 2016, 10:47    Předmět: Citovat

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. Sad
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
hakamusai



Založen: Apr 17, 2007
Příspěvky: 943

PříspěvekZaslal: so srpen 06 2016, 11:22    Předmět: Citovat

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 ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: so srpen 06 2016, 11:35    Předmět: Citovat

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.
kód:

129 ;   src/helloworld.c:18: i = offsetof(struct task_struct,  signal);
      000000 7F 06            [12]  130    mov   r7,#0x06
kód:

// file helloworld.c

#include <stddef.h>

struct task_struct
{
  signed char state;
  signed char counter;
  char priority;
  void * tstack;   /* task stack */
  int signal;
};

void main()
{
  char i;
  // test vestavene funkce offsetof
  i = offsetof(struct task_struct,  signal);
  do
  {
  }
  while(--i);
 
  while(1);
}
//EOF
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3329

PříspěvekZaslal: so srpen 06 2016, 11:43    Předmět: Citovat

hakamusai napsal(a):
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í.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3329

PříspěvekZaslal: so srpen 06 2016, 11:49    Předmět: Citovat

frpr666 napsal(a):
Já nevím, že všichni chtějí furt dokola kódovat v assembleru.

Tak mi prosím ukaž, jak v C napíšeš tohle:
kód:
void switch_to(void * new) __z88dk_fastcall __naked
{
   new;
__asm
   push AF
   push BC

   ld BC,(#_current)
   xor A
   sbc HL,BC
   jr z,00004$      ; new == current, neni co prepnout

   add HL,BC      ; Vrati HL

   push DE
   push IX
   push IY

   ld IX,(#_current)
   ld (#_current),HL
   push HL
   pop IY

   ld L,A
   ld H,A
   add HL,SP      ; HL = puvodni SP
   ld TSTACK(IX),L      ; Ulozi do current.tstack
   ld TSTACK+1(IX),H

   ld L,TSTACK(IY)
   ld H,TSTACK+1(IY)   ; HL = new.tstack

   ld SP,HL
   pop IY
   pop IX
   pop DE

00004$:   pop BC
   pop AF
   ret
__endasm;
}

Confused
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: so srpen 06 2016, 12:07    Předmět: Citovat

@Lesana Co to je, o jakém uprocesoru se tady bavíme?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3329

PříspěvekZaslal: so srpen 06 2016, 12:17    Předmět: Citovat

Operační systém pro Z80.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3329

PříspěvekZaslal: so srpen 06 2016, 12:36    Předmět: Citovat

Ano, SDCC zná offsetof(), psala jsem o tom hned v prvním příspěvku, že nevím, jak to dostat do toho assembleru.
Proč by nemohla Z80 multitaskovat?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: so srpen 06 2016, 12:37    Předmět: Citovat

Není Z80 už tak trochu Retro? Kdo to vůbec vyrábí. Na jakém chipu to programuješ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
berk



Založen: Feb 07, 2014
Příspěvky: 107

PříspěvekZaslal: so srpen 06 2016, 12:43    Předmět: Citovat

citace:
Operační systém pro Z80.


Něco jako FUZIX?
https://plus.google.com/+AlanCoxLinux/posts/a2jAP7Pz1gj
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3329

PříspěvekZaslal: so srpen 06 2016, 12:50    Předmět: Citovat

Retro je nějak zakázaný? Programuju to na PCčku, (po)běží to na Zilog Z84C0010 s externí MMU. Snažím se portovat Linux 0.12, ten je taky retro.

Ale šlo mi o ten offset a jak ho dostat do inline assembleru, nechci tu řešit co je nebo není retro. Sad
Asi to holt pořeším jako Torvalds hláškama:
kód:
/* these are hardcoded - don't touch */
/* these are not to be changed without changing head.s etc */
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: so srpen 06 2016, 13:17    Předmět: Citovat

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?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3329

PříspěvekZaslal: so srpen 06 2016, 13:30    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2, 3, 4  Další
Strana 1 z 4

 
Přejdi na:  
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

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

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.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.15 sekund