RT Thread – to wielowątkowy system czasu rzeczywistego współpracujący ze środowiskiem Keil.

Włączenie stosu

Zanim zaczniemy używać bilioteki rtthread musimy włączyć (domyślnie wyłączony) stos. Inaczej będzie błąd tworzenia wątków:

1
Project.axf: Error: L6218E: Undefined symbol rt_thread_create (referred from main.o).

W tym celu otwieramy plik rtconfig.h i edytujemy linię usuwając z niej komentarz, ma wyglądać tak:

1
#define RT_USING_HEAP

Będziemy korzystać z funkcji printfx() z poradnika STM32 cout.

Wątki

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//w sekcji Private includes:
#include

/////////////////////////...

/* USER CODE BEGIN 0 */
rt_thread_t printfx0_thread;
rt_thread_t printfx1_thread;

void printfx0_thread_entry(void* parameter)
{ //watek 1
while(1){
rt_enter_critical();//lock : printf & shared variables
printfx("1");
rt_exit_critical();//lock : printf & shared variables
rt_thread_delay(1500);
}
}

void printfx1_thread_entry(void* parameter)
{ //watek 2
while(1){
rt_enter_critical();//lock : printf & shared variables
printfx("2");
rt_exit_critical();//lock : printf & shared variables
rt_thread_delay(150);
}
}

void run_2_threads(void)
{ //Uruchamia oba watki
printfx0_thread = rt_thread_create(
"printfx1",
printfx0_thread_entry,
RT_NULL,
512,
3,
20
);
if(printfx0_thread != RT_NULL)
rt_thread_startup(printfx0_thread);

printfx1_thread = rt_thread_create(
"printfx2",
printfx1_thread_entry,
RT_NULL,
512,
3,
20
);
if(printfx1_thread != RT_NULL)
rt_thread_startup(printfx1_thread);

}
//...
/* USER CODE END 0 */

////////////////////////////////////////...

//main:
/* USER CODE BEGIN 2 */
//FX:
run_2_threads();
/* USER CODE END 2 */