FreeRTOS na Nucleo F767
FreeRTOS na Nucleo144-F767ZIT6
Projekt tworzę w STM32CubeIDE za pomocą MX.
1. Konfiguracja
1. Zegary
Zegary ustawiamy na maksymalną częstotliwość.
W zależności od zastowowanego modułu (w Nucleo mamy doprowadzony zewnętrzny sygnał 8MHz z ST-Linka) ustawiamy źródło zegara.
W System Core → SYS → Timebase Source ustawiamy źródło na timer TIM6 lub TIM7 (są to najprostrze timery rzadko uzywane)
2. Peryferia
Dla zadania ustawiam trzy LEDy (w Nucleo144-F767 są trzy diody LED, czerwona, zielona i niebieska) Domyślnie w Nucleo są one już ustawione, dodatkowo jest też skonfigurowany przycisk użytkownika.
3. RTOS
Przechodzimy do zakładki Middleware and Software Pakcs → FREERTOS i tutaj: Interface ustawiamy CMSIS_V2
Task and Quenes: Tutaj dodajemy zadania oraz kolejki danych. Także ustawiamy priorytety zadań ich nazwy, nazwę funkcji startu zadania, stos.
Queues używamy do przekazywania danych pomiędzy zadaniami.
2. Kod
void StartTask1(void *argument);
void StartTask2(void *argument);
void StartTask3(void *argument);
void StartTask4(void *argument);
/* creation of Task1 */
Task1Handle = osThreadNew(StartTask1, NULL, &Task1_attributes);
/* creation of Task2 */
Task2Handle = osThreadNew(StartTask2, NULL, &Task2_attributes);
/* creation of Task3 */
Task3Handle = osThreadNew(StartTask3, NULL, &Task3_attributes);
/* creation of Task4 */
Task4Handle = osThreadNew(StartTask4, NULL, &Task4_attributes);
/* Start scheduler */
osKernelStart();
Zadania:
Zadanie 1
void StartTask1(void *argument)
{
/* USER CODE BEGIN 5 */
/* Infinite loop */
for(;;)
{
printf("Task-1\n");
HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);
osDelay(1000);
}
/* USER CODE END 5 */
}
Zadanie 2
void StartTask2(void *argument)
{
/* USER CODE BEGIN StartTask2 */
/* Infinite loop */
for(;;)
{
printf("Task-2\n");
HAL_GPIO_TogglePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin);
osDelay(500);
}
/* USER CODE END StartTask2 */
}
Zadanie 3
void StartTask3(void *argument)
{
/* USER CODE BEGIN StartTask3 */
/* Infinite loop */
for(;;)
{
printf("Task-3\n");
volatile uint32_t wait = 50000000;
HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);
osDelay(200);
while (wait--);
}
/* USER CODE END StartTask3 */
}
Zadanie 4
void StartTask4(void *argument)
{
/* USER CODE BEGIN StartTask4 */
/* Infinite loop */
for(;;)
{
printf("Task-4\n");
osDelay(1000);
osThreadSuspend(Task3Handle);
osDelay(5000);
osThreadResume(Task3Handle);
}
/* USER CODE END StartTask4 */
}