日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

移植RTT--官方教程

發布時間:2024/1/18 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 移植RTT--官方教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CPU架構移植:大部分的CPU都移植好了,不太需要用戶去操作。libcpu文件夾里面就是各種的CPU架構。主要處理標紅四個函數:

函數和變量描述
rt_base_t rt_hw_interrupt_disable(void);關閉全局中斷
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);線程棧的初始化,內核在線程創建和線程初始化里面會調用這個函數
void rt_hw_context_switch_to(rt_uint32 to);沒有來源線程的上下文切換在調度器啟動第一個線程的時候調用,以及在 signal 里面會調用
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 線程,用于中斷里面進行切換的時候使用
rt_uint32_t rt_thread_switch_interrupt_flag;表示需要在中斷里進行切換的標志
rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread;在線程進行上下文切換時候,用來保存 from 和 to 線程
rt_tick_increase()?時鐘節拍

重點:BSP的移植:這里主要是針對Rt-thread下BSP下沒有的芯片的移植。

三種方式:

從現有bsp修改(相同/相似型號芯片),主要是從E:\rt-thread\bsp目錄下,這次項目就是選的這種方式。

基于模板移植(同一系列芯片),主要從E:\rt-thread\bsp\stm32\libraries\templates目錄下,芯片系列以stm32為例。

裸機工程添加(難度最大)

一、從現有bsp修改,步驟:

1、通過看bsp下的readme.md看下芯片配置是否相似。找到后,復制一份工程出來,改一下名

2、時鐘配置,通過CubeMX配置時鐘,生成工程后,在main.c里?SystemClock_Config()?拷貝一份到board.c中。

3、串口引腳,通過CubeMX配置好串口后,調用E:\birld\rtOS\bsp\myOS\sixBand\board\CubeMX_Config\Src下的stm32l4xx_hal_msp.c底層配置。然后,通過menuconfig,打開串口外設,并在kernel下,控制臺串口名稱要對應到打印串口。

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系統時鐘、GPIO 初始化函數、芯片存儲器大小
Kconfig芯片型號、系列、外設資源(在E:\birld\rtOS\bsp\myOS\sixBand\board下)
SConscript芯片啟動文件、目標芯片型號(也是在E:\birld\rtOS\bsp\myOS\sixBand\board下,啟動文件修改)

其他參見:一、現有BSP修改

三、祼機移植? ?2020-5-21看的直播,5-27日才能看回看

RTT的內核架構

移植步驟:

1、準備祼機工程(帶串口打印)

2、添加RT-Thread源碼(src,include,libcpu,rtconfig.h)

本人是基于stm32L431RCT6的芯片來移植,并且源工程是用CubeMX直接生成的,所以工程添加情況如下:基于nano3.13版本進行的移植。

Board文件夾存放的是board.c文件。rt-config.h與board.c都是直接拷貝nano3.13目錄下bsp下:

3、實現時鐘管理(Systick配置)board.c已經實現了systick的配置,所以基本上沒動。至此,已經實現了大半,在工程中將main.c里的delay(),改為rt_thread_delay(500);就可以實現移植前的功能了。目的是,給系統提供時間片,這樣系統才能跑起來。同時,系統切換時的延時rt_thread_delay()也是基于系統時間片的,切換也是基于systick的中斷函數,所以這兩步必不可少。

第一步,實現配置:

第二步實現systick中斷

4、實現控制臺輸出(實現rt_hw_console_output()):目的是為了調用kt_printf打印調試信息。

這里主要實現coponets.c---->rt_show_version()下調用的rt_kprintf()函數。打開rt_printf()函數定義,有兩種方式,一種是設備,另一種是void rt_hw_console_output(const char *str)函數。

使用最簡單的,重新定義一下rt_hw_console_output().

個人遇到的問題是:

1、在重定義時,多加了一個取地址符,造成一直輸出不對。

其中Usart_SendString原型為:

2、輸出Log后沒有換行:

解決:

以上遇到的兩個問題,都和這個函數原型Usart_SendString()有關。

這個函數是輸出一行,然后沒有回車,所以是接著輸出的,怎么辦呢?最簡單的辦法。

?解決:

5、實現動態內存管理(rt_system_headp_init()):目的是為了實現多線程。線程是要分配棧空間的,所以需要知道每個棧的起始地址和結束地址。

直接移植的nano下的board.c里已經實現了rt_system_headp_init(),只要開啟兩個宏就可以了。

修改一個棧大小為10K,如下圖:

然后在mian()函數里面創建一個新線程試試就可以了。如下:

至此,完成一個裸機工程的移植。

完整代碼,附工程見CSDN上傳資源

總結

以上是生活随笔為你收集整理的移植RTT--官方教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。