at91sam7 mit freertos und dbgu interrupt

Gast #1245822
Lesenswert?

Hallo,
ich habe auf einem sam7-ex256 von olimex ein projekt mit freertos 
aufgesetzt (Host - Linux mit gnu tool chain, openocd, wiggler). zuerst 
habe ich einen Task implementiert, der zyklisch eine led toggelt. das 
klappt wunderbar. nun wollte ich die debug uart (mit rx interrupt) in 
betrieb nehmen. dazu benutze ich folgenden code:
1
void DBGU_irq_wrapper(void) __attribute__ ((naked));
2

3
void DBGU_irq_handler(void) {
4
  AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTSTA;
5
  AT91C_BASE_AIC->AIC_EOICR = 0;
6
}
7

8
void DBGU_irq_wrapper(void) {
9
  portSAVE_CONTEXT();
10
  DBGU_irq_handler();
11
  portRESTORE_CONTEXT();
12
}
13

14
void AT91F_DBGU_Init(void) {
15
  //* Open PIO for DBGU
16
  AT91F_DBGU_CfgPIO();
17

18
  //* Enable Transmitter & receivier
19
  ((AT91PS_USART)AT91C_BASE_DBGU)->US_CR = AT91C_US_RSTTX |AT91C_US_RSTRX;
20

21
  //* Configure DBGU
22
  AT91F_US_Configure (
23
      (AT91PS_USART) AT91C_BASE_DBGU,       // DBGU base address
24
      MCK,
25
      AT91C_US_ASYNC_MODE ,                 // Mode Register to be programmed
26
      AT91C_DBGU_BAUD ,                     // Baudrate to be programmed
27
      0);                                   // Timeguard to be programmed
28

29
  //* Enable Transmitter & receivier
30
  ((AT91PS_USART)AT91C_BASE_DBGU)->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
31

32
  //* Enable USART IT error and AT91C_US_ENDRX
33
  AT91F_US_EnableIt((AT91PS_USART) AT91C_BASE_DBGU,AT91C_US_RXRDY);
34

35
  //* open interrupt
36
  AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_SYS, USART_SYS_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, DBGU_irq_wrapper);
37
  AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SYS);
38
}

in main kreiere ich einen 2. Task, der zyklisch "Test\n" auf die DBGU 
schreibt. Auch das funktioniert.
1
static void debugTest(void) {
2
  while(1) {
3
    AT91F_DBGU_Printk("Test\r\n");
4
    vTaskDelay(1500);
5
  }
6
}
7

8
int main( void )
9
{
10
  // Setup any hardware that has not already been configured by the low level init routines.
11
  prvSetupHardware();
12

13
  // init backlight toggle task
14
  initBacklight();
15

16
  AT91F_DBGU_Init();
17

18
  // Start the backlight task
19
  xTaskCreate(
20
      (pdTASK_CODE)toggleBacklight,
21
      "TOG",
22
      mainTOG_TASK_STACK_SIZE,
23
      NULL,
24
      tskIDLE_PRIORITY,
25
      &xToggleTask);
26

27
  // Start the dbgu test task
28
  xTaskCreate(
29
      (pdTASK_CODE)debugTest,
30
      "DBG",
31
      configMINIMAL_STACK_SIZE,
32
      NULL,
33
      tskIDLE_PRIORITY,
34
      &xDebugTask);
35
  /* Start the scheduler.
36
  vTaskStartScheduler();
37
  return 0;
38
}
Wenn ich nun eine eingabe am Terminal mache (also den RX Interrupt 
auslöse), dann sieht es so aus, als ob mein controller steht (weder 
Toggle task, noch DBGU test task arbeiten).

Den ISR Code (ohne den wrapper) habe ich bereits erfolgreich ohne 
Freertos eingesetzt.
Was mache ich da falsch?

Gruß Tommi

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