在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

將RT Thread移植到BL602的方法和關鍵步驟

麥克泰技術 ? 來源:單片機與嵌入式系統應用 ? 2023-11-07 11:11 ? 次閱讀

隨著科技的發展,人們對嵌入式設備的性能和運行效率要求越來越苛刻,傳統嵌入式設備存在非常單一的流向、極低的CPU利用率等缺點,實時性對于汽車、航天領域至關重要,可能會因為處理器沒有及時響應任務而造成極大的損失。針對這一不足,提出將嵌入式操作系統移植到微處理器中以提高運行效率和穩定性。RT Thread作為一款實時、搶占式多任務操作系統,在智能家居、航天、安防、可穿戴電子產品方面應用廣泛,勢必會成為未來AIoT(人工智能物聯網)平臺主流的操作系統。

為了搶先一步占領市場,將RT Thread移植到各大廠商的芯片上具有極其重要的現實意義,但是目前并沒有將RT Thread移植到BL602的成熟方案,并且移植具有一定的難度。針對這一現象,本文提出了將RT Thread移植到BL602的方法和關鍵步驟。

1 軟硬件環境概述

1.1 硬件概述

本文所采用的BL602 芯片使用RISCV 架構的CPU,其超低功耗的電源管理單元可用于高性能應用開發,采用外部時鐘源可以獲得高精度和穩定的時鐘,另外還可以選配閃存(Flash),高速緩存可以加快CPU 訪問存儲器的速率,大大提高CPU 利用率和程序執行速率。

1.2 軟件準備

本文采用RT Thread 3.1.1標準版本的源碼進行裁剪移植,為了避免從頭開始編寫代碼,提前在博流官網下載bl_mcu_sdk代碼用作參考。

2 RT Thread工程框架啟動原理

2.1 總體啟動流程

整個工程啟動流程分為BL602芯片啟動和RT Thread實時內核啟動。該過程與U boot啟動過程類似。對于前者,芯片上電后會首先從start.S匯編代碼處開始執行,最后通過調用entry()進入應用程序入口,進而調用內核啟動函數rtthread_startup()將系統控制權轉移給RT Thread,具體流程如圖1所示。

f832087c-7d1a-11ee-939d-92fbcf53809c.jpg

圖1 總體啟動流程

2.2 RT Thread實時內核啟動流程

RT Thread實時內核啟動主要由rtthread_startup()函數完成,主要進行板級初始化、打印RT Thread版本信息定時器初始化、調度器初始化、應用程序初始化、定時器線程初始化、空閑線程初始化、調度器啟動。

2.2.1 板級初始化

板級初始化過程就是通過調用rt_hw_board_init()函數實現,對于不同型號的芯片,該函數所要處理的任務大同小異,一般都是初始化芯片引腳和串口、配置系統時鐘、初始化堆空間。對于BL602芯片,因其內部自帶了一個64位的定時器mtimer,將會對該定時器進行初始化以設置系統定時時間,其作用與STM32芯片中的嘀嗒時鐘類似。

2.2.2 定時器初始化

調用rt_system_timer_init()函數初始化的是硬件中斷模式下的定時器,RT Thread的硬件定時器由一個靜態的雙向鏈表構成,剛開始初始化定時器隊列為空,即L>next=L >pre=L,具體結構如圖2所示。

f848afaa-7d1a-11ee-939d-92fbcf53809c.jpg

圖2 初始化后的定時器結構

2.2.3 調度器初始化

調度器用于調度線程運行,在當前系統的就緒隊列中找到優先級最高的就緒線程來執行,RTThread中線程一共有32個等級的優先級,數值越大,優先級越低。調度器初始化主要對線程優先隊列進行初始化為NULL,設置當前線程優先級:RT_THREAD_PRIORITY_MAX-1=31為最低的優先級,初始化線程控制塊指針為NULL,初始化線程就緒優先級組為0。

2.2.4 應用程序初始化

通過調用rt_application_init()來動態創建main主線程,在線程函數main_thread_entry()調用main(),從而進入用戶主函數。不過此時線程并沒有啟動,而是根據優先級插入到了線程就緒優先隊列指定位置,等到調度器啟動后才會真正運行主線程。

2.2.5 調度器啟動

通過調用rt_system_scheduler_start()啟動調度器,main線程、idle線程才會真正被調度,系統會從線程就緒隊列中選擇優先級最高的一個線程并執行。如果系統的就緒隊列中還有線程1(優先級為7)、線程2(優先級為10)、線程3(優先級為7)、tshell(優先級為20)四個線程。當調度器啟動后,系統中各個線程指向關系如圖3所示。

f8565c22-7d1a-11ee-939d-92fbcf53809c.jpg

圖3 線程指向關系

3 RT Thread移植過程

RT Thread移植就是讓RTThread實時操作系統能夠在BL602芯片上跑起來,并且可以實現任務管理、任務創建、任務調度等功能。移植過程主要分為以下幾個部分:啟動入口、系統時鐘配置、mtimer定時器配置、注冊中斷回調函數、實現Finsh功能、rt_kprintf實現、任務創建和任務調度。下面將對具體步驟進行詳細介紹。

3.1 添加單板BL602和修改源碼目錄

為了移植最小內核到BL602芯片上,有必要對RT Thread源碼進行裁剪。保留src、include目錄文件不變,components目錄下面只保留finsh文件夾,bsp目錄下添加BL602單板目錄,在libcpu/risc_v目錄下新建一個bl602文件夾,向libcpu/risc_v/bl602中添加對應的 interrupt_gcc.S、cpuport.c、context_gcc.S,這幾個匯編和C文件可以從其他RISC V 架構下的芯片中復制,CPU 架構移植主要實現如下功能:中斷使能/失能、任務切換、線程棧初始化、中斷處理等。把bl_mcu_sdk中的drivers/soc/bl602/startup/start.S 啟動文件復制到libcpu/risc_v/bl602目錄下,作為芯片上電啟動文件。rtconfig.h頭文件中定義了一些預編譯宏,只需定義一些基本的宏就行,至此源碼裁剪工作基本完成。

3.2 修改入口函數

裸機程序中啟動文件start.S中最后幾行匯編指令如下所示(現在需要修改jal main為 jalentry,從而跳轉到應用程序入口調用rtthread_startup()啟動函數啟動內核,至此系統控制權就轉交給了操作系統):

//系統初始化,保存默認配置、清除所有中斷

jal SystemInit

/*從ITCM、DTCM、RAM 復制數據到TCM 中,并且清空.bss區*/

jal start_load

//設置PDS、HBN時鐘

jal System_Post_Init

……

//跳轉到用戶主程序

jal main 修改為jalentry

3.3 適配板級初始化函數

對開發板的初始化操作一般都在rt_hw_board_init()接口進行,比如系統時鐘初始化、外設時鐘初始化、定時器初始化、串口初始化、GPIO初始化、堆初始化等。

3.3.1 系統時鐘初始化

視系統需求,外部晶振時鐘可選24、32、38.4、40 MHz,可以設置外部晶振XTAL為40 MHz,配置系統時鐘為最高的192 MHz。通過配置clk_cfg0寄存器(地址為0x40000000)的bit[0:3]為1,使能PLLCLK、BCLK、FCLK、HCLK;通過設置bit[4:5]都為1,選擇PLL輸出時鐘為192 MHz;設置bit[6:7]都為1,選擇root clock來自RC32M(RC振蕩器頻率為32 MHz);最后選擇PLL 輸出192MHz作為system clock。

3.3.2 外設時鐘初始化

首先使能外圍設備時鐘,然后再進行配置。BL602芯片的外圍設備時鐘包括Flash、UART、I2C、GPIO 等,這里只用到了UART 外圍設備,bl_mcu_sdk在peripheral_clock_init()只需要執行兩個操作:一是使能UART 時鐘(通過寫0x4000 0024的第16位為1);二是配置UART時鐘為160 MHz(通過配置0x40000008的bit7為選擇時鐘源,通過0x4000 0008的bit[0:2]設置分頻系數為0,設置bit4為1使能串口時鐘)。

3.3.3 配置mtimer定時器

mtimer定時器是RISC V 內核自帶的一個64位定時器,可以通過配置0x4000 0090寄存器來使能mtimer時鐘和選擇時鐘類型,還可以選擇分頻系數,與STM32芯片里面的嘀嗒時鐘類似。bl_mcu_sdk的中斷采用vector mode,一共有18個中斷源,中斷號0~15為RISCV保留中斷,而mtimer中斷號是7,UART0中斷號是(IRQ_NUM_BASE+29),其中IRQ_NUM_BASE為16,可以在rt_hw_board_init()中調用bflb_mtimer_config(1000000,SysTick_Handler),從而將mtimer中斷號與中斷服務函數SysTick_Handler綁定在一起,假如時鐘經過分頻以后為 1 MHz,經過以上設置后,mtimer定時時間即為1 s。

3.3.4 串口初始化

主要對引腳和UART 外設進行初始化,bl_mcu_sdk中有個函數已經實現該功能,可以直接在rt_hw_board_init()里調用console_init(),該函數里面調用bflb_gpio_uart_init()實現了GPIO輸入輸出引腳的初始化以及調用bflb_uart_init()實現了uart0初始化。

3.3.5 堆初始化

和其他操作系統不同的是,RT Thread堆空間大小由程序員自定義的一個靜態數組heap_buf[]決定,數組大小不能超過SRAM 最大值,然后通過rt_system_heap_init(begin_addr, end_addr)函數對堆空間的起始和終止地址進行初始化,此處應為heap_buf和(heap_buf + sizeof(heap_buf) 1),并對begin_addr進行向上4字節對齊操作,對end_addr進行向下4字節對齊操作。在rtconfig.h頭文件中定義RT_USING_HEAP 宏后才能動態創建main主線程,否則只能通過靜態方法創建線程。

3.4 實現rt_kprintf功能

要想實現RT Thread的打印功能,其實就是實現rt_hw_console_output()函數向串口輸出數據,BL602參考手冊里面有兩個寄存器需要設置:一個是uart_fifo_config_1,地址為:0x4000 a084,需要設置bit[0:5]位用于TX FIFO可用計數;另外一個是uart_fifo_wdata,地址為:0x4000a088,用來將一個字符寫進0x4000 a088地址里,bl_mcu_sdk里面已經實現過該部分,直接在rt_hw_console_output()里面調用即可,至此可以通過串口uart0輸出數據。

3.5 移植Finsh

移植Finsh組件,實現命令行交互功能,首先需要添加Finsh代碼,在rtconfig.h頭文件中定義RT_USING_FINSH以及與Finsh線程相關的一些宏定義,然后對接rt_hw_console_getchar()函數即可,其中獲取字符有兩種方式:采用查詢方式或者中斷方式,建議采用中斷方式獲取字符。

3.5.1 查詢方式

查詢方式下不能使能串口接收中斷,且此方法相較于中斷方式較為簡單,不過效率很低,需要對兩個寄存器進行配置:一個是uart_fifo_config_1,地址為0x4000 a084,需要設置bit[8:13]用于RX FIFO 可用計數;另外一個是uart_fifo_rdata,地址為0x4000 a08c,用于從0x4000 a08c地址中讀取一個字符到串口。

3.5.2 中斷方式

采取中斷方式必須使能串口接收中斷,參考BL602數據手冊得知,可以通過配置uart_int_en寄存器bit3使能串口接收中斷,寄存器地址為0x4000 a02c。中斷方式獲取字符流程如下:定義一個buffer緩沖區和一個信號量,當uart接收產生中斷時,會在中斷服務函數中將讀取到的數據緩存到buffer緩沖區,然后釋放信號量來通知finsh線程接收數據,finsh線程將從緩沖區中讀取數據。所以還需要實現串口接收中斷服務函數Uart_IRQHandler,并通過bflb_irq_attach(45, Uart_IRQHandler)將UART0中斷號與之綁定在一起,UART0中斷號為(IRQ_NUM_BASE+29),IRQ_NUM_BASE為16。

4 測試結果

操作系統啟動后,會自動創建main、idle、tshell線程。下面將在main函數中動態創建3個線程,將線程1、3優先級設置為7,線程2優先級設置為10,tick都設置為10,在線程函數中都同時延時1 s,觀察打印出的當前線程數量是否正確以及各個線程是否按照優先級正確被調度執行。實驗結果表明,RT Thread操作系統能夠在BL602上穩定運行,并且可以正常進行線程創建和調度,測試結果如圖4所示。

f860cffe-7d1a-11ee-939d-92fbcf53809c.jpg

圖4 測試結果

5 結 語

本文在介紹了RT Thread實時操作系統基礎上講解了如何在BL602芯片上成功移植RT Thread實時操作系統的方法。最后在BL602上進行測試,可以正常運行,為其他RTOS移植到芯片上提供了參考和借鑒。

(本文由《單片機嵌入式系統應用》雜志授權發表,原文刊發在2023年第10期)

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5096

    文章

    19189

    瀏覽量

    308031
  • 操作系統
    +關注

    關注

    37

    文章

    6900

    瀏覽量

    123814
  • 微處理器
    +關注

    關注

    11

    文章

    2274

    瀏覽量

    82818
  • 移植
    +關注

    關注

    1

    文章

    383

    瀏覽量

    28198
  • RTThread
    +關注

    關注

    8

    文章

    132

    瀏覽量

    41013

原文標題:基于BL602的RT Thread移植方法研究

文章出處:【微信號:麥克泰技術,微信公眾號:麥克泰技術】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    RT-Thread最小系統的移植方法

    目標為進一步研究RT-Thread,掌握系統移植的基本方法
    發表于 06-02 09:47 ?550次閱讀
    <b class='flag-5'>RT-Thread</b>最小系統的<b class='flag-5'>移植</b><b class='flag-5'>方法</b>

    移植RT-Thread nanoCW32L083

    移植RT-Thread NanoCW32L083開發板上,并成功運行。
    的頭像 發表于 07-03 09:04 ?2.2w次閱讀
    <b class='flag-5'>移植</b><b class='flag-5'>RT-Thread</b> nano<b class='flag-5'>到</b>CW32L083

    i.MX RT1170:VGLite移植RT-Thread Nano過程講解(下)

    上篇介紹了如何移植 RT-Thread Nano 內核與 Finsh 控制臺 RT1170。本篇繼續介紹如何 NXP 官方的 VGLit
    的頭像 發表于 11-09 11:22 ?1008次閱讀

    從μCOS-ⅡRT-Thread移植方法是什么

    公司項目原先使用μCOS-II,但是μCOS存在商業使用付費問題,故而我們轉向用國產開源免費RTOS RT-Thread替代,花了一天半的時間原來的μCOS代碼移植到了RT-Thread
    發表于 06-04 04:35

    【博流 BL-HWC-G1 開發板試用】讓博流 BL602 連接互聯網 —— 使用 BL IoT SDK 通過 Wi-Fi 聯網發出 HTTP GET 請求獲取數據

    中分享你的嘗試。2. 必要的材料一塊 BL602 的開發板(本文以 BL-HWC-G1 為例,若使用其它 BL602 的開發板,步驟可能稍有不同)一根 Type-C USB 線安裝有
    發表于 11-26 21:02

    RT-Thread移植方法分享

    02_RTT_Thread nano移植一.RT-Thread 移植方法一 源文件拷貝法1.準備一份裸機工程2.
    發表于 02-22 06:20

    基于SIFIVE E24的BL602BL702移植過程

    已完成 BL602、BL702 的 rt-thread 移植,近期整理后 PR。這兩個都是基于 SIFIVE E24 的,BSP的話應該是無差別的。
    發表于 05-31 16:22

    RT-Thread移植AT32平臺時的注意事項和步驟

    AT32移植RT-Thread描述了RT-Thread移植AT32平臺時的注意事項和
    發表于 10-24 06:49

    移植RT-Thread的原理與方法

    大家好我是驚覺。是的,失蹤人口回來了。最近參加了rt-thread的國產MCU移植活動,移植rt-thread華大的HC32L196。rt
    的頭像 發表于 09-17 09:41 ?7932次閱讀

    【國產MCU移植移植RT-Thread國產芯片HC32F460PETB

    【國產MCU移植移植RT-Thread國產芯片HC32F460PETB
    發表于 11-23 18:06 ?37次下載
    【國產MCU<b class='flag-5'>移植</b>】<b class='flag-5'>移植</b><b class='flag-5'>RT-Thread</b><b class='flag-5'>到</b>國產芯片HC32F460PETB

    【國產MCU移植移植RT-Thread國產芯片FM33LC026

    【國產MCU移植移植RT-Thread國產芯片FM33LC026
    發表于 11-30 16:51 ?22次下載
    【國產MCU<b class='flag-5'>移植</b>】<b class='flag-5'>移植</b><b class='flag-5'>RT-Thread</b><b class='flag-5'>到</b>國產芯片FM33LC026

    RT-Thread系統移植STM32f103

    RT-Thread系統移植STM32f103
    發表于 12-09 12:51 ?26次下載
    <b class='flag-5'>RT-Thread</b>系統<b class='flag-5'>移植</b><b class='flag-5'>到</b>STM32f103

    博流BL602/604數據手冊

    博流BL602/604數據手冊
    發表于 01-13 09:35 ?29次下載

    WebAssembly中的BL602/BL604模擬器使用

    讓我們使用WebAssembly在 Web 瀏覽器中模擬 BL602 / BL604 Rust 固件
    發表于 03-18 10:11 ?2次下載

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與<b class='flag-5'>移植</b>
    主站蜘蛛池模板: 国产区一区二区三 | 91热成人精品国产免费 | 久久精品国产99精品最新 | 日日干视频 | 大量真实偷拍情侣视频野战 | 国产农村妇女毛片精品久久 | 亚州免费一级毛片 | 免费观看a毛片一区二区不卡 | 澳门色视频| 色香色香欲天天天影视综合网 | 天天看天天干天天操 | 国产va在线| 中文字幕123区 | a4yy私人毛片在线 | 国产高清区 | 美女一级一级毛片 | 国产成人午夜精品影院游乐网 | 欧洲国产精品精华液 | 四虎精品影院永久在线播放 | 久久97精品久久久久久久看片 | 色婷婷综合网 | 在线精品国产成人综合第一页 | 欧美三级 欧美一级 | 天堂网中文在线最新版 | 中国一级黄色毛片 | 欧美特级午夜一区二区三区 | 99成人在线 | 视频在线一区二区 | 免费看黄色一级毛片 | 三级黄色a | 久久女人网 | 色综合天天网 | 在线天堂中文新版有限公司 | 成人欧美一区二区三区小说 | 国产婷婷综合丁香亚洲欧洲 | 特黄日韩免费一区二区三区 | 天天操天天射天天 | 久久99爱爱 | 天天色天天操天天 | 99热最新在线 | 男女免费在线视频 |