女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于RTOS的基本移植鴻蒙OS項目

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

掃碼添加小助手

加入工程師交流群

移植準(zhǔn)備:

軟件平臺:MounRiver Studio( MRS);

硬件平臺: CH32V307開發(fā)板;

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

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

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

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

下面說些移植操作系統(tǒng)的注意事項:

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

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

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

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

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

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

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

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

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

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

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

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

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

圖1

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

圖2

(2)任務(wù)棧需要保存哪些內(nèi)容。

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

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

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

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

圖4

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

圖5任務(wù)創(chuàng)建好了后會關(guān)聯(lián)一個根據(jù)任務(wù)id關(guān)聯(lián)一個任務(wù)控制塊taskCB,總的任務(wù)個數(shù)是在頭文件中配置的(target_config.h)總的任務(wù)塊的初始化也是在LOS_KernelInit被初始化。

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

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

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

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

圖7

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

圖8

(3)如何開啟任務(wù)調(diào)度。

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

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

圖9當(dāng)做好一系列初始化后,LiteOS會調(diào)用HalStartSchedule來初始化系統(tǒng)節(jié)拍定時器,并注冊系統(tǒng)定時器的中斷處理函數(shù),然后開始轉(zhuǎn)向執(zhí)行第一個任務(wù),如下圖所示:

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

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

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

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

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

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

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

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

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

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

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

圖14

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

圖15

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

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

最后移植好的鴻蒙os,RT-Thread等實時操作系統(tǒng)的代碼均已在MRS上線,可以直接創(chuàng)建,開發(fā)相關(guān)應(yīng)用

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

原文標(biāo)題:RISC-V MCU開發(fā)實戰(zhàn) (三):移植鴻蒙OS項目

文章出處:【微信公眾號:電子發(fā)燒友論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
責(zé)任編輯:pj

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7150

    瀏覽量

    125573
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1409

    瀏覽量

    41934
  • 鴻蒙OS
    +關(guān)注

    關(guān)注

    0

    文章

    191

    瀏覽量

    4987

原文標(biāo)題:RISC-V MCU開發(fā)實戰(zhàn) (三):移植鴻蒙OS項目

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

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

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

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

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

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

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

    開源鴻蒙榮獲開放原子“2024年度操作系統(tǒng)領(lǐng)域國內(nèi)活躍開源項目

    近日,2024開放原子開發(fā)者大會暨首屆開源技術(shù)學(xué)術(shù)大會在武漢圓滿召開。在大會開幕式“2024年度國內(nèi)活躍開源項目&開發(fā)者致謝儀式”上,開放原子開源鴻蒙(OpenAtom OpenHarmony,簡稱
    的頭像 發(fā)表于 12-28 15:39 ?895次閱讀

    鴻蒙Flutter實戰(zhàn):14-現(xiàn)有Flutter 項目支持鴻蒙 II

    引言 在之前的文章鴻蒙Flutter實戰(zhàn):09-現(xiàn)有Flutter項目支持鴻蒙中,介紹了如何改造項目,適配鴻蒙平臺。 文中講述了整體的理念和
    發(fā)表于 12-26 14:59

    鴻蒙案例技術(shù)分享 | 基于AIoT-3568X的鴻蒙通行一體機方案項目

    。01/項目概述項目使用場景鴻蒙版通行一體機方案憑借自主可控,支持人臉識別、人證核驗、智能開閉閘技術(shù)、通行數(shù)據(jù)溯源、安全可靠等優(yōu)勢,可適用于:1、政府機關(guān)、企事業(yè)單位
    的頭像 發(fā)表于 12-13 16:25 ?1029次閱讀
    <b class='flag-5'>鴻蒙</b>案例技術(shù)分享 | 基于AIoT-3568X的<b class='flag-5'>鴻蒙</b>通行一體機方案<b class='flag-5'>項目</b>

    多平臺FPGA工程快速移植與構(gòu)建

    作為一名FPGA工程師,經(jīng)常需要在多個FPGA設(shè)備之間移植項目,核心的問題是IP的管理和移植,今天通過安裝和使用 FuseSoC 在多個 AMD FPGA 之間移植一個簡單的
    的頭像 發(fā)表于 11-20 16:12 ?1905次閱讀
    多平臺FPGA工程快速<b class='flag-5'>移植</b>與構(gòu)建

    鴻蒙Flutter實戰(zhàn):09-現(xiàn)有Flutter項目支持鴻蒙

    # 鴻蒙Flutter實戰(zhàn):現(xiàn)有Flutter項目支持鴻蒙 ## 背景 原來使用Flutter開發(fā)的項目,需要適配鴻蒙。 ## 環(huán)境搭
    發(fā)表于 10-23 16:36

    鴻蒙Flutter實戰(zhàn):07混合開發(fā)

    # 鴻蒙Flutter實戰(zhàn):混合開發(fā) 鴻蒙Flutter混合開發(fā)主要有兩種形式。 ## 1.基于har 將flutter module打包成har包,在原生鴻蒙項目中,以har包
    發(fā)表于 10-23 16:00

    深入解析Zephyr RTOS的技術(shù)細(xì)節(jié)

    Zephyr是一個針對資源受限設(shè)備優(yōu)化的小型、可縮放、多體系架構(gòu)實時操作系統(tǒng)(RTOS)。Zephyr由Linux基金會維護[1],是一個以構(gòu)建業(yè)界最佳的RTOS為目標(biāo)的開源合作項目。近年來
    的頭像 發(fā)表于 10-22 16:47 ?2220次閱讀
    深入解析Zephyr <b class='flag-5'>RTOS</b>的技術(shù)細(xì)節(jié)

    請問RTOS系統(tǒng)中的音頻PDM轉(zhuǎn)PCM的算法庫能移植到CONTIKI系統(tǒng)嗎?

    目的是計算分貝值,需要把數(shù)字音頻傳感器輸出的PDM信號轉(zhuǎn)換成PCM信號,然后計算分貝值,所以想移植RTOS庫,請問可以嗎?
    發(fā)表于 10-22 08:01

    史無前例,移植V8虛擬機到純血鴻蒙系統(tǒng)

    Android系統(tǒng)使用V8,然而,鴻蒙系統(tǒng)卻沒有可以執(zhí)行Roma框架的JS引擎,因此需要移植一個JS引擎到鴻蒙平臺。 二、
    的頭像 發(fā)表于 09-18 10:28 ?1743次閱讀
    史無前例,<b class='flag-5'>移植</b>V8虛擬機到純血<b class='flag-5'>鴻蒙</b>系統(tǒng)

    【免費分享】OpenHarmony鴻蒙物聯(lián)網(wǎng)開發(fā)板資料包一網(wǎng)打盡,附教程/視頻/項目/源碼...

    ?想要深入學(xué)習(xí)鴻蒙設(shè)備開發(fā)及鴻蒙物聯(lián)網(wǎng)開發(fā)嗎?現(xiàn)在機會來了!我們?yōu)槌鯇W(xué)者們準(zhǔn)備了一份全面的資料包,包括原理圖、教程、視頻、項目、源碼等,所有資料全部免費領(lǐng)取,課程視頻可試看(購買后看完整版),讓你
    的頭像 發(fā)表于 09-14 14:09 ?939次閱讀
    【免費分享】OpenHarmony<b class='flag-5'>鴻蒙</b>物聯(lián)網(wǎng)開發(fā)板資料包一網(wǎng)打盡,附教程/視頻/<b class='flag-5'>項目</b>/源碼...

    freertos和rtos區(qū)別是什么

    FreeRTOS 和 RTOS(實時操作系統(tǒng))是兩個不同的概念,但它們之間有緊密的聯(lián)系。FreeRTOS 是一個特定的開源實時操作系統(tǒng),而 RTOS 是實時操作系統(tǒng)的一般概念。 概念定義 RTOS
    的頭像 發(fā)表于 09-02 14:18 ?3016次閱讀

    RTOS的特性和類型

    實時操作系統(tǒng)(RTOS)是一種可運行實時計算應(yīng)用程序的軟件平臺,用于處理具有明確時間約束的事件和數(shù)據(jù)。與通用操作系統(tǒng)(GPOS)不同,RTOS必須在有限的硬件資源上調(diào)度應(yīng)用程序之間的處理和數(shù)據(jù)共享
    的頭像 發(fā)表于 08-20 11:29 ?1488次閱讀