rt-thread 實時作業系統核心是乙個高效的硬實時核心,它具備非常優異的實時性、穩
定性、可剪裁性,當進行最小配置時,核心體積可以到 3k rom 占用、 1k ram 占用。
rt-thread 中的「執行緒」一般由三部分組成:執行緒**(函式)、 執行緒控制塊、 執行緒堆疊。
/* 指向執行緒控制塊的指標*/
static struct上面即是乙個典型的執行緒**結構—無限死迴圈,當然還有一種執行緒結構是順序執行的,比如初始化執行緒,它執行到 return(),就會返回,當其返回後,系統會在 idle 執行緒中將其刪除,從而使其退出排程佇列。一般情況下使用者執行緒都將是乙個無限迴圈結構。rt_thread led_thread= rt_null
;void led_thread_entry(void*parameter)
}
執行緒堆疊:
static rt_uint8_t led_stack[ 512];
執行緒堆疊是一段連續的記憶體塊,當執行緒切換後,為了滿足執行緒切換和響應中斷時儲存
cpu 暫存器中的內容及任務呼叫其它函式時的準備,每個執行緒都要配有自己的堆疊.
建立乙個我們自己的執行緒
前面說了這麼多,我們還是來自己建立乙個執行緒,這樣的話印象更深刻。
rt-thread 中的執行緒分為靜態執行緒—執行緒堆疊由編譯器靜態分配,使用 rt_thread_init ()
函式建立和動態執行緒—執行緒堆疊由系統動態分配,使用 rt_thread_create()函式建立。
/*靜態執行緒的 執行緒堆疊*/
static rt_uint8_t led1_stack[512靜態執行緒 vs 動態執行緒];/*
靜態執行緒的 執行緒控制塊
*/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);
}
從上例可看出,靜態、動態執行緒在做同樣的事情時,從效果上看,是沒有任何差別的!
那麼,我們在實際中如何抉擇?使用靜態執行緒時,必須先定義靜態的執行緒控制塊,並且定義好堆疊空間,然後呼叫rt_thread_init() 來完成執行緒的初始化工作。採用這種方式,執行緒控制塊和堆疊占用的記憶體會放在 rw/zi 段,這段空間在編譯時就已經確定,它不是可以動態分配的,所以不能被釋放,而只能使用 rt_thread_detach() 函式將該執行緒控制塊從物件管理器中脫離。使用動態定義方式 rt_thread_create() 時, rt-thread 會動態申請執行緒控制塊和堆疊空間。在編譯時, 編譯器是不會感知到這段空間的,只有在程式執行時, rt-thread 才會從系統堆中申請分配這段記憶體空間,當不需要使用該執行緒時,呼叫 rt_thread_delete() 函式就會將這段申請的記憶體空間重新釋放到記憶體堆中。這兩種方式各有利弊,靜態定義方式會占用 rw/zi 空間,但是不需要動態分配記憶體,執行時效率較高,實時性較好。 動態方式不會占用額外的 rw/zi 空間,占用空間小,但是
執行時需要動態分配記憶體,效率沒有靜態方式高。 總的來說,這兩種方式就是空間和時間效率的平衡,可以根據實際環境需求選擇採用具體的分配方式。
staticvoid 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...