Op 5 april 2016 23:44:26 schreef henri62:
[...] Dat is niet helemaal waar, de notatie %0 %1 etc. wordt gebruikt als placeholder voor tijdelijke registers. Ik moet elke keer in het Gcc manual gaan zoeken hoe dat ook alweer in elkaar zit.
Ook het save/restoren van registers met inline code kan op sommige processoren nog wel wat verassingen opleveren (of extra code opleveren die je niet verwacht).
Ja, je hebt gelijk. Maar als je geen %1 dingen gebruikt gaat het gewoon letterlijk naar de assembler.
Terug ga je met een 'reti' instructie.
Nee, zo bedoel ik het niet. De assembler is vrolijk jou "main.c" aan het assembleren, terwijl jij eeneens "org 4" roept. Dan moet de uitvoor ineens naar absolute locatie 4, en na de OUT en de jump wil je dat de assembler weer gewoon output maakt voor wat "normaal" in main thuishoort.
@Archer: Bij het stukje code wat door rew gequote is als voorbeeld is natuurlijk r3 compleet undefined dus dat is niet af natuurlijk voor het geval iemand dat nog niet begrepen had.
Volgens mij is het de bedoeling om bepaalde variabelen ALTIJD in registers te houden.
Ik betwijfel of je dat voldoende duidelijk hebt gemaakt naar de compiler.
Een hint dat dit niet het geval is, heb je uit het feit dat er ergens een library staat die vorig jaar gecompileerd is en vrolijk R3 kan gaan gebruiken. Die code kan niet weten dat r3 nu speciaal voor de interrupt gereserveerd is.
Normaliter schrijf je code gewoon in C. Als je dan zo nu en dan wat assembly nodig hebt, gebruik je zo'n "asm" statement.
Als je zo ver wilt gaan als hier, dan ben je eigenlijk in assembly aan het schrijven, en voor het gemak schrijf je kleine stukken toch maar in C. Als een hogere-taal-tool dan in de weg gaat zitten doe je hem weg.
Het zou mij inderdaad niet verbazen als het niet werkt niet omdat de timing een paar ns fout is maar omdat de boel nog niet goed in mekaar zit. Dus dat de register waardes/reserveringen niet goed zijn.