C - offset položky ve struktuře

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#46 Příspěvek od mtajovsky »

Longin píše:taky bych chtěl takhle rozumět embedded věcem jako lesana
To není o rozumění embedded, to je o rozumění operačním systémům.

Mimochodem, lesana87, jak tam řešíte situaci, kdy v době zpracování volání systému z úrovně úlohy přijde interrupt, a v jeho obsluze je potřeba opět volat systémovou službu? Jinak - fakt, pěkné.
Uživatelský avatar
lesana87
Příspěvky: 4397
Registrován: 20 zář 2014, 00:00

#47 Příspěvek od lesana87 »

Z obsluhy přerušení se žádné systémové služby nevolají, myšleno ty, které se dají volat z user modu.
Uživatelský avatar
lesana87
Příspěvky: 4397
Registrován: 20 zář 2014, 00:00

#48 Příspěvek od lesana87 »

Mimochodem, když jsem upravovala ten editor ue, objevila jsem po x hodninách neúspěšného ladění moc veselý bug v SDCC 3.6.0.
Podmínku

Kód: Vybrat vše

   if (buf < curp)
      --curp;

přeloží jako

Kód: Vybrat vše

;ue.c:218: if (buf < curp)
   ld   iy,#_curp
   ld   a,0 (iy)
   sub   a, #<(_buf)
   ld   a,1 (iy)
   sbc   a, #>(_buf)
   ret   NC
;ue.c:219: --curp;
   ld   hl,(_curp)
   dec   hl
   ld   (_curp),hl
   ret

tj. obráceně - chybně.
Tu samou podmínku jen napsanou v opačném pořadí

Kód: Vybrat vše

   if (curp > buf)
      --curp;

přeloží jako

Kód: Vybrat vše

;ue.c:218: if (curp > buf)
   ld   a,#<(_buf)
   ld   iy,#_curp
   sub   a, 0 (iy)
   ld   a,#>(_buf)
   sbc   a, 1 (iy)
   ret   NC
;ue.c:219: --curp;
   ld   hl,(_curp)
   dec   hl
   ld   (_curp),hl
   ret

tj. správně. Už jsem si skoro rvala vlasy, proč to nechodí, když mě napadlo, projít instrukci po instrukci výsledný kód v asm. Fakt hrozně milej překladač. :? :(
Wolfik
Příspěvky: 1079
Registrován: 28 črc 2009, 00:00

#49 Příspěvek od Wolfik »

Na něčem podobném jsem vyhnil u diplomky (ARM GCCčko), kdy mi taky obdobnou podmínku přeložil do asembleru blbě, takže pointer do paměti mi přepisoval oblast, kde neměl vůbec co dělat. :D

Pár týdnů zpátky mě zas vyplísnil toolchain pro softprocesor ve FPGAčku. Ve vývojové fázi používám standartní i/o funkce C pro výpis debugovacích logů. Při nějaké konstelaci hvězd, tam docházelo k memory corruption, protože to interně používalo dynamickou zprávu paměti, která na těhle zařízeních není od výrobce dokonale vyladěna. Zkrátka to zapisovala data tam, kam nemá.
Avšak v dokumentaci k toolchainu se o tom nezmiňují...tam to zní jakože pokud chce programátor plnou funkčnost printf/scanf funkcí, tak použije ANSI verzi, pokud chce šetřit prostředkama, použije jejich osekanou verzi, která podle disassembly už malloc nepoužívá :D
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“