Forum: FPGA, VHDL & Co. Microblaze hängt sich im ersten Interrupt auf


von Sandra (Gast)


Lesenswert?

Hallo zusammen,

habe gerade ein größeres Problem wo ich im Internet keine Lösung zu 
finden kann.

Ich habe mir eine IP Core im EDK zusammengebaut die Daten sammelt, dies 
allerdings nur während eines Ereignisses. Den Start dieses Ereignisses 
reiche ich aus der IP Core als Signal heraus und stelle es als 
EDGE_RISING Interrupt in den XPS_XINTC Interrupt Eingang rein, der auch 
als EDGE_RISING eingestellt ist. Nun möchte ich nachdem die ISR 
(Speichern der aufgezeichneten Daten) abgearbeitet wird, dass diese 
wieder verlassen wird. Dies passiert aber leider nicht. Ich stelle hier 
mal meinen C-Code, der dieses Problem betrifft online. Vielleicht kann 
mir jemand von euch helfen. Das wäre super!

1
//INITIALISIERUNG DES INTERRUPTS
2
XIntc g_interrupt_controller;
3
4
XIntc_Initialize(&g_interrupt_controller, XPAR_INTC_0_DEVICE_ID);
5
XIntc_Connect(&g_interrupt_controller, 0, (XInterruptHandler) gms_control_interrupt_routine_save_frame, NULL);
6
XIntc_Start(&g_interrupt_controller, XIN_REAL_MODE);
7
XIntc_Enable(&g_interrupt_controller, 0);  
8
microblaze_enable_interrupts();
9
10
//ISR
11
void gms_control_interrupt_routine_save_frame() {
12
13
    ...
14
15
    XIntc_Acknowledge(&g_interrupt_controller, 0xFF);
16
}

von Sandra (Gast)


Lesenswert?

Möchte noch kurz dazu sagen, dass die ISR abgearbeitet wird, aber nicht 
mehr verlassen wird. Es gibt also nur einen Durchlauf, irgendwie 
funktioniert das Acknowledge nicht!?

von Georg A. (Gast)


Lesenswert?

Lies nach dem Acknowledge halt mal den Status des IRQ-Controllers aus, 
und schau nach, ob da die Anforderung noch "steht". Evtl. machst du da 
ja auch mit Pegel vs. Flankensteuerung was falsch.

Ansonsten kann natürlich ein kaputter Stack auch sowas verursachen (in 
der IRQ-Routine falsch auf Arrays im Stack geschrieben etc.). Ganz gerne 
genommen sind auch Zugriffe auf Strukturen, die hinter einem Nullpointer 
versteckt sind. Damit versaut man sich den Bereich der IRQ-Handler mit 
einem Super Zeitzündereffekt.

von Alex (Gast)


Lesenswert?

Ist zwar ein große Weile her dass ich mit der EDK gearbeitet habe,

aber ich mein, dass du den Interrupt in der Peripheral und dem 
Interrupt-Controller clearen musst.

Gruß

von Sandra (Gast)


Lesenswert?

Georg ich denke, dass du richtig liegst mit deiner Vermutung über 
Strukturen in der ISR... Ich verwende zwei Funtkionen in der ISR.

In der ersten lese ich Daten aus meiner IP Core aus und speichere diese 
dann in einer globalen Struktur. In der zweiten Funktion hole ich die 
Daten aus dieser Struktur um sie fest im DDR RAM zu speichern. Ich bin 
nicht ganz fit mit Pointern und hoffe, dass ich alles richtig gemacht 
habe. Hier mein C-Code, vielleicht versteht den einer ;). Würde mich 
sehr freuen wenn mir einer sagen könnte, ob die ISR mit dem Pointer auf 
die Struktur so funktionieren kann. Der Debugger hängt sich immer in der 
sogenannten gms_control_write_frame_to_ddr_sdram() Funtkion auf, also 
daraus gibt es keine entkommen mehr...
1
//Definition der Struktur
2
typedef struct{
3
  u32 recorder_slaveregister_array[13];
4
}gms_data_frame;
5
6
//Pointer auf die Struktur zur Übergabe in den Funktionen
7
gms_data_frame g_gms_data_frame;
8
gms_data_frame *g_gms_pointer_2_data_frame;
9
10
g_gms_pointer_2_data_frame = &g_gms_data_frame;
11
12
//ISR
13
void gms_control_interrupt_routine_save_frame() {
14
15
    gms_control_read_recorder_slaveregisters(g_gms_pointer_2_data_frame);
16
    gms_control_write_frame_to_ddr_sdram(g_gms_pointer_2_data_frame,    g_ddr_sdram_address_counter);
17
    g_ddr_sdram_address_counter += 0x34;
18
    XIntc_AckIntr(XPAR_XPS_INTC_0_BASEADDR, 0xFF);
19
}
20
21
//Funktionen
22
void gms_control_read_recorder_slaveregisters(gms_data_frame *p_gms_data_frame) {
23
24
    int m_iterator;
25
    for (m_iterator = 0; m_iterator < 13; ++m_iterator) {
26
        p_gms_data_frame->recorder_slaveregister_array[m_iterator]
27
        = XIo_In32(XPAR_GMS_0_BASEADDR + m_iterator * 0x04);
28
  }
29
}
30
31
void gms_control_write_frame_to_ddr_sdram(gms_data_frame *p_gms_data_frame,
32
    u32 p_ddr_sdram_address_counter) {
33
34
  int m_iterator;
35
36
  for (m_iterator = 0; m_iterator < 13; ++m_iterator) {
37
    XIo_Out32(p_ddr_sdram_address_counter + m_iterator * 0x04, p_gms_data_frame->recorder_slaveregister_array[m_iterator]);
38
  }
39
}

von Duke Scarring (Gast)


Lesenswert?

Sandra schrieb:
> Der Debugger hängt sich immer in der
> sogenannten gms_control_write_frame_to_ddr_sdram() Funtkion
Funktioniert denn die Funktion ohne Interrupt? Mal testweise aus der 
main() aufgerufen?

Duke

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.