Hallo Forum,
ich hoffe ihr könnt mir weiterhelfen...
Folgendes Problem, ich arbeite an einem vorhandenen Programm für einen
TMS320F2812 weiter. Das Programm besteht aus mehreren Dateien.
Da ich in meiner Interruptroutine eine Switch-case Anweisung hab, muss
ich dieser Funktion eine Variable übergeben, man kann aber einer
Interruptroutine keine Variable übergeben, zumindest nicht im CCS.
Mein erster Versuch war mit einer globalen Variable, mit "extern"
deklariert, aber die Variable wurde nicht richtig von Funktion zu
Funktion übermittelt. Und außerdem ist es ja keine saubere Lösung mit
globalen Variablen zu arbeiten. Kann mir jemand einen Tip geben, wie ich
eine Variable an meine Interruptroutine übergebe, oder was es da sonst
noch für Möglichkeiten gibt.
Vielen Dank schon mal im voraus...
Stefanie
> nur volatile oder dann volatile extern?
Bei der Deklaration (üblicherweise in einem Header) mit extern. Bei
der Definition (üblicherweise in einer C-Datei) kann man es lassen.
Das ist mir momentan keine große Hilfe, ich habe 2 C-Bücher, deren
Beispiele leider nicht aufschlussreich sind!
Ich hab das ganze mit volatile extern in der main.h deklariert und die
main.h per include da eingebunden wo ich die Variable nutzen möchte.
Beim kompilieren treten keine Fehler auf, aber wenn ich das build
erstelle meckert er rum, das da ein undefieniertes Symbol ist...
über einen tip wäre ich sehr dankbar...
> Ich hab das ganze mit volatile extern in der main.h deklariert und die> main.h per include da eingebunden wo ich die Variable nutzen möchte.> Beim kompilieren treten keine Fehler auf, aber wenn ich das build> erstelle meckert er rum, das da ein undefieniertes Symbol ist...
Das ist auch kein Wunder, denn mit der Speicherklasse "extern" wird
zum Ausdruck gebracht, dass die Variable in irgend einer anderen
Quelltextdatei deklariert wurde.
Wenn hier jeder bloß einen Brocken der Lösung hinschreibt und man sich
alles selber zusammenbasteln muss ist das ja kein Wunder das nix bei
raus kommt...
so
außerdem benutze ich die Variable "flag" noch in der interrupt.c, aus
diesem Grund habe ich die main.h per include in die interrutp.c
eingebunden...
kann mir bitte jemand sagen was da nun noch falsch ist,
in meinem Hauptprogramm setze ich die Variable flag, aber das hat keine
Auswirkungen auf die switch-case Anweisung in der Interrupt-Routine...
bin für jede Hilfe dankbar...
> Wenn hier jeder bloß einen Brocken der Lösung hinschreibt und man sich> alles selber zusammenbasteln muss ist das ja kein Wunder das nix bei> raus kommt...
Hier wird erwartet, dass man selber denkt und selber an seiner
Hausarbeit oder gar dem beruflichen Projekt arbeitet und nicht mit dem
Silberlöffel gefüttert werden möchte.
Solltest du zuverlässige, jederzeit für dich auf dem Sprung stehende
Beratungsleistung benötigen, dann bezahle einen Berater. Den kannst du
dann rumkommandieren wie du willst und der muss dir helfen. Hier muss
niemand seine Zeit mit deinem Problem verschwenden.
Huhu,
also ich arbeite auch auf nem TMSF2812 unter CCS 3.1. Ich hab auch ne
Menge globaler Variablen in dem vorgegebenen Code und die sind auch dem
Interrupt zugänglich. Es soll eine Möglichkeit wie man einer ISR
Variablen oder Zeiger übergeben kann, aber diese kenne ich leider auch
nicht. In meinem Programm ist das so organisiert...
BSP:
in main.c
#include ...
int GLOBAL=0;
void main(void)
{
GLOBAL=25;
}
in T1CINT_ISR.c
#include ...
extern int GLOBAL;
interrupt void T1CINT_ISR(void)
{
GLOBAL=5;
}
Natürlich muss die ISR erst noch in einer Initialisierungsroutine
zugewiesen werden, also quasi die Adresse der Funktion in die
Vektortabelle eintragen.
dies geht z.B. für den T1CINT so:
EALLOW;
/*Interruptadresse für Timer1-Compare-Interrupt angeben (Interrupt
Adresse in PIE-vector tabelle eintragen)*/
*(volatile long*)0x00000D58 = (long)&T1CINT_ISR;
EDIS;
oder falls man die neuen DSP-Header-Files benutzt auch komfortabler:
void init_interrupt(void)
{
EALLOW; /*erlaubt Zugriff auf Register*/
//Interrupt Adresse in PIE-Vector Tabelle eintragen
PieVectTable.T1CINT = &T1CINT_ISR;
EDIS; /*verbietet den Zugriff auf Register wieder*/
// NICHT VERGESSEN - Gewünschte Interrupts auch freischalten !!!
/***********************************************************************
***************
/ Freigabe der Pie Interrupts
************************************************************************
**************/
PieCtrlRegs.PIECRTL.bit.ENPIE=1;
PieCtrlRegs.PIEACK.bit.ACK2=1;
PieCtrlRegs.PIEIER2.bit.INTx5=1;
EvaRegs.EVAIMRA.bit.T1CINT=1;
IER|=2;
EINT;
}
Hoffe das hilft dir weiter!
PS: Im Simulator-Betrieb lassen sich Interrupts nicht testen, da die
Timer nicht simuliert werden. Wenn du z.B. ein eZdsp-board hast kannst
du das ohne Probleme dort im Step-, oder Run-Betrieb testen. Nicht
vergessen einen Breakpoint im Interrupt zu setzen, sonst bekommt man
nicht mit das er dort hineinspringt!
Ansonsten wäre könnte die Fehlermeldung von CCS weiterhelfen.
> Mein erster Versuch war mit einer globalen Variable, mit "extern"> deklariert, aber die Variable wurde nicht richtig von Funktion zu> Funktion übermittelt. Und außerdem ist es ja keine saubere Lösung mit> globalen Variablen zu arbeiten.
Wieso soll das keine saubere Lösung sein?
Gruss, Jan
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.