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