Forum: Mikrocontroller und Digitale Elektronik STM32F407 mit FreeRTOS startet keinen Task


von Holger T. (holger1979)


Lesenswert?

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)
    {
    }
}

von dummy (Gast)


Lesenswert?

Sind die RTOS Handler in der MAP Datei zu sehen?
Stack zu klein?
FPU beachtet?

von Jan K. (jan_k)


Lesenswert?

Läuft das Programm denn noch, oder hängt er in irgendeinem Error handler 
fest?

von Holger T. (holger1979)


Lesenswert?

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
}

von VolkerBausLi (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.