RT Thread建立靜態 動態執行緒

2021-07-14 21:45:54 字數 2908 閱讀 7635

rt-thread 實時作業系統核心是乙個高效的硬實時核心,它具備非常優異的實時性、穩

定性、可剪裁性,當進行最小配置時,核心體積可以到 3k rom 占用、 1k ram 占用。

rt-thread 中的「執行緒」一般由三部分組成:執行緒**(函式)、 執行緒控制塊、 執行緒堆疊。

/* 指向執行緒控制塊的指標*/

static struct 

rt_thread led_thread= rt_null

;void led_thread_entry(void*parameter)

}

上面即是乙個典型的執行緒**結構—無限死迴圈,當然還有一種執行緒結構是順序執行的,比如初始化執行緒,它執行到 return(),就會返回,當其返回後,系統會在 idle 執行緒中將其刪除,從而使其退出排程佇列。一般情況下使用者執行緒都將是乙個無限迴圈結構。

 執行緒堆疊:

static rt_uint8_t led_stack[ 512];

執行緒堆疊是一段連續的記憶體塊,當執行緒切換後,為了滿足執行緒切換和響應中斷時儲存

cpu 暫存器中的內容及任務呼叫其它函式時的準備,每個執行緒都要配有自己的堆疊.

建立乙個我們自己的執行緒

前面說了這麼多,我們還是來自己建立乙個執行緒,這樣的話印象更深刻。

rt-thread 中的執行緒分為靜態執行緒—執行緒堆疊由編譯器靜態分配,使用 rt_thread_init ()

函式建立和動態執行緒—執行緒堆疊由系統動態分配,使用 rt_thread_create()函式建立。

/*靜態執行緒的 執行緒堆疊*/

static rt_uint8_t led1_stack[512

];/*

靜態執行緒的 執行緒控制塊

*/static

struct

rt_thread led1_thread;

void demo_thread_creat(void)  

/*建立動態執行緒 : 堆疊大小 512 bytes ,優先順序 21 ,時間片 2 個系統滴答

*/led2_thread = rt_thread_create("

led2",

dynamic_thread_entry,

rt_null,

512,

21,2

);  

if (led2_thread !=rt_null)

rt_thread_startup(led2_thread);

}

靜態執行緒 vs 動態執行緒

從上例可看出,靜態、動態執行緒在做同樣的事情時,從效果上看,是沒有任何差別的!

那麼,我們在實際中如何抉擇?使用靜態執行緒時,必須先定義靜態的執行緒控制塊,並且定義好堆疊空間,然後呼叫rt_thread_init() 來完成執行緒的初始化工作。採用這種方式,執行緒控制塊和堆疊占用的記憶體會放在 rw/zi 段,這段空間在編譯時就已經確定,它不是可以動態分配的,所以不能被釋放,而只能使用 rt_thread_detach() 函式將該執行緒控制塊從物件管理器中脫離。使用動態定義方式 rt_thread_create() 時, rt-thread 會動態申請執行緒控制塊和堆疊空間。在編譯時, 編譯器是不會感知到這段空間的,只有在程式執行時, rt-thread 才會從系統堆中申請分配這段記憶體空間,當不需要使用該執行緒時,呼叫 rt_thread_delete() 函式就會將這段申請的記憶體空間重新釋放到記憶體堆中。這兩種方式各有利弊,靜態定義方式會占用 rw/zi 空間,但是不需要動態分配記憶體,執行時效率較高,實時性較好。 動態方式不會占用額外的 rw/zi 空間,占用空間小,但是

執行時需要動態分配記憶體,效率沒有靜態方式高。 總的來說,這兩種方式就是空間和時間效率的平衡,可以根據實際環境需求選擇採用具體的分配方式。

static

void rt_hw_led_init(void

);static

void static_thread_entry(void*parameter);

static

void dynamic_thread_entry(void*parameter);

/*變數分配4位元組對齊

*/align(rt_align_size)

/*靜態執行緒的 執行緒堆疊

*/static rt_uint8_t led1_stack[512

];/*

靜態執行緒的 執行緒控制塊

*/static

struct

rt_thread led1_thread;

void demo_thread_creat(void

)

/*建立動態執行緒 : 堆疊大小512 bytes ,優先順序 21 ,時間片 2個系統滴答

*/led2_thread = rt_thread_create("

led2",

dynamic_thread_entry,

rt_null,

512,

21,

2);if (led2_thread !=rt_null)

rt_thread_startup(led2_thread);

/*上面**中的 20、 8 既是執行緒的優先順序, 5 是為執行緒所分配的時間片。這裡需要注意的

是, 當乙個執行緒的優先順序獨一無二的時候,它的時間片這個引數將失去作用,我們不要認為

上面的兩個執行緒執行完 5 個系統 ticks 後就會主動交出 cpu 使用權,當執行完 5 個 ticks

後如果它不需等待任何資源,也不主動讓出 cpu 使用權的話,它還會繼續執行,時間片這個

引數只在具有相同優先順序的執行緒之間起作用,可是即便如此,這個引數也不能設為 0,因為

你不知道後續是否還會建立執行緒。

*/}

RT Thread建立靜態 動態執行緒

rt thread 實時作業系統核心是乙個高效的硬實時核心,它具備非常優異的實時性 穩 定性 可剪裁性,當進行最小配置時,核心體積可以到 3k rom 占用 1k ram 占用。rt thread 中的 執行緒 一般由三部分組成 執行緒 函式 執行緒控制塊 執行緒堆疊。指向執行緒控制塊的指標 sta...

RT Thread 執行緒的建立

基本概念 執行緒是實現任務的載體,它是rt thread中最基本的排程單位,它描述了乙個 任務執行的執行環境,也描述了這個任務所處的優先等級。rt thread中,執行緒由三部分組成 執行緒 入口函式 執行緒控制塊 執行緒堆疊 1 建立程序 1 建立靜態執行緒 rt err t rt thread ...

RT Thread 動態記憶體堆

棧 stack 由編譯器自動分配釋放 區域性變數 堆 heap 一般由程式設計師分配和釋放 rt malloc 1 動態分配記憶體的api board.c中板機硬體效能初始化,根據板卡實際記憶體進行分配 rt system heap init void heap begin,void heap en...