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ą.