Hallo, ich habe einen STM32F407 und versuche gerade FreeRTOS ans laufen zu bringen. Gestern habe ich das mit einem STM32F051 bereits hinbekommen. Dasselbe Programm wie gestern, die Pins umkonfiguriert und es läuft nicht. Der Debugger bleibt wie gewohnt bei vTaskStartScheduler() stehen. Allerdings habe ich in meinem Task einen Breakpoint, wo eigentlich Leuchtdioden Ein und Ausgeschaltet werden sollten. Dort kommt der Debugger aber niemals rein. Schalte ich die LEDs in Main ein, so geht es. Also die Portdefinitionen sind schonmal richtig. So sieht der Code aus: #include "stm32f4xx.h" #include "stm32f4xx_rcc.h" #include "stm32f4xx_gpio.h" /* FreeRTOS includes. */ #include "FreeRTOS.h" #include "task.h" #define orange_off GPIO_ResetBits(GPIOD, GPIO_Pin_13); #define green_off GPIO_ResetBits(GPIOD, GPIO_Pin_12); #define red_off GPIO_ResetBits(GPIOD, GPIO_Pin_14); #define blue_off GPIO_ResetBits(GPIOD, GPIO_Pin_15); #define orange_on GPIO_SetBits(GPIOD, GPIO_Pin_13); #define green_on GPIO_SetBits(GPIOD, GPIO_Pin_12); #define red_on GPIO_SetBits(GPIOD, GPIO_Pin_14); #define blue_on GPIO_SetBits(GPIOD, GPIO_Pin_15); unsigned char toggle = 0; void BlinkyTask( void *pvParameters ) { while(1) { toggle++; toggle%=2; if (toggle) { red_on; blue_on; green_on; orange_on; } else { red_off; blue_off; green_off; orange_off; } // Task für 500ms auf "Blocked" vTaskDelay(500/portTICK_RATE_MS); } vTaskDelete( NULL ); // clean exit } int main(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); //Initialize struct GPIO_InitTypeDef GPIO_InitDef; //Pins 3, 4, 5 and 6 GPIO_InitDef.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; //Mode output GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT; //Output type push-pull GPIO_InitDef.GPIO_OType = GPIO_OType_PP; //Without pull resistors GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL; //50MHz pin speed GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz; //Initialize pins on GPIOD port GPIO_Init(GPIOD, &GPIO_InitDef); xTaskCreate(BlinkyTask, "Blinky", configMINIMAL_STACK_SIZE, NULL, 1, NULL); vTaskStartScheduler(); while(1) { } }
Sind die RTOS Handler in der MAP Datei zu sehen? Stack zu klein? FPU beachtet?
Läuft das Programm denn noch, oder hängt er in irgendeinem Error handler fest?
Das Programm läuft jetzt seit geraumer Zeit. Habe irgendwie vergessen das hier rein zu schreiben. Ich weiß leider nicht mehr woran es lag. Ich meine ich habe da was in der FreeRTOSConfig.h eingestellt. Leider bin ich mir da aber nicht sicher. Entweder das oder ein ganz dummer Fehler. Folgender Code funktioniert jetzt auf jeden Fall:
1 | #include "stm32f4xx.h" |
2 | #include "stm32f4xx_rcc.h" |
3 | #include "stm32f4xx_gpio.h" |
4 | /* FreeRTOS includes. */
|
5 | #include "FreeRTOS.h" |
6 | #include "task.h" |
7 | #include "queue.h" |
8 | #include "timers.h" |
9 | |
10 | #define orange_off GPIO_ResetBits(GPIOD, GPIO_Pin_13);
|
11 | #define green_off GPIO_ResetBits(GPIOD, GPIO_Pin_12);
|
12 | #define red_off GPIO_ResetBits(GPIOD, GPIO_Pin_14);
|
13 | #define blue_off GPIO_ResetBits(GPIOD, GPIO_Pin_15);
|
14 | |
15 | #define orange_on GPIO_SetBits(GPIOD, GPIO_Pin_13);
|
16 | #define green_on GPIO_SetBits(GPIOD, GPIO_Pin_12);
|
17 | #define red_on GPIO_SetBits(GPIOD, GPIO_Pin_14);
|
18 | #define blue_on GPIO_SetBits(GPIOD, GPIO_Pin_15);
|
19 | |
20 | |
21 | unsigned char toggleRed = 0; |
22 | unsigned char toggleBlue = 0; |
23 | unsigned char toggleGreen = 0; |
24 | unsigned char toggleOrange = 0; |
25 | |
26 | xTaskHandle hdl_red; |
27 | xTaskHandle hdl_blue; |
28 | xTaskHandle hdl_green; |
29 | xTaskHandle hdl_orange; |
30 | QueueHandle_t myQueue; |
31 | TimerHandle_t hdl_timer; |
32 | |
33 | void BlinkyRed( void *pvParameters ) |
34 | {
|
35 | while(1) |
36 | {
|
37 | toggleRed++; |
38 | toggleRed%=2; |
39 | if (toggleRed) |
40 | {
|
41 | red_on; |
42 | }
|
43 | else
|
44 | {
|
45 | red_off; |
46 | }
|
47 | // Task für 500ms auf "Blocked"
|
48 | vTaskDelay(500/portTICK_RATE_MS); |
49 | }
|
50 | vTaskDelete( NULL ); // clean exit |
51 | }
|
52 | |
53 | void BlinkyBlue( void *pvParameters ) |
54 | {
|
55 | while(1) |
56 | {
|
57 | toggleBlue++; |
58 | toggleBlue%=2; |
59 | if (toggleBlue) |
60 | {
|
61 | blue_on; |
62 | }
|
63 | else
|
64 | {
|
65 | blue_off; |
66 | }
|
67 | // Task für 500ms auf "Blocked"
|
68 | vTaskDelay(20/portTICK_RATE_MS); |
69 | }
|
70 | vTaskDelete( NULL ); // clean exit |
71 | }
|
72 | |
73 | void BlinkyGreen( void *pvParameters ) |
74 | {
|
75 | while(1) |
76 | {
|
77 | toggleGreen++; |
78 | toggleGreen%=2; |
79 | if (toggleGreen) |
80 | {
|
81 | green_on; |
82 | red_off; |
83 | blue_off; |
84 | orange_off; |
85 | vTaskSuspendAll(); |
86 | int i; |
87 | for (i = 0; i < 5000000; i++); |
88 | green_off; |
89 | xTaskResumeAll(); |
90 | }
|
91 | // Task für 500ms auf "Blocked"
|
92 | vTaskDelay(5000/portTICK_RATE_MS); |
93 | }
|
94 | vTaskDelete( NULL ); // clean exit |
95 | }
|
96 | |
97 | void BlinkyOrange( void *pvParameters ) |
98 | {
|
99 | while(1) |
100 | {
|
101 | toggleOrange++; |
102 | toggleOrange%=2; |
103 | if (toggleOrange) |
104 | {
|
105 | orange_on; |
106 | if (hdl_blue ) |
107 | vTaskResume(hdl_blue); |
108 | }
|
109 | else
|
110 | {
|
111 | orange_off; |
112 | blue_off; |
113 | vTaskSuspend(hdl_blue); |
114 | }
|
115 | // Task für 500ms auf "Blocked"
|
116 | vTaskDelay(250/portTICK_RATE_MS); |
117 | }
|
118 | vTaskDelete( NULL ); // clean exit |
119 | }
|
120 | |
121 | // Task to create a queue and post a value.
|
122 | void sender( void *pvParameters ) |
123 | {
|
124 | myQueue = xQueueCreate( 5, 15 ); |
125 | |
126 | while(1) |
127 | {
|
128 | unsigned char myMessage[15] = "Hello World"; |
129 | xQueueSend( myQueue, ( void * ) &myMessage, 1000 ); |
130 | vTaskDelay(5000/portTICK_RATE_MS); |
131 | }
|
132 | }
|
133 | |
134 | // Task to receive from the queue.
|
135 | void receiver( void *pvParameters ) |
136 | {
|
137 | while(1) |
138 | {
|
139 | unsigned char gotMessage[15]; |
140 | |
141 | if( xQueueReceive( myQueue, &gotMessage, 10000 ) ) |
142 | {
|
143 | green_on; |
144 | red_on; |
145 | blue_on; |
146 | orange_on; |
147 | vTaskSuspendAll(); |
148 | int i; |
149 | for (i = 0; i < 5000000; i++); |
150 | green_off; |
151 | xTaskResumeAll(); |
152 | }
|
153 | }
|
154 | |
155 | }
|
156 | |
157 | void timer_Function(TimerHandle_t t_handle) |
158 | {
|
159 | // int timerIndex = (int) pvTimerGetTimerID(t_handle);
|
160 | // Timer mit Index timerIndex wurde aufgerufen
|
161 | xTimerStop(t_handle, 0); |
162 | }
|
163 | |
164 | int main(void) |
165 | {
|
166 | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); |
167 | |
168 | //Initialize struct
|
169 | GPIO_InitTypeDef GPIO_InitDef; |
170 | |
171 | //Pins 3, 4, 5 and 6
|
172 | GPIO_InitDef.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; |
173 | //Mode output
|
174 | GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT; |
175 | //Output type push-pull
|
176 | GPIO_InitDef.GPIO_OType = GPIO_OType_PP; |
177 | //Without pull resistors
|
178 | GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL; |
179 | //50MHz pin speed
|
180 | GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz; |
181 | |
182 | //Initialize pins on GPIOD port
|
183 | GPIO_Init(GPIOD, &GPIO_InitDef); |
184 | |
185 | xTaskCreate(BlinkyRed, "BlinkyRed", configMINIMAL_STACK_SIZE, NULL, 1, &hdl_red); |
186 | xTaskCreate(BlinkyBlue, "BlinkyBlue", configMINIMAL_STACK_SIZE, NULL, 1, &hdl_blue); |
187 | xTaskCreate(BlinkyGreen, "BlinkyGreen", configMINIMAL_STACK_SIZE, NULL, 1, &hdl_green); |
188 | xTaskCreate(BlinkyOrange, "BlinkyOrange", configMINIMAL_STACK_SIZE, NULL, 1, &hdl_orange); |
189 | xTaskCreate(sender, "send", configMINIMAL_STACK_SIZE, NULL, 1, NULL); |
190 | xTaskCreate(receiver, "receive", configMINIMAL_STACK_SIZE, NULL, 1, NULL); |
191 | |
192 | hdl_timer = xTimerCreate("Name", 1000, pdTRUE, ( void * ) 37, timer_Function); |
193 | xTimerStart(hdl_timer, 0); |
194 | |
195 | vTaskStartScheduler(); |
196 | |
197 | while(1) |
198 | {
|
199 | }
|
200 | }
|
Hallo, versuche ebenfalls das FreeRTOS auf dem STM32F407 zum laufen zu bringen, bis jetzt allerdings ohne Erfolg. Hat hier jemand ein einfaches Beispielprojekt welches man zum start verwenden kann ? Wäre sehr hilfreich. Danke schon mal.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.