Prostym, ale dobrym przykładem wykorzystania FreeRTOS jest obliczanie liczb pierwszych i miganie diodą w tym samym czasie. Dioda ma zmieniać stan dokładnie co sekundę, dlatego ma wyższy priorytet niż obliczanie liczb pierwszych.

1.W STM32CubeIDE należy wybrać Pinout & Configuration -> Middleware -> FREERTOS i zmienić Interface na CMSIS_V2.

2. W Tasks and Queues dodajemy taska przyciskiem Add, zostawiamy domyślnie i zatwierdzamy.

Zmianiamy Priority w defaultTask na czasu rzeczywistego.
Zapisujemy, generujemy kod.

3. Otwieramy plik main.c i wpisujemy

1
2
3
4
5
6
7
8
9
10
11
12
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
        HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin); //miganie diody
        osDelay(1000); //czekanie 1 sekundę
  }
  /* USER CODE END StartDefaultTask */
}

Uwaga! W FreeRTOS należy używać osDelay() zamiast HAL_Delay(), ponieważ nie zatrzymuje to pracy innych wątków.

W naszym nowym tasku piszemy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* USER CODE END Header_StartTask02 */
void StartTask02(void *argument)
{
  /* USER CODE BEGIN Task2_init */
  /* Infinite loop */
    for (;;) {
        for(uint32_t i=0;; i++){
          int divide = 0;
          for(uint32_t j=1; j < i+1; j++){
              if((i % j) == 0) divide++;
              if(divide > 2) break;
          }
          if(divide == 2){
                  printfx("%d\r\n", i); //wyświetlanie liczby pierwszej
                  osDelay(1); //nie czeka
          }
        }
    }
  /* USER CODE END Task2_init */
}

4. Żeby wyświetlić wynik użyjemy UARTA, w tym celu dodajemy

1
2
3
4
5
6
7
/* USER CODE BEGIN PV */
UART_HandleTypeDef huart2;

char buf_printf[100]; //max printf length
#define printfx(f_, ...) snprintf(buf_printf, 100, (f_), ##__VA_ARGS__); \
HAL_UART_Transmit(&huart2, (uint8_t*)buf_printf, strlen(buf_printf), 1000);

/* USER CODE END Variables */

Warto też zmienić prędkość UARTA. Wchodzimy w Pinout & Configuration -> Connectivity -> USART2 -> Parameter Settings -> Basic Parameters zmieniamy Baud Rate na 115200.

To wszystko, po użyciu programu do podglądu UARTA będziemy widzieć liczby pierwsze z jednocześnie migającą diodą.

C, STM32