Forum: Mikrocontroller und Digitale Elektronik at91sam7 mit freertos und dbgu interrupt


von tommi (Gast)


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

von Tommi (Gast)


Lesenswert?

Mach' ich irgentwas Grundsätzliches falsch? Oder warum Antwortet 
niemand?

Gruß Tommi

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Wenn richtig erinnert, teilen DBGU und PIT sich den selben 
Interrupt-Kanal und der Scheduler nutzt den PIT. Wenn dem so ist, müsste 
man für beide Interruptquellen einen Handler mit Fallunterscheidung 
implementieren. Es mag dann einfacher sein, einen der "echten" UARTs zu 
nutzen und die DBGU nur im "polled"-mode zu betreiben.

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.