PIC C18 Laufzeitprobelme beu dazugelinktem Assemblercode

OP #2272197
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
#2279968
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ß
OP #2280070
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
#2280488
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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren