/* 變量分配4字節對齊 */ ALIGN(RT_ALIGN_SIZE) /* 靜態線程的 線程堆棧*/ static rt_uint8_t thread1_stack[512]; static rt_uint8_t thread2_stack[512]; /* 靜態線程的 線程控制塊 */ static struct rt_thread thread_test1; static struct rt_thread thread_test2; static void test1_thread_entry(void* parameter); static void test2_thread_entry(void* parameter); void demo_thread_creat(void) { rt_err_t result; /* 創建靜態線程 : 優先級 15 ,時間片 10個系統滴答 */ result = rt_thread_init(&thread_test1, "test1", test1_thread_entry, RT_NULL, (rt_uint8_t*)&thread1_stack[0], sizeof(thread1_stack), 15, 10); if (result == RT_EOK) { rt_thread_startup(&thread_test1); } /* 創建靜態線程 : 優先級 16 ,時間片 25個系統滴答 */ result = rt_thread_init(&thread_test2, "test2", test2_thread_entry, RT_NULL, (rt_uint8_t*)&thread2_stack[0], sizeof(thread2_stack), 16, 25); if (result == RT_EOK) { rt_thread_startup(&thread_test2); } } void test1_thread_entry(void* parameter) { rt_uint32_t i; /* 無限循環*/ while (1) { for(i = 0; i<10; i++) { rt_kprintf(" %d \r\n", i); /* 等待1s,讓出cpu權限,切換到其他線程 */ rt_thread_delay( 100 ); } } } void test2_thread_entry(void* parameter) { rt_uint32_t i=0; /* 無限循環*/ while (1) { rt_kprintf(" test2 thread count:%d \r\n", ++i); /* 等待0.5s,讓出cpu權限,切換到其他線程 */ rt_thread_delay(50); } }
程序運行分析:
1、首先系統調度 test1 線程投入運行,打印第 0 次運行的信息,然后通過延時函數將自己掛起 100 個時間片,系統將 test2 線程調度運行;
2、 test2 線程打印第 0 次運行信息,然后通過延時函數將自己掛起 50 個時間片;
3、系統中無任務運行,系統將空閑線程調入運行;
4、 50 個時間片后 test2 線程被喚醒,打印第 1 次運行的信息,再繼續通過延時函數將自己掛起 50 個時間片;
5、系統中無任務運行,系統將空閑線程調入運行;
6、 50 個時間片時間到, test1 線程被喚醒,打印第 1 次運行信息,繼續掛起 100 個時間片;
7、 test2 線程被喚醒,打印第 2 次運行的信息,再繼續通過延時函數將自己掛起 50 個時間片;
8、系統中無任務運行,系統將空閑線程調入運行;
9、 50 個時間片后 test2 線程被喚醒,打印第 3 次運行的信息,再繼續通過延時函數將自己掛起 50 個時間片;
10、循環執行 5-9 的過程。
為了演示 test1 線程、 test2 線程之間的切換,我們需在程序中屏蔽掉 finsh 組件( finsh組件會建立 shell 線程):
/* SECTION: finsh, a C-Express shell */
//#define RT_USING_FINSH
RT-Thread的shell系統——finsh,提供了一套供用戶在命令行操作的接口,主要用於調試、查看系統信息。 finsh被設計成一個不同於傳統命令行的C語言表達式解釋器:由於很多嵌入式系統都是采用C語言來編寫, finsh正是采用了這種系統軟件開發人員都會的語法形式,把C語言表達式變成了命令行的風格。它能夠解析執行大部分C語言的表達式,也能夠使用類似於C語言的函數調用方式訪問系統中的函數及全局變量,此外它也能夠通過命令行方式創建變量。