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 */ |