rt-thread核心移植
移植選用的是rt-thread nano版,這次的移植的乞丐版,rt-thread的元件都沒有移植,只有最基本的核心。
為了簡單,參考了rtt提供的模板移植。我這塊板是stm32f767的,和提供的模板使用的m4不一樣,所以要做一些修改。
首先是建立工程,按照模板新增工程檔案,配置好魔法棒中的c/c++引數,之後就開始移植了。
- 將下載好的rt-thread nano版的src新增到工程中,由於這裡不使用rtt的元件,所以rt-thread\components下的檔案不需要新增到工程
- 修改時鐘,找到SystemClock_Config的實現,按照自己板子的實際情況對時鐘進行修改,這裡的需要用到uasrt1,所以我就在這裡初始化了uasrt1的時鐘。
- 按照板子的實際情況,在board.c中實現led、uart的bsp


實現OS Tick
此時main中使用的delay還是通過空迴圈實現的,為了使用核心的rt_thread_delay,還需要實現OS Tick來給RTOS提供時間節拍,ARM Cortex-M提供了一個定時器Systick,這個定時器的時鐘來源於系統時鐘,會週期性的溢位,一般RTOS都是使用Systick來提供OS Tick
- 實現SysTick_Handler,讓mcu在Systick定時器溢位時給os tick的值加1,在加os tick時需要關閉中斷
- rt_hw_board_init中給Systick初始化
- 更換main.c中的_delay為rt_thread_delay
效果和前面相同
實現控制檯列印
除錯裝置少不了串列埠列印裝置資訊,rt-thread中提供了rt_kprintf來列印裝置資訊。進入到rt_kprintf的實現中看看
void rt_kprintf(const char *fmt, ...) { … #ifdef RT_USING_DEVICE … #else rt_hw_console_output(rt_log_buf); #endif … }
可以看出rt_kprintf的實現有分情況的,如果有顯示裝置就在顯示裝置上輸出,沒有就通過rt_hw_console_output在控制檯輸出
rt_thread的rt_hw_console_output是弱定義,所以需要使用者自己實現
前面實現了串列埠輸出,因此可以直接使用bsp_uart_send作為控制檯輸出
此時效果如下:

實現動態記憶體
執行緒的建立是需要動態記憶體的,rt-thread使用rtconfig.h來控制RTOS的各個功能的開關;要想使用動態記憶體首先需要在rtconfig.h中開啟動態記憶體
#define RT_USING_HEAP #define RT_USING_SMALL_MEM
然後需要在rt_hw_board_init中使用rt_system_heap_init對動態記憶體堆初始化
在main.c中建立一個執行緒測試rt_kprintf
效果如下:

ofollow,noindex">此工程的程式碼地址
使用env
我的板子是stm32f767,在bsp中找到了一個stm32f7-disco的移植,就拿來用了。修改了一下工程配置,發現串列埠管腳都相同,就關掉sdram直接用了
效果如下:

