Blackfin 592 Interrupts

Gast #2536898
Lesenswert?

Hallo zusammen DSPler,

hab hier ein Projekt was mit VisualDSP++ erstellt wurde, nun versuche 
ich dieses Projekt auf die GNU Toolchain zu portieren und stoße auf 
einige Fehler. In dem Projekt werden einige Interrupt Quellen definiert.
1
register_handler(ik_ivg9, Sport0_RX_ISR);
2
register_handler(ik_ivg11, Switch_ISR);
3
register_handler(ik_ivg12, Timer_ISR);

Eigentlich klappt alles nur bei den drei Funktionen verschluckt sich der 
Compiler und liefert diese Fehlermeldung.
1
/tmp/cclM2Efk.o: In function `_Init_Interrupts':
2
Audio Talkthrough.c:(.text+0x396): undefined reference to `_register_handler'
3
Audio Talkthrough.c:(.text+0x3a4): undefined reference to `_register_handler'
4
Audio Talkthrough.c:(.text+0x3b2): undefined reference to `_register_handler'
5
collect2: ld gab 1 als Ende-Status zurück

Das ganze compiliere ich mit "bfin-elf-gcc -mcpu=bf592" und inkludiere 
auch die exception.h in der die Definition der register_handler 
enthalten ist. Kennt irgend einer eine Lösung für das Problem oder wie 
löst ihr das Thema Interrupts in euren Projekten, über jegliche 
Denkanstöße und Hilfe würde ich mich freuen.

mfg

Serg
Gast #2541485
Lesenswert?

Hallo Strubi,

sorry hat es was länger gedauert. Bin leider etwas unbedarft in dem 
Thema Blackfin und Interrupts (GNU Toolchain) habe erst angefangen, bin 
aber begierig dazu zu lernen. Könntest du mir ein paar Tips geben wie 
ich konkrett vorgehen soll.

gruß

Serg
#2545010
Lesenswert?

Hi Serg,

hast Du dir mal die Hardware-Referenz angeschaut?
Die Interrupt-Moeglichkeiten sind beim Blackfin recht komplex.
Gibt ja den System Interrupt Controller (SIC), der periphere Ereignisse 
auswertet, diese wiederum werden den einzelnen Kanaelen zugeordnet 
(siehe SIC_IARx register).
Die Funktionen in irq.c machen das soweit alles für verschiedene 
Blackfin-Derivate, der 592 fehlt nur noch.
Ob ein Interrupt geklingelt hat, kann man ja immer prima per Monitoring 
der *IPEND register ermitteln, oder Breakpoint auf IRQ-Handler setzen. 
Die eigentlichen Handler sitzen in irqhandler.asm. Leider ist das 
'interrupt'-Attribut in einigen Releases des C-Compiler 'kaputt', drum 
empfiehlt es sich, die Handler in Assembler zu schreiben.

Grüsse,

- Strubi

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