Hallo Ich habe folgende Merkwürdigkeit festgestellt: Habe einen INT0 Interrupt in C18 programmiert. Läuft alles perfekt. Da C kein "rlcf" kann, habe ich eine Funktion in MPASM geschrieben in einem anderen Projekt, um mir eine ASM Library aufzubauen, die ich bei Bedarf dazulinke. Dort wird eine asmlib.o Datei erzeugt. Wenn ich jetzt diese externe Funktion aus asmlib.o dazulinke, läuft der INT0 nicht mehr richtig. Da werden teilweise Flanken nicht erkannt oder das Timing stimmt nicht mehr. Hatte eigentlich erwartet, daß hier der optimale Assemblercode eingelinkt wird, und es eigentlic sogar noch schneller laufen müßte. Bei Inlineassembler soll ja der C-Code nicht mehr optimiert werden. Das habe ich irgenwo gelesen. Daher auch die asmlib.o, um das zu umgehen. Kann mir jemand das Phänomen erklären? Gruß Thomas
Hi Thomas, es kann schon sein das dein Int0 nicht mehr läuft, da mit C der entstehende Code schnell sehr groß werden kann. Bei schnellen Timings solltest du dich an Assembler orientieren. Man kann auch Assembler in C einbinden, wobei du die Datentypgröße beachten musst, weil Assembler Befehle sich nur auf 8-Bit Register beziehen. _asm rlcf Register..... _endasm funktioniert nicht? oder: char Register; char Temp; Temp=Regsiter&0b10000000; Temp>>8; Register<<1; Regsiter=Regsiter|Temp; Gruß
Haeh???? Ich HABE die INT0 Routine in Assembler programmiert... Und das wird dann vom Linker als externe Procedure dazugelinkt. Wie gesagt, in C läuft alles perfekt. Wenn ich es als Assemblercode dazulinke, gibt es Probleme. Den Inline Assembler habe ich absichtlich NICHT verwendet, da dann die Code Optimierung in C angeblich nicht optimal arbeitet. Muß ich wohl mal bei Microchip direkt nachfragen, wie sowas möglich ist. Gruß Thomas
Thomas W. schrieb: > Da C kein "rlcf" kann, Wozu brauchst Du denn genau diesen Befehl? In C kann man doch auch schieben ("<<" bzw. ">>"). Peter
Ich muß das MIT CARRY Flag schieben. Habe ich aber jetzt in C manuell gelöst. Wolte aber eigentlich dann alles in Assembler im INT0 machen, da ich auch dachte, das das dann schneller läuft, also weniger unnützer Code, aber klappt scheinbar nicht. Gruß Thomas
Bindet direkt Assembler in den C-Code ein, ohne externe Prozedur: _asm rlcf Register..... _endasm Funktion für das Linksschieben mit retten des herausgeschobenen Bits, geschrieben in C-Code: char Register; char Temp; Temp=Regsiter&0b10000000; Temp>>8; Register<<1; Regsiter=Regsiter|Temp;
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.