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: 3694
Registrován: 19 zář 2007, 02: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: 3296
Registrován: 20 zář 2014, 02: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: 3296
Registrován: 20 zář 2014, 02: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: 1076
Registrován: 28 črc 2009, 02: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ů“