国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

關于RTOS的基本移植鴻蒙OS項目

電子發燒友論壇 ? 來源:電子發燒友論壇 ? 作者:電子發燒友論壇 ? 2021-12-01 17:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

移植準備:

軟件平臺:MounRiver Studio( MRS);

硬件平臺: CH32V307開發板;

源碼獲取:https://gitee.com/openharmony/kernel_liteos_m

步驟一:在MRS中新建一個CH32V307的工程,將源碼直接拖到工程中,就添加進來了,然后去添加頭文件路徑即可

18faeb7c-5285-11ec-b2e9-dac502259ad0.png

源碼中包含比較全面,我們可以選擇不需要的部分將其排除在編譯之外,操作方法為右鍵目錄或文件,點擊Include/Exclude From Build菜單項恢復編譯,同樣的方法再選一遍即可。

下面說些移植操作系統的注意事項:

ARM上移植實時操作系統大家可能比較熟悉,對于RISC-V內核的MCU,可能相對比較陌生。下面結合WCH的CH32V103和CH32V307兩款芯片來詳細說下針對RISC-V平臺,移植實時操作系統的注意點。

在移植前,有必要對RISC-V的一些基本知識點有一定的了解,這里對RISC-V的概況,發展,指令集,特權模式等不作詳述,僅結合WCH的RISC-V內核的MCU,簡單介紹我們移植實時操作系統有可能遇到的關鍵點做一下描述。

這里之所以選取V103和V307兩款芯片,主要其極具代表性:

首先,直觀上其外設的使用方法和我們之前熟悉的F103,F107等是兼容的,這樣降低了我們使用和移植時的難度,基于WCH提供的外設庫,我們以前上層的代碼甚至于不用修改可直接使用。

其次,V103是WCH RISC-V內核家族中的V3內核,V307為V4內核,V3內核支持RV32IMAC指令集,即除支持RISC-V基本的32位整數指令集外,還支持硬件乘除法,原子指令,壓縮指令。V4在V3的基礎上增加了單精度硬件浮點,并且其性能也比V3高。

除上述之外,雖然兩者的中斷控制器(PFIC)相較于現行的PLIC均不同,均不是統一入口,而是采用中斷向量表尋址的方式,但是V3的中斷向量表處存放是一條指令,而V4的向量表既可以存放指令,也可以存放中斷處理函數的地址。兩者均支持中斷嵌套和硬件壓棧,區別在于V3最大嵌套兩級,V4最大可達八級,同時V3的硬件壓棧深度兩級,V4的硬件壓棧深度為三級。這里需要注意的是,移植實時操作系統時需要關閉硬件壓棧,在切換任務時所有寄存器,我們希望是由我們自己控制其壓棧和出棧的內容。

RISC-V寄存器如下圖所示,其中x0-x31為整形寄存器,f0-f31為浮點寄存器(V3沒有浮點寄存器)。所有帶caller的寄存器,當發生中斷時需要保存,值得注意的是,WCH的硬件壓棧保存的寄存器僅僅保存整數的16個caller saved 寄存器。正常一個中斷函數的寄存器保存我們不用關心,編譯器會幫我們做的很好。但是當我們從一個匯編入口進中斷函數的時候這些過程就不得不由我們自己來實現。寄存器中幾個相對特殊的x0恒為0,x1是返回地址寄存器ra,函數調用時用來存放返回地址,x2為堆棧指針sp,x3為gp全局指針,用來尋址全局變量。對于一個正常運行的程序,除了x0,gp兩個初始值固定的外,其余的均會是不確定的,所有在進行上下文保護時,均需要保存。用到硬件浮點的時候,更是要保存32個浮點寄存器。

1927392a-5285-11ec-b2e9-dac502259ad0.png

除了上述的寄存器,移植還要關心的是幾個csr寄存器mstatus,mepc。正常情況下大部分csr只能在機器模式下操作(WCH的v3和v4內核支持機器模式和用戶模式)。mstatus中,MIE為中斷使能,當進中斷時MPIE更新為MIE,返回時MIE更新為MPIE。MPP用于保存進中斷之前的特權模式,如果我們設置其為MPP=0b11,那么將一直處于機器模式,其mret返回后還是處于機器模式。mepc是機器模式下異常程序指針,其只會在發生異常是被更新(中斷也是一類異常),進異常時我們可以從另外兩個csr寄存器mcause來看引起異常原因通過mtval查看引起異常時的值。當從異常返回時mepc的值被更新給pc。我們正是通過進中斷修改mepc來實現任務的切換的,后面會詳細說明這個過程。

實時操作系統大家應該不陌生,常見的uCOSFreeRTOSRT-Thread,LiteOS-M等等,其基本的思路都是一樣的,需要一個定時器用于系統時間片的實現,一個中斷用于任務切換。想要其能夠在一個MCU上成功的跑起來,需要弄清除一下幾個事情:

(1)進中斷需要保存哪些內容。

從之前的描述中,應該知道,對于risc-v內核來說其進中斷壓棧的是caller saved的寄存器。從下圖一可以看出,進Systick中斷函數,先進行寄存器保存,退出中斷時進行寄存器恢復,如果開啟硬件浮點,同時還會對浮點寄存器進行保存和恢復。這個過程是編譯器幫我們實現,有一點需要注意的是我們移植的代碼里面進中斷后獲取了中斷的堆棧“csrrw sp,mscratch,sp”,返回時恢復了線程的堆棧指針“csrrw sp,mscratch,sp”中斷堆棧指針初始值是在任務開始時存入mscratch寄存器的,如果采用C形式中斷函數,中斷堆棧的獲取會在壓棧操作之后,中斷壓入的堆棧是當前運行任務的任務堆棧區域,如果想要中斷函數壓棧時壓入的自己的堆棧區域,可以使用匯編入口,進中斷后先修改sp,然后壓棧,再調用中斷處理函數,如圖二所示。

195e9816-5285-11ec-b2e9-dac502259ad0.png

圖1

19911e30-5285-11ec-b2e9-dac502259ad0.png

圖2

(2)任務棧需要保存哪些內容。

前文說過對于一個正常運行的程序,切換任務前,除了x0恒0,x3 gp指針外,其余的寄存器均需要保存,每個RTOS中都會定義一個上下文保存相關的結構體,這里我們以華為鴻蒙LiteOS_M為例,看一下這個結構體:

19bcc38c-5285-11ec-b2e9-dac502259ad0.png

圖3在創建任務的時候均會為一個任務分配一個id和堆棧大小并對這個堆棧做初始化:

19e7012e-5285-11ec-b2e9-dac502259ad0.png

圖4

1a148090-5285-11ec-b2e9-dac502259ad0.png

圖5任務創建好了后會關聯一個根據任務id關聯一個任務控制塊taskCB,總的任務個數是在頭文件中配置的(target_config.h)總的任務塊的初始化也是在LOS_KernelInit被初始化。

1a3da60a-5285-11ec-b2e9-dac502259ad0.png

圖6從上面可以看出來,task---》taskCB---》sp指針---》memory這樣的路線,而這片memory開始位置用于上下文保存。

這樣的方式在其他RTOS中也可以看到,例如RT-Thread中用于上下文保存的結構體rt_hw_stack_frame,和taskCB類似的結構體rt_thread等。

1a5ddab0-5285-11ec-b2e9-dac502259ad0.png

圖7

1a96f0de-5285-11ec-b2e9-dac502259ad0.png

圖8

(3)如何開啟任務調度。

前面看了每個任務上下文保存位置,注意到堆棧初始化的時候把任務的入口地址給了context-》epc。同時LiteOS_M源碼中定義了一個LosTask類型的全局變量g_losTask,其內部只有兩個任務控制塊指針,一個指向當前運行的任務,一個指向新任務,即要切換至的任務。

1abe904e-5285-11ec-b2e9-dac502259ad0.png

圖9當做好一系列初始化后,LiteOS會調用HalStartSchedule來初始化系統節拍定時器,并注冊系統定時器的中斷處理函數,然后開始轉向執行第一個任務,如下圖所示:

1ad415b8-5285-11ec-b2e9-dac502259ad0.png

圖10其中OsSchedStart函數從任務列表中獲取第一個任務,并賦值給g_losTask里面的runTask和newTask。然后調用HalStartToRun轉向執行runTask所指示的任務。HalStartToRun是一段匯編代碼,下面就具體看其如何切換至runTask,具體如下圖的注釋:

1afc5d3e-5285-11ec-b2e9-dac502259ad0.png

圖11這樣mret之后就轉向去執行第一個任務,并且不會再有返回,因為每個任務本身會是個循環,這里也就能理解其源碼注釋 never return的含義。

1b282f2c-5285-11ec-b2e9-dac502259ad0.png

圖12其他操作系統中也有類似的操作,例如RT-Thread中有個rt_hw_context_switch_to函數,其也是匯編代碼實現,它是一個帶參數的函數,其傳入的參數為(&to_thread-》sp),如下圖:

1b4fcd48-5285-11ec-b2e9-dac502259ad0.png

圖13從名字就可以看出,傳遞的參數為啟動執行的第一個線程的控制塊的堆棧指針sp的值,后面賦值mepc,mstatus,其他寄存器等等都是和LiteOS_M一致的。

(4)如何進行任務切換。

了解了如何切換至第一個任務,那么如何實現不同任務之間的切換呢,在這之前我們應該都有了解,RTOS是根據任務的優先級和時間片進行輪轉的,每個任務執行一段時間,然后切換至下一個任務執行。每次切換前我們需要把當前任務的運行狀態進行保存,然后切換至新任務,對其運行狀態進行恢復,如此循環反復,實現任務調度。時間片實現使用的是內核的SysTick定時器,LiteOS_M是在los_timer.c中實現的,這個只需要根據實際硬件的進行初始化就行。其他操作系統也是類似,像RT-Thread源碼中我們根據硬件完成board.c。對于任務切換,我們利用內核的軟中斷,只要使能該中斷,并且當需要切換任務時,把中斷控制器的對應的pendset位置1,即可觸發該中斷進行任務切換。下圖是liteOS_M切換過程:

1b739ac0-5285-11ec-b2e9-dac502259ad0.png

圖14

1b9e9180-5285-11ec-b2e9-dac502259ad0.png

圖15

其他操作系統也是大同小異,具體的區別僅僅是在切換新任務時,新任務如何獲取的問題,上圖可以看到LiteOS_M是通過g_losTask來管理,RT-Thread中定義了from_thread,to_thread,顧名思義從一個線程切換至另外一個線程。

弄清楚以上的問題,對于某一個RTOS的基本移植來說應該就比較明了。

最后移植好的鴻蒙os,RT-Thread等實時操作系統的代碼均已在MRS上線,可以直接創建,開發相關應用

1bca47e4-5285-11ec-b2e9-dac502259ad0.png

原文標題:RISC-V MCU開發實戰 (三):移植鴻蒙OS項目

文章出處:【微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。
責任編輯:pj

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

    關注

    37

    文章

    7402

    瀏覽量

    129321
  • RT-Thread
    +關注

    關注

    32

    文章

    1614

    瀏覽量

    44887
  • 鴻蒙OS
    +關注

    關注

    0

    文章

    193

    瀏覽量

    5488

原文標題:RISC-V MCU開發實戰 (三):移植鴻蒙OS項目

文章出處:【微信號:gh_9b9470648b3c,微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    拓維信息旗下在鴻OS 3.0 讓OpenClaw開箱即用

    2026年初,開源項目OpenClaw引爆AI智能體新一輪熱潮,加速釋放人工智能從“對話”邁向“執行”的強烈信號。拓維信息及旗下開鴻智谷作為開源鴻蒙核心共建單位、開源鴻蒙項目群A類捐贈
    的頭像 發表于 03-04 17:46 ?356次閱讀
    拓維信息旗下在鴻<b class='flag-5'>OS</b> 3.0  讓OpenClaw開箱即用

    使用RTOS時需要注意的幾點內容分享

    對許多嵌入式項目來說,系統設計師都傾向于選擇實時操作系統(RTOS)。但RTOS總是必要的嗎? 答案是取決于具體的應用,因此了解我們要達到什么目標是決定RTOS是必要的還是花瓶的關鍵
    發表于 12-23 06:34

    選擇RTOS的要點

    對于許多嵌入式項目來說,在采用非實時操作系統(non-RTOS)的任何場合,也都可采用RTOS。但是,要找到一款具有完全相同應用編程接口(API)的匹配RTOS就相當困難了。因此,許多
    發表于 12-12 08:00

    開源鴻蒙項目順利孵化畢業

    2025年11月21日,2025開放原子開發者大會在北京隆重啟幕。作為本次大會的重磅環節和核心焦點之一,在大會開幕式上,開放原子開源基金會(以下簡稱“基金會”)宣布開源鴻蒙項目達成開源孵化目標、順利畢業,這是項目開源共建五年來最
    的頭像 發表于 11-27 14:36 ?561次閱讀

    學習RTOS的意義?

    對于嵌入式軟件工程師,學習RTOS非常有必要。 1. 項目需要 隨著產品要實現的功能越來越多,單純的裸機系統已經不能完美地解決問題,反而會使編程變得更加復雜,如果想降低編程的難度,就必須引入
    發表于 11-27 08:16

    開源鴻蒙項目達成開源孵化目標順利畢業

    11月21日,2025開放原子開發者大會在北京隆重啟幕。作為本次大會的重磅環節和核心焦點之一,在大會開幕式上,開源鴻蒙項目達成開源孵化目標、順利畢業,這是項目開源共建五年來最具意義的成果之一。
    的頭像 發表于 11-25 17:36 ?1160次閱讀

    開源鴻蒙技術大會2025丨OS內核與視窗分論壇:筑基開源鴻蒙核心內核,共拓視窗技術邊界

    開源鴻蒙技術大會2025 OS內核與視窗分論壇在湖南長沙國際會議中心圓滿舉行。來自西北工業大學、浙江大學、廈門大學、華為等高校和企業的學者專家齊聚一堂,圍繞鴻蒙內核通信機制、智能渲染、內存緩存優化、端云協同備份及空間視窗架構等前
    的頭像 發表于 11-20 17:29 ?870次閱讀
    開源<b class='flag-5'>鴻蒙</b>技術大會2025丨<b class='flag-5'>OS</b>內核與視窗分論壇:筑基開源<b class='flag-5'>鴻蒙</b>核心內核,共拓視窗技術邊界

    開源鴻蒙技術大會2025丨OS原生智能分論壇圓滿舉辦

    開源鴻蒙技術大會2025 OS原生智能分論壇在湖南長沙國際會議中心圓滿舉行。來自學術界與產業界的多位專家學者齊聚一堂,圍繞端側AI、智能體(Agent)技術、大模型高效推理等前沿議題展開深度交流
    的頭像 發表于 11-20 17:28 ?731次閱讀
    開源<b class='flag-5'>鴻蒙</b>技術大會2025丨<b class='flag-5'>OS</b>原生智能分論壇圓滿舉辦

    請問芯源MCU如何移植RTOS

    請問芯源MCU如何移植RTOS?有相關的移植教程嘛?
    發表于 11-14 07:58

    FreeRTOS與uC/OS-II如何選擇?

    /OS-II: 你非常熟悉 Jean Labrosse 的書或其設計理念。 你在維護一個歷史悠久的、基于 uC/OS-II 的項目。 你的應用對極端可靠性和確定性有非常高的要求(其嚴謹的設計和歷史認證背景
    發表于 11-13 07:15

    開源鴻蒙6.0 Release版本重磅發布

    近日,在長沙國際會議中心舉辦的開源鴻蒙技術大會2025上,開放原子開源鴻蒙(即OpenAtom OpenHarmony,簡稱“開源鴻蒙”)項目群正式發布開源
    的頭像 發表于 10-10 16:49 ?2877次閱讀

    項目實戰】基于Hi3861的鴻蒙智能小車(循跡、超聲波避障、遠程控制、語音控制、4G定位)有教程代碼

    入門鴻蒙物聯網找不到“落地”項目——要么功能簡單練不到核心,要么資料零散易半途而廢。本次【項目實戰】聚焦基于Hi3861的鴻蒙智能小車,整合了循跡、超聲波避障、遠程控制、語音交互和4G
    的頭像 發表于 09-10 17:13 ?1311次閱讀
    【<b class='flag-5'>項目</b>實戰】基于Hi3861的<b class='flag-5'>鴻蒙</b>智能小車(循跡、超聲波避障、遠程控制、語音控制、4G定位)有教程代碼

    為您的 Raspberry Pi 項目選擇正確的實時操作系統(RTOS

    選擇合適的操作系統對于項目的成功至關重要。了解如何在RaspberryPi上使用RTOS,并看看你有哪些選擇吧!從OS到RTOSRaspberryPi是由RaspberryPi基金會推出的一系列
    的頭像 發表于 03-25 09:40 ?1257次閱讀
    為您的 Raspberry Pi <b class='flag-5'>項目</b>選擇正確的實時操作系統(<b class='flag-5'>RTOS</b>)

    芯科科技擴展Zephyr RTOS項目支持

    多年來一直在編寫高效、輕量級的驅動程序、協議棧,甚至內核,同時也充分利用開源軟件。最近,我們加大了對Zephyr實時操作系統 (RTOS) 這一熱門開源項目的支持力度。
    的頭像 發表于 03-19 10:44 ?1405次閱讀

    移植LWIP+FREERTOS時遇到的問題怎么解決?

    中斷,并且再也沒法ping 通的問題,表現的現象是進不去以太網中斷,導致 ethernetif_input()接收不到數據 移植過程是這樣的:(STM32F407+DP83848) 1:首先移植RTOS
    發表于 03-11 06:48