Hallo Zusammen,
ich arbeitet momentan an einem STM32F446RE Projekt und verwende als
Betriebssystem FreeRTOS. Bei FreeRTOS bin ich noch etwas neu dabei und
möchte mir nun das Know How erarbeiten.
Mit dem Timer2 habe ich mir einen Interrupt erstellt welcher alle 10s
kommt. Der Interrupt funktioniert soweit so gut (Getestet mit LED Pin
toggeln).
Nun habe ich mir einen Event Task erstellt in dem das ganze
Hauptprogramm nach dem Init der Peripherien laufen soll.
1 | void event_handler_task(void *pvParameters)
|
2 | {
|
3 | SemaphoreHandle_t init_synchronisation = *(SemaphoreHandle_t*) pvParameters;
|
4 |
|
5 | MX_TIM2_Init(); //Timer 2 init
|
6 | HAL_TIM_Base_Start_IT(&htim2); //Timer 2 start interrupt
|
7 |
|
8 | event_binary = xSemaphoreCreateBinary();
|
9 | configASSERT(event_binary);
|
10 |
|
11 | xSemaphoreGive(init_synchronisation);
|
12 |
|
13 | for (;;)
|
14 | {
|
15 | if (xSemaphoreTake(event_binary, portMAX_DELAY) == pdTRUE)
|
16 | {
|
17 | sprintf(debug_string, "We are in the Event Task!");
|
18 | debug_put_string(debug_string);
|
19 | }
|
20 |
|
21 | vTaskDelay(1000 / portTICK_RATE_MS);
|
22 | }
|
23 | }
|
Die BinarySemaphore dazu habe ich Global im selben File erstellt:
1 | static SemaphoreHandle_t event_binary = NULL;
|
Die Interrupt Funktion sieht so aus:
1 | void TIM2_IRQHandler(void)
|
2 | {
|
3 | static BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
4 |
|
5 | xSemaphoreGiveFromISR(event_binary, &xHigherPriorityTaskWoken);
|
6 |
|
7 | if( xHigherPriorityTaskWoken == pdTRUE)
|
8 | {
|
9 | portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
10 | }
|
11 |
|
12 | HAL_TIM_IRQHandler(&htim2);
|
13 |
|
14 | HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);
|
15 | }
|
Mein Problem ist nun, dass wenn ich das ganze Debugge bleibt der
kontroller beim xSemaphoreGiveFromISR hängen. Der Code wird nur bis zu
dieser Funktion ausgeführt und wenn ich den Debugger anhalte bin ich in
folgender Funktion:
1 | configASSERT( pxQueue );
|
Hinter dem configASSERT steckt eine Endlosschelife wenn der Wert der
übergeben wird 0 ist.
Meine Frage nun, verwende ich die falsche Funktion oder habe ich sie
falsch initialisiert?