Forum: Mikrocontroller und Digitale Elektronik PIC C18 Laufzeitprobelme beu dazugelinktem Assemblercode


von Thomas W. (thomas0906)


Lesenswert?

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

von Spike H. (-rox-)


Lesenswert?

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ß

von Thomas W. (thomas0906)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Thomas W. schrieb:
> Da C kein "rlcf" kann,

Wozu brauchst Du denn genau diesen Befehl?

In C kann man doch auch schieben ("<<" bzw. ">>").


Peter

von Thomas W. (thomas0906)


Lesenswert?

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

von Spike H. (-rox-)


Lesenswert?

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
Noch kein Account? Hier anmelden.