Hallo, ich habe einen AVR32 (Alvidi AVR32-Board mit einem 32UC3A0512) auf dem ich FreeRTOS + lwIP zum laufen gebracht habe. DHCP und Ping funktioniert. Jetzt will ich in einem Task der alle sekunde aufgerufen wird ein UDP Paket versenden. 1) Wenn ich jetzt die Funktion udp_new() im Initialisierungsteil des Taskes (wie hier: http://www.ultimaserial.com/avr_lwip_udp.html) aufrufe dann wirft der µC eine exception (_handle_Instruction_Address). Wenn jedoch die Funktion udp_new() in der main Funktion bevor der dementsprechende Task erzeugt und gestartet wird aufgerufen wird, dann funktioniert das Senden des UDP Packetes. Weiß jemand warum er die Exception wirft? 2) Nun möchte ich einen zweiten Task hinzufügen der keine delay Zeit hat. Dieser hat eine Priorität um 1 höher als der idle Task und eine geringere Priorität als der sekunden Task. Die zwei Tasks laufen auch nebeneinander, aber die Funktion udp_sendto() liefert den Wert -4 (Error: ERR_RTE Routing problem) zurück. Wenn in den zweiten Task jetzt eine delay Time von 1ms eingefügt wird dann funtkioniert das versenden des UDP Paketes wieder. Warum kommt es in diesem Fall zu einem Routing Problem? Hier noch die beiden Tasks + Main:
1 | #define mainRUN_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
2 | #define mainMAIN_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
3 | |
4 | struct udp_pcb *udp_pcb_run; |
5 | char msg[]="RUN"; |
6 | struct pbuf *p; |
7 | |
8 | static void vRunTask( void *pvParameters ); |
9 | void vRunTask( void * pvParameters ) { |
10 | |
11 | // Initialize the xLastWakeTime variable with the current time.
|
12 | portTickType xLastWakeTime = xTaskGetTickCount(); |
13 | |
14 | err_t err; |
15 | |
16 | for( ;; ) { |
17 | // Wait for the next cycle.
|
18 | vTaskDelayUntil( &xLastWakeTime, configTICK_RATE_HZ ); |
19 | |
20 | //Allocate packet buffer
|
21 | p = pbuf_alloc(PBUF_TRANSPORT,sizeof(msg),PBUF_RAM); |
22 | memcpy (p->payload, msg, sizeof(msg)); |
23 | err = udp_sendto(udp_pcb_run, p, IP_ADDR_BROADCAST, 60000); |
24 | pbuf_free(p); //De-allocate packet buffer |
25 | |
26 | |
27 | if (err != ERR_OK) |
28 | LED_On(LED1_GPIO); |
29 | else
|
30 | LED_Off(LED1_GPIO); |
31 | |
32 | LED_Toggle(LED0_GPIO); |
33 | |
34 | }
|
35 | }
|
36 | |
37 | void vStartRunTask(void) { |
38 | /* Spawn the task. */
|
39 | xTaskCreate( vRunTask, ( signed char * ) "RunTask", configMINIMAL_STACK_SIZE, NULL, mainRUN_TASK_PRIORITY, ( xTaskHandle * ) NULL ); |
40 | }
|
41 | |
42 | |
43 | |
44 | static void vMainTask( void *pvParameters ); |
45 | void vMainTask( void * pvParameters ) { |
46 | |
47 | for( ;; ) { |
48 | LED_Toggle(LED2_GPIO); |
49 | // test loop
|
50 | for (uint32_t i = 0; i<10000000; i++) { |
51 | asm volatile ("nop"); |
52 | }
|
53 | LED_Toggle(LED3_GPIO); |
54 | }
|
55 | }
|
56 | |
57 | void vStartMainTask(void) { |
58 | /* Spawn the task. */
|
59 | xTaskCreate( vMainTask, ( signed char * ) "MainTask", configMINIMAL_STACK_SIZE, NULL, mainMAIN_TASK_PRIORITY, ( xTaskHandle * ) NULL ); |
60 | }
|
61 | |
62 | int main( void ) |
63 | {
|
64 | // Configure system clocks.
|
65 | sysclk_init(); |
66 | |
67 | // Start the ethernet tasks
|
68 | vStartEthernetTaskLauncher( configMAX_PRIORITIES ); |
69 | |
70 | // Start the tasks
|
71 | udp_pcb_run = udp_new(); |
72 | vStartRunTask(); |
73 | //vStartMainTask();
|
74 | |
75 | |
76 | // Start FreeRTOS.
|
77 | vTaskStartScheduler(); |
78 | |
79 | |
80 | /* Will only reach here if there was insufficient memory to create the idle task. */
|
81 | return 0; |
82 | }
|
godi