www.mikrocontroller.net

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


Autor: tommi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void DBGU_irq_wrapper(void) __attribute__ ((naked));

void DBGU_irq_handler(void) {
  AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTSTA;
  AT91C_BASE_AIC->AIC_EOICR = 0;
}

void DBGU_irq_wrapper(void) {
  portSAVE_CONTEXT();
  DBGU_irq_handler();
  portRESTORE_CONTEXT();
}

void AT91F_DBGU_Init(void) {
  //* Open PIO for DBGU
  AT91F_DBGU_CfgPIO();

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

  //* Configure DBGU
  AT91F_US_Configure (
      (AT91PS_USART) AT91C_BASE_DBGU,       // DBGU base address
      MCK,
      AT91C_US_ASYNC_MODE ,                 // Mode Register to be programmed
      AT91C_DBGU_BAUD ,                     // Baudrate to be programmed
      0);                                   // Timeguard to be programmed

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

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

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

in main kreiere ich einen 2. Task, der zyklisch "Test\n" auf die DBGU 
schreibt. Auch das funktioniert.

static void debugTest(void) {
  while(1) {
    AT91F_DBGU_Printk("Test\r\n");
    vTaskDelay(1500);
  }
}

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

  // init backlight toggle task
  initBacklight();

  AT91F_DBGU_Init();

  // Start the backlight task
  xTaskCreate(
      (pdTASK_CODE)toggleBacklight,
      "TOG",
      mainTOG_TASK_STACK_SIZE,
      NULL,
      tskIDLE_PRIORITY,
      &xToggleTask);

  // Start the dbgu test task
  xTaskCreate(
      (pdTASK_CODE)debugTest,
      "DBG",
      configMINIMAL_STACK_SIZE,
      NULL,
      tskIDLE_PRIORITY,
      &xDebugTask);
  /* Start the scheduler.
  vTaskStartScheduler();
  return 0;
}
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

Autor: Tommi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach' ich irgentwas Grundsätzliches falsch? Oder warum Antwortet 
niemand?

Gruß Tommi

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.