RT Thread學習筆記1 啟動順序與執行緒建立

2022-01-09 20:31:53 字數 4161 閱讀 8056

目錄4. 系統滴答時鐘

5. gpio驅動架構操作io

6. 執行緒優先順序 & 時間片

7. 鉤子函式

參考文獻

systeminit()

$sub$$main()

rtthread_startup()

main_thread_entry

$super$$main使用者主函式

自由分配的記憶體(堆)起始位址為ram的起始位址加上rw+zi段後的位址區域。

編譯出的program size分為:

code: **段,存放程式的**部分

ro-data: 唯讀資料段,存放程式中定義的常量

rw-data: 讀寫資料段,存放初始化為非0值的全域性變數

zi-data: 0資料段,存放未初始化得全域性變數及初始化為0的變數

實際占用空間情況為:

ro size包含了code及ro-data,表示程式占用flash空間的大小

rw size包含了rw-data及zi-data,表示執行時占用ram的大小

rom size包含了code, ro data和rw data,表示燒寫程式占用flash空間的大小

板子上電後預設從flash啟動,啟動之後會將rw段中的rw-data(初始化的全域性變數)搬運到ram中,但不會搬運ro段,即cpu的執行**從flash中讀取,另外根據編譯器給出的zi位址和大小,分配出zi段,並將這塊ram區域清零。動態記憶體堆為未使用的ram空間,應用程式申請和釋放的記憶體都來自該空間

rt-thread中,執行緒由三部分組成:執行緒**(入口函式)、執行緒控制塊、執行緒堆疊

無限迴圈結構

void thread_entry(void *parameter)

}順序執行結構

void thread_entry(void *parameter)

作業系統管理執行緒的乙個資料結構。存放執行緒的一些資訊,比如優先順序、執行緒名稱、執行緒狀態等等,也包括執行緒與執行緒之間連線用的鍊錶結構,執行緒等待時間集合等

struct rt_thread;

struct rt_thread *rt_thread_t;

建立靜態執行緒

rt_err_t rt_thread_init(struct rt_thread *thread,

const char *name,

void (*entry)(void *parameter),

void *parameter,

void *stack_start,

rt_uint32_t stack_size,

rt_uint8_t priority,

rt_uint32_t tick)

建立動態執行緒

rt_thread_t rt_thread_create(const char *name,

void (*entry(void *parameter),

void *parameter,

rt_uint32_t stack_size,

rt_uint8_t priority,

rt_uint32_t tick))

啟動執行緒

rt_err_t rt_thread_startup(rt_thread_t thread)

呼叫此函式後建立的執行緒會被加入到執行緒的就緒佇列,執行排程

rt_err_t thread_static_init()

int thread_dynamic_init()

rt_thread_delay(15); // 根據時鐘頻率決定。時鐘頻率100hz,那麼一次delay 10ms.此處就未150ms

rt_thread_sleep(15);

rt_thread_mdelay(15); // delay 15ms

區別:

資源分配形式不同:靜態執行緒的執行緒控制塊和執行緒棧是靜態分配的,而動態執行緒的這兩部分是執行時動態分配的

執行效率:如果堆空間是片外ram,那麼動態執行緒的執行效率低於靜態執行緒。反之,如果都是片內ram,則沒有差別

心跳時鐘由硬體定時器的定時中斷產生。稱之為系統滴答或者時鐘節拍。其頻率需要根據cpu的處理能力來決定。始終街拍使得核心可以將執行緒延時若干個時鐘節拍,以及執行緒等待時間發生時,超時的依據。頻率越快,核心函式介入系統執行的概率越大,核心占用的處理器時間就越長,系統的負荷就越大。頻率越小,時間處理精度又不夠。在stm32平台上一般設定系統滴答頻率為100hz,即每個滴答的時間是10ms。在rtconfig.h中的rt_tick_per_second巨集,就是代表的hz數

#include io初始化

void rt_pin_mode(rt_base_t pin, rt_base_t mode)

pin_mode_output

pin_mode_input

pin_mode_input_pullup

pin_mode_input_pulldown

pin_mode_output_od

io寫入

void rt_pin_write(rt_base_t pin, rt_base_t value)

pin_high

pin_low

io讀出

int rt_pin_read(rt_base_t pin)

首先通過看drv_gpio.c中的巨集,得知我們設定的晶元有多少個腳。再看__stm32_pin(2, e, 4).那麼這裡傳入2,就表示要操作pe4引腳

使用msh中的命令:list_thread。列出當前所有執行緒的棧使用情況

分別描述了執行緒競爭處理器資源的能力和持有處理器時間長短的能力。rt-thread最大支援256個優先順序,數值越小優先順序越高,0為最高優先順序,最低優先順序保留給空閒執行緒idle。可以通過rt_config.h中的rt_thread_priority_max巨集,修改最大支援的優先順序。針對stm32預設設定最大支援32個優先順序。具體應用中,執行緒總數不受限制,能建立的執行緒總數之和具體硬體平台的記憶體有關

只有在相同優先順序的就緒態執行緒中起作用,時間片起到約束執行緒單次執行時長的作用,其單位是乙個系統街拍(os tick)

當有高優先順序執行緒處於就緒態後,就會發生任務排程

相同優先順序的執行緒,作業系統按照時間片大小輪流排程執行緒,時間片起到約束執行緒單次執行時長的作用。保證同優先順序任務輪流占有處理器

特殊的系統執行緒,具有最低的優先順序。系統中無其他就緒執行緒可執行時,排程器將排程到空閒執行緒。空閒執行緒負責一些系統資源**以及將一些處於關閉態的執行緒從執行緒排程列表中移除的動作。空閒執行緒在形式上是乙個無限迴圈結構,且永遠不被掛起。在rt-thread實時作業系統中空閒執行緒向使用者提供了鉤子函式,空閒執行緒鉤子函式可以在系統空閒的時候,執行一些非緊急事務,例如系統執行指示燈閃爍,cpu使用率統計等等

rt_err_t rt_thread_idle_sethook(void(*hook)(void))

rt_err rt_thread_idle_delhook(void(*hook)(void))

注意:

空閒執行緒是乙個執行緒狀態永遠為就緒態的執行緒,所以鉤子函式中執行的相關**必須保證空閒執行緒在任何時刻都不會被掛起,例如rt_thread_delay(), rt_sem_take()等可能會導致執行緒掛起的阻塞類函式,都不能再鉤子函式中呼叫。

空閒執行緒可以設定多個鉤子函式(有最大限制)

系統上下文切換是最普遍的時間,如果使用者想知道在某乙個時刻發生了什麼樣的執行緒切換,rt-thread提供了乙個系統排程鉤子函式,這個鉤子函式在系統進行任務切換時執行,通過這個鉤子函式,可以了解到系統任務排程時的資訊

rt_scheduler_sethook(void(*hook)(struct rt_thread *from, struct rt_thread *to))
rt-thread文件中心

RT Thread學習筆記 RTT系統啟動

rtthread startup 是rtt規定的同意啟動入口 啟動順序 從啟動檔案開始執行 進入rtthread startup 進行rtt系統功能初始化 進入使用者入口main 省略其他 intrtthread startup void 啟動排程器之前,系統建立的執行緒在執行rt thread s...

Rtthread學習筆記

rt sem init rt sem create rt sem take 等待 訊號量 rt sem release 放出 訊號量 rt sem detach 訊號量脫離2.互斥量 與訊號量不同的是,互斥量只能由持有執行緒釋放,其他執行緒不可釋放 取得互斥量的執行緒與高優先度的優先順序相同 rt ...

RT thread學習筆記之

1 往裸機工程新增 rt thread 原始碼 a 拷貝 rt thread package 到裸機工程根目錄 2 拷貝 rtconfig.h 檔案到 user 資料夾 a 將 rt thread 3.0.3 bsp 資料夾下面的 rtconfig.h 配套檔案拷貝到工程根目錄下面的 user資料夾...