移植RTT--官方教程
CPU架構(gòu)移植:大部分的CPU都移植好了,不太需要用戶去操作。libcpu文件夾里面就是各種的CPU架構(gòu)。主要處理標(biāo)紅四個函數(shù):
| rt_base_t rt_hw_interrupt_disable(void); | 關(guān)閉全局中斷 |
| void rt_hw_interrupt_enable(rt_base_t level); | 打開全局中斷 |
| rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit); | 線程棧的初始化,內(nèi)核在線程創(chuàng)建和線程初始化里面會調(diào)用這個函數(shù) |
| void rt_hw_context_switch_to(rt_uint32 to); | 沒有來源線程的上下文切換,在調(diào)度器啟動第一個線程的時候調(diào)用,以及在 signal 里面會調(diào)用 |
| void rt_hw_context_switch(rt_uint32 from, rt_uint32 to); | 從 from 線程切換到 to 線程,用于線程和線程之間的切換 |
| void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to); | 從 from 線程切換到 to 線程,用于中斷里面進(jìn)行切換的時候使用 |
| rt_uint32_t rt_thread_switch_interrupt_flag; | 表示需要在中斷里進(jìn)行切換的標(biāo)志 |
| rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread; | 在線程進(jìn)行上下文切換時候,用來保存 from 和 to 線程 |
| rt_tick_increase()? | 時鐘節(jié)拍 |
重點(diǎn):BSP的移植:這里主要是針對Rt-thread下BSP下沒有的芯片的移植。
三種方式:
從現(xiàn)有bsp修改(相同/相似型號芯片),主要是從E:\rt-thread\bsp目錄下,這次項(xiàng)目就是選的這種方式。
基于模板移植(同一系列芯片),主要從E:\rt-thread\bsp\stm32\libraries\templates目錄下,芯片系列以stm32為例。
裸機(jī)工程添加(難度最大)
一、從現(xiàn)有bsp修改,步驟:
1、通過看bsp下的readme.md看下芯片配置是否相似。找到后,復(fù)制一份工程出來,改一下名
2、時鐘配置,通過CubeMX配置時鐘,生成工程后,在main.c里?SystemClock_Config()?拷貝一份到board.c中。
3、串口引腳,通過CubeMX配置好串口后,調(diào)用E:\birld\rtOS\bsp\myOS\sixBand\board\CubeMX_Config\Src下的stm32l4xx_hal_msp.c底層配置。然后,通過menuconfig,打開串口外設(shè),并在kernel下,控制臺串口名稱要對應(yīng)到打印串口。
4、Flash、RAM大小
在board.h,還有鏈接腳本link.sct(文件在E:\birld\rtOS\bsp\myOS\sixBand\board\linker_scripts)下修改。
scons --dist,打包一個BSP。
二、模板移植:
1、選好通用模板
2、按照以下修改:
| CubeMX_Config (文件夾) | CubeMX 工程 |
| linker_scripts (文件夾) | BSP 特定的鏈接腳本 |
| board.c/h | 系統(tǒng)時鐘、GPIO 初始化函數(shù)、芯片存儲器大小 |
| Kconfig | 芯片型號、系列、外設(shè)資源(在E:\birld\rtOS\bsp\myOS\sixBand\board下) |
| SConscript | 芯片啟動文件、目標(biāo)芯片型號(也是在E:\birld\rtOS\bsp\myOS\sixBand\board下,啟動文件修改) |
其他參見:一、現(xiàn)有BSP修改
三、祼機(jī)移植? ?2020-5-21看的直播,5-27日才能看回看
RTT的內(nèi)核架構(gòu)
移植步驟:
1、準(zhǔn)備祼機(jī)工程(帶串口打印)
2、添加RT-Thread源碼(src,include,libcpu,rtconfig.h)
本人是基于stm32L431RCT6的芯片來移植,并且源工程是用CubeMX直接生成的,所以工程添加情況如下:基于nano3.13版本進(jìn)行的移植。
Board文件夾存放的是board.c文件。rt-config.h與board.c都是直接拷貝nano3.13目錄下bsp下:
3、實(shí)現(xiàn)時鐘管理(Systick配置)board.c已經(jīng)實(shí)現(xiàn)了systick的配置,所以基本上沒動。至此,已經(jīng)實(shí)現(xiàn)了大半,在工程中將main.c里的delay(),改為rt_thread_delay(500);就可以實(shí)現(xiàn)移植前的功能了。目的是,給系統(tǒng)提供時間片,這樣系統(tǒng)才能跑起來。同時,系統(tǒng)切換時的延時rt_thread_delay()也是基于系統(tǒng)時間片的,切換也是基于systick的中斷函數(shù),所以這兩步必不可少。
第一步,實(shí)現(xiàn)配置:
第二步實(shí)現(xiàn)systick中斷
4、實(shí)現(xiàn)控制臺輸出(實(shí)現(xiàn)rt_hw_console_output()):目的是為了調(diào)用kt_printf打印調(diào)試信息。
這里主要實(shí)現(xiàn)coponets.c---->rt_show_version()下調(diào)用的rt_kprintf()函數(shù)。打開rt_printf()函數(shù)定義,有兩種方式,一種是設(shè)備,另一種是void rt_hw_console_output(const char *str)函數(shù)。
使用最簡單的,重新定義一下rt_hw_console_output().
個人遇到的問題是:
1、在重定義時,多加了一個取地址符,造成一直輸出不對。
其中Usart_SendString原型為:
2、輸出Log后沒有換行:
解決:
以上遇到的兩個問題,都和這個函數(shù)原型Usart_SendString()有關(guān)。
這個函數(shù)是輸出一行,然后沒有回車,所以是接著輸出的,怎么辦呢?最簡單的辦法。
?解決:
5、實(shí)現(xiàn)動態(tài)內(nèi)存管理(rt_system_headp_init()):目的是為了實(shí)現(xiàn)多線程。線程是要分配棧空間的,所以需要知道每個棧的起始地址和結(jié)束地址。
直接移植的nano下的board.c里已經(jīng)實(shí)現(xiàn)了rt_system_headp_init(),只要開啟兩個宏就可以了。
修改一個棧大小為10K,如下圖:
然后在mian()函數(shù)里面創(chuàng)建一個新線程試試就可以了。如下:
至此,完成一個裸機(jī)工程的移植。
完整代碼,附工程見CSDN上傳資源
總結(jié)
以上是生活随笔為你收集整理的移植RTT--官方教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 偶初学的时候写的,同给初学者参考
- 下一篇: 二进制概述-0day漏洞利用原理(1)