Forum: Mikrocontroller und Digitale Elektronik IAR Library Funktionen in C zugänglich machen


von fmcbm (Gast)


Lesenswert?

Hallo zusammen,

ich versuche mit dem IAR 8051 im C-Programm Funktionen eines 
vorkompilierten Bootloaders zu verwenden. Das ganze ist mit Keil kein 
Problem, da habe ich ein laufendes Beispiel. Ich bin aber leider 
gezwungen den IAR zu verwenden und da bekomme ich es nicht hin.

Im Keil-Projekt findet sich folgender Code im Startup-Script(Auszug):
;----------------------------------------------------------------------- 
-------
; The following define the entry points of the Bootloader functions
; and is used by the app to call the bootloader

PUBLIC   BOOTLOAD_REQ
PUBLIC   _BLOCK_WRITE
PUBLIC   _BLOCK_READ
PUBLIC   USB_SUSPEND
PUBLIC   USB_DISABLE
PUBLIC   USB_INT_ENABLE
PUBLIC   GET_INTERRUPT_SOURCE
PUBLIC   USB_INT_DISABLE
PUBLIC   USB_BL_USB_DESCRIPTOR
PUBLIC   _USB_INIT
PUBLIC   USB_CLOCK_START
PUBLIC   USB_GET_LIBRARY_VERSION

BOOTLOAD_REQ   EQU   0FFFFh
_BLOCK_WRITE   EQU   041Ah
_BLOCK_READ   EQU   05F8h
USB_SUSPEND   EQU   07CCh
USB_DISABLE   EQU   09CFh
USB_INT_ENABLE   EQU   0A53h
GET_INTERRUPT_SOURCE   EQU   0A80h
USB_INT_DISABLE   EQU   0A8Eh
USB_BL_USB_DESCRIPTOR   EQU   0A96h
_USB_INIT   EQU   0FA00h
USB_CLOCK_START   EQU   0FB37h
USB_GET_LIBRARY_VERSION   EQU   0FB7Bh


Die dazugehörige Headerdatei(Auszug) schaut so aus:

void USB_Clock_Start(void) large;
void USB_Init(UINT,UINT,BYTE*,BYTE*,BYTE*,BYTE,BYTE,UINT) large;
UINT Block_Write(BYTE*, UINT);
BYTE Block_Read(BYTE*, BYTE) large;
BYTE Get_Interrupt_Source(void) large;
void USB_Int_Enable(void) large;
void USB_Int_Disable(void) large;
void USB_Disable(void) large;
void USB_Suspend(void) large;
UINT USB_Get_Library_Version(void) large;

INTERRUPT_PROTO(USBXcore_USB_ISR, INTERRUPT_USB0);

Was ich nicht verstehe ist, warum die Funktionsnamen nicht wirklich 
übereinstimmen (Groß/Klein und Unterstriche) aber das ganze trotzdem 
unter Keil funktioniert.

Übertrage ich den Assembler-Code in die cstartup.s51 für den IAR, so 
meckert er schon mal wegen der unterschiedlichen Schreibweisen. Wenn ich 
die Funktionsnamen anpasse kommt dann immernoch folgende Warnung:

Warning[w46]: External function "Block_Read" in module Interrupts has no 
global definition
...

Kompilieren tut er, aber funktionieren tut das Programm leider nicht. 
Die Funktionen werden also vermutlich nie richtig aufgerufen.

Ist die cstartup.s51 überhaupt die richtige Stelle dafür, bzw. wo genau 
in diesem file muss ich die Definitionen einfügen? Hat jemand einen Rat 
für mich, ich bin noch relativ neu in Sachen Assembler und Compiler.

von Thomas (Gast)


Lesenswert?

zur Namensgebung:
das Startup File ist ein Assembler File da spielt Groß Kleischrift
keine Rolle. Der Unterstrich kommt immer dann hinzu, wenn eine
C Funktion Parameter hat (nicht Rückgabewert)
Das Ganze ist zum einen die Keil Namenskonventionen wie Keil das
Interface zwischen C und ASM handhabt, zum andern ist das historisch
bedingt. In der ursprünglich verwendeten OMF51 Spec von Intel war
das so spezifiziert.

Wie das bei IAR aussieht, mußt du dort nachlesen, da kenne ich mich
nicht aus

Thomas

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.