Forum: FPGA, VHDL & Co. Xilkernel UART Interrupt Reset


von gernoy (Gast)


Lesenswert?

Hallo

Ich hab folgendes Problem: auf meinem ML507 (Xilinx Virtex 5 FX mit PPC) 
fahre ich die UART (FTDI Chip) im Interrupt Modus (Receive). Anbei ist 
mal der Xilkernel Thread mit Callback gepostet. Hier nun meine Frage: 
Ich krieg den Interrupt genau einmal (wenn ich was sende), dannach ist 
Schluss. Erneuter Aufruf vom XUart_Enable_Interrupt bringt nix, ja 
selbst die (dyrtie) variante, die UART zu resetten und neu zu 
Initialisieren auch nicht.

Eventuell kennt jemand aus der Hüfte ( ;-) ) die Funktion, die das Flag 
resettet. In der xintc.h bin ich übrigens auch nicht fündig geworden.

Vielen Dank

Der (Bsp.) Code
1
void* communication_worker_thread(void *arg)
2
{
3
  XUartLite uart;
4
  XUartLite_Config myCfg;
5
  //...
6
  XUartLite_CfgInitialize(&uart,&myCfg,XPAR_RS232_DTE_BASEADDR);
7
#if USE_UART_IN_INTERRUPT_MODE
8
  register_int_handler(UART_INTERRUPT_INTR,(XInterruptHandler)XUartLite_InterruptHandler,(void *)&uart);
9
  uart.RecvHandler = (XUartLite_Handler)USB_UART_RECEIVE_HANDLER; // define aus xparameters.h umgebogen
10
  XUartLite_EnableInterrupt(&uart);
11
  enable_interrupt(UART_INTC); 
12
#endif
13
  return NULL;
14
}
15
16
void USB_UART_RECEIVE_HANDLER(void)
17
{
18
  NACKED_TRACE("UART interrupted!\r\n");
19
  
20
  // --> wie wieder freischalten
21
}

von gernoy (Gast)


Lesenswert?

OK, der Fehler lag ganz wo anders. Hab mir den Stack mit dem malloc 
zerknallt.

Also: nie die STD C Funktionen für dynamischen Speicher nutzen, wenn man 
MT xilkernel benutzt. (Gibts auch specs für: edk10_oslib_rm.pdf )

von Duke Scarring (Gast)


Lesenswert?

gernoy schrieb:
> Also: nie die STD C Funktionen für dynamischen Speicher nutzen, wenn man
> MT xilkernel benutzt.

Danke für den Hinweis. Oft kommt ja dann nur: es geht und das Forum 
stirbt dumm :-)

Duke

von gernoy (Gast)


Lesenswert?

Und wenn jemand den Thread treffen sollte:
Vergesst den Handler von oben ;-):
Der Prototype des Handlers muss lauten:
1
void USB_UART_RECEIVE_HANDLER(void *CallBackRef, unsigned int EventData)
2
{
3
// jetzt Xil_Kernel like ;-)
4
  xil_printf("UART interrupted!\r\n");
5
}
printf ist nämlich genauso corruptet!

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.