at91sam7 mit freertos und dbgu interrupt

Gast #1245822
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
Moderator Persönliche Seite
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.