色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

OPENHW開源CORE-V-MCU移植RT-Thread

冬至子 ? 來源:藥RV ? 作者:藥RV ? 2023-10-13 14:58 ? 次閱讀

前期準備
開發環境:ubuntu18.04

驗證示例工程
本次實驗驗證的平臺是PLCT提供的QEMU,在Linux下的QEMU可以使用上述的筆者編譯好的,也可以使用自己嘗試編譯PLCT提供的源碼。

OPENHW提供了基于FreeRTOS的示例工程,由于使用的是PLCT提供的QEMU,所以IDE中自帶的工程并不能直接使用,為了避免不必要的麻煩,本文采用PLCT提供的示例工程。

下載好示例工程,進入到app目錄,執行以下命令配置編譯工程:

source ../env/core-v-mcu.sh

make RISCV=xxx //xxx為工具鏈的路徑

編譯完成后將生成的cli_test可執行文件拷到qemu的安裝目錄,運行下述命令驗證工程;

./qemu-system-riscv32 -M core_v_mcu -bios none -kernel cli_test -nographic -monitor none -serial stdio

運行結果:

1.jpg

出現上述結果,則表示示例工程運行正常,這樣我們就有一個可移植的模板工程,后續移植基于該工程開展。

移植RT-Thread
CV32E40P內核是一個RISC-V架構的內核,移植RTOS不可避免的會涉及到匯編部分的修改,所以在移植前期學習一下RISC-V架構與匯編會產生事半功倍的效果,同樣在一之前需要熟悉CV32E40P的內核資源。

cv32e40p繼承自pulp開源的RI5CY內核,而RI5CY內核的對接代碼在RT-Thread的倉庫libcpu/riscv/rv32m1已經實現,所以以RI5CY中的代碼為基礎,移植cv32e40p的對接代碼。

成功移植RT-Thread有如下幾個關鍵的階段:

節拍定時器正常工作
線程可以正常創建,調度(這步最難,需要前面好多工作來保證)
shell可以正常使用(從這開始就順利多了)
RTOS的最小時間單位是系統節拍,系統正常工作需要節拍定時器的支持,因而以節拍定時器的移植為切入點展開移植。

core-v-mcu.c中放置的是系統初始化,中斷處理相關代碼。其中system_init函數完成了時鐘初始化,串口,I2C等外設的初始化,以及中斷函數的綁定。在文件的開頭可以找到如下一個指針數組:

void (*isr_table[32])(uint32_t);
該數組用于綁定中斷入口函數。

for (int i = 0 ; i < 32 ; i ++){
isr_table[i] = undefined_handler;
handler_count[i] = 0;
}
isr_table[0x7] = timer_irq_handler;
isr_table[0xb] = (void(*)(uint32_t))fc_soc_event_handlzer1;
在system_init函數中我們可以找到上述代碼,瀏覽該文件我們可以知道,timer_irq_handler即系統定時器的中斷入口函數,

在原有FreeRTOS工程中該函數內容如下:

void timer_irq_handler(uint32_t mcause)
{
#warning requires critical section if interrupt nesting is used.
if (xTaskIncrementTick() != 0) {
vTaskSwitchContext();
}
}
該函數實現系統節拍的產生,所以將這里的內容修改為RT-Thread的節拍產生的方式,修改如下:

void timer_irq_handler(uint32_t mcause)
{
#warning requires critical section if interrupt nesting is used.
rt_interrupt_enter();
rt_tick_increase();
rt_interrupt_leaves();
}

涉及到中斷,我們就得考慮系統的中斷的實現方式,中斷一般會分為向量中斷與非向量中斷。RISC-V常在啟動后文件中進行中斷模式的配置。從crt0.S文件可以找到如下代碼:

/* set vector table address /
la a0, __vector_start
or a0, a0, 1 /
enable vectored mode (hardcoded anyway for CV32E40P) */
csrw mtvec, a0

RISC-V規范定義中斷、異常的入口地址,以及模式使用mtvec寄存器配置,上述代碼將系統的中斷模式配置為了向量模式,向量模式下,每個函數均包含一個獨立的入口函數用來處理中斷。所以我們切換至寫中斷向量表的文件vector.S,我們可以很明顯的看到一段代碼,從名字就可以看出下面是一張向量表 :

vector_table:
j freertos_risc_v_trap_handler // irq0
j freertos_risc_v_trap_handler
j freertos_risc_v_trap_handler
j freertos_risc_v_trap_handler // irq3
j freertos_risc_v_trap_handler
j freertos_risc_v_trap_handler
j freertos_risc_v_trap_handler
j freertos_risc_v_trap_handler //ctxt_handler // irq 7 mtime or timer
j freertos_risc_v_trap_handler
j freertos_risc_v_trap_handler
j h7// freertos_risc_v_trap_handler
j freertos_risc_v_trap_handler // irq 11 Machine (event Fifo)
j freertos_risc_v_trap_handler
j freertos_risc_v_trap_handler
j freertos_risc_v_trap_handler
j freertos_risc_v_trap_handler
j freertos_risc_v_trap_handler // IRQ16
j freertos_risc_v_trap_handler // IRQ17
j freertos_risc_v_trap_handler // IRQ18
j freertos_risc_v_trap_handler // IRQ19
j freertos_risc_v_trap_handler // IRQ20
j freertos_risc_v_trap_handler // IRQ21
j freertos_risc_v_trap_handler // IRQ22
j freertos_risc_v_trap_handler // IRQ23
j freertos_risc_v_trap_handler // IRQ24
j freertos_risc_v_trap_handler // IRQ25
j freertos_risc_v_trap_handler // IRQ26
j freertos_risc_v_trap_handler // IRQ27
j freertos_risc_v_trap_handler // IRQ28
j freertos_risc_v_trap_handler // IRQ29
j freertos_risc_v_trap_handler // IRQ30
j freertos_risc_v_trap_handler // IRQ30

PS:上述向量表看的我懵了好久啊,相信對于剛接觸底層不久的小伙伴也會有同樣的感受吧,向量表不是一張多姿多彩的表嗎,怎么感覺都一樣啊???不急,我們在看一下core-v-mcu.c這個文件,又會發現一段非常顯眼的代碼:

void vSystemIrqHandler(uint32_t mcause)
{
uint32_t val = 0;
// extern void (*isr_table[32])(uint32_t);
isr_table[mcause & 0x1f](mcause & 0x1f);
}
結合上文,思考一下大致可以明白這個函數的作用了:分發中斷。即所有的異常與中斷觸發后均會執行這個函數,那我們全局搜索一下這個函數,找一下是哪里調用了.全局搜索可以找到如下代碼:

CPPFLAGS += -DportasmHANDLE_INTERRUPT=vSystemIrqHandler
繼續搜索DportasmHANDLE_INTERRUPT可從portASM.S找到如下代碼;

load_x sp, xISRStackTop /* Switch to ISR stack before function call. */
jal portasmHANDLE_INTERRUPT
j processed_source

瀏覽代碼可知,系統觸發中斷或異常后最終均會執行vSystemIrqHandler函數,該函數是在freertos_risc_v_trap_handler函數中被調用,至此我們大致可以明白整個過程了,當中斷或者異常出發后,會查詢向量表,執行freertos_risc_v_trap_handler函數,該函數會調用vSystemIrqHandler,經其分發后最終執行到系統初始化時綁定的中斷入口函數。

在RT-Thread 中由interrupt_gcc.S中的函數實現vSystemIrqHandler函數的調用,所以我們修改中斷向量表的內容如下:

vector_table:
j IRQ_Handler // irq0
j IRQ_Handler
j IRQ_Handler
j IRQ_Handler // irq3
j IRQ_Handler
j IRQ_Handler
j IRQ_Handler
j IRQ_Handler //ctxt_handler // irq 7 mtime or timer
j IRQ_Handler
j IRQ_Handler
j IRQ_Handler // IRQ_Handler
j IRQ_Handler // irq 11 Machine (event Fifo)
j IRQ_Handler
j IRQ_Handler
j IRQ_Handler
j IRQ_Handler
j IRQ_Handler // IRQ16
j IRQ_Handler // IRQ17
j IRQ_Handler // IRQ18
j IRQ_Handler // IRQ19
j IRQ_Handler // IRQ20
j IRQ_Handler // IRQ21
j IRQ_Handler // IRQ22
j IRQ_Handler // IRQ23
j IRQ_Handler // IRQ24
j IRQ_Handler // IRQ25
j IRQ_Handler // IRQ26
j IRQ_Handler // IRQ27
j IRQ_Handler // IRQ28
j IRQ_Handler // IRQ29
j IRQ_Handler // IzRQ30
j IRQ_Handler // IRQ30

瀏覽IRQ_Handler可知,觸發中斷或異常均會執行該代碼,該函數的主要的功能就是實現了軟件保存上下文。根據RISC-V規范可知,RISC-V架構定義不支持硬件壓棧,所以需要軟件實現這部分,這樣做的出發點大概是為了簡化RISC-V架構的內核的設計吧!!!

libcpu/riscv/rv32m1中的IRQ_Handler函數存在如下內容

/* switch to interrupt stack */
la    sp, __stack            // 移植時需修改
/* interrupt handle */
call  rt_interrupt_enter
csrr  a0, mcause
csrr  a1, mepc
mv    a2, sp
call  SystemIrqHandler       // 移植時需修改
call  rt_interrupt_leave

這部分的作用是,加載中斷棧的棧頂地址與執行保存上文之后的工作,這里是調用SystemIrqHandler函數進行中斷分發,修改如下:

/* switch to interrupt stack */
la    sp, __freertos_irq_stack_top //棧頂地址 位于鏈接腳本中 
/* interrupt handle */
call  rt_interrupt_enter
csrr  a0, mcause
csrr  a1, mepc
mv    a2, sp
call  vSystemIrqHandler            // 調用vSystemIrqHandler函數
call  rt_interrupt_leave

在board.c的rt_hw_board_init函數中,添加如下代碼:

vPortSetupTimerInterrupt();//初始化定時器
volatile uint32_t mtvec = 0;
__asm volatile( "csrr %0, mtvec" : "=r"( mtvec ) );//聲明僅有一張向量表
__asm volatile( "csrs mie, %0" :: "r"(0x880) );//使能定時器中斷與外部中斷

至此,基本的移植工作已經完成,可以采用靜態創建任務的方式,實現多任務的創建與調度。

動態內存

在board.c添加下述代碼:

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
#define RT_HEAP_SIZE (64*1024)
static rt_uint8_t rt_heap[RT_HEAP_SIZE];
void *rt_heap_begin_get(void)
{
return rt_heap;
}
void *rt_heap_end_get(void)
{
return rt_heap + RT_HEAP_SIZE;
}
#endif
在rt_hw_board_init添加下述代碼:

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif

完成上述工作便可使用RT-Thread的動態內存相關接口,同樣可以種動態創建線程的函數。

shell

在鏈接腳本的.text段添加如下內容

/* section information for finsh shell */
. = ALIGN(4);
__fsymtab_start = .;
KEEP(*(FSymTab))
__fsymtab_end = .;
. = ALIGN(4);
__vsymtab_start = .;
KEEP(*(VSymTab))
__vsymtab_end = .;
. = ALIGN(4);

實現以下函數:

char rt_hw_console_getchar(void)
{
return udma_uart_getchar(0);
}
void rt_hw_console_output(const char str)
{
writeraw(0, strlen(str), (uint8_t
)str);
}
注:writeraw函數來自udma_uart_writeraw,去掉了其中涉及FreeRTOS的API.

完成上述部分便可以使用RT-Thread的shell。

自動初始化
在鏈接腳本的.text段添加如下內容:

/* section information for initial. */
. = ALIGN(4);
__rt_init_start = .;
KEEP(*(SORT(.rti_fn*)))
__rt_init_end = .;
. = ALIGN(4);

添加上述代碼后便可使用RT-Thread的自動初始化接口。

結果驗證

在生成的目標文件的目錄下,輸入運行命令,示例命令:

/home/wangshun/bin/qemu-riscv/bin/qemu-system-riscv32 -M core_v_mcu -bios none -kernel rtthread.elf -nographic -monitor none -serial stdio

使用時,/home/wangshun/bin/qemu-riscv/bin/修改為用戶的qemu的路徑。

運行結果如下:

| /

RT - Thread Operating System
/ | 5.0.0 build Dec 16 2022 11:25:07
2006 - 2022 Copyright by RT-Thread team
Hello RT-Thread
msh >help
RT-Thread shell commands:
finshToCLI - Switch to CLI: CLI component of Core-V-MCU
pin - pin [option]
clear - clear the terminal screen
version - show RT-Thread version information
list - list objects
help - RT-Thread shell help.
ps - List threads in the system.
free - Show the memory usage in the system.
msh >ps
thread pri status sp stack size max used left tick error


tshell 20 running 0x00000160 0x00001000 22% 0x00000009 OK
tidle0 31 ready 0x000000f0 0x00000100 98% 0x1c05e62d OK
timer 4 suspend 0x000000e0 0x00000200 43% 0x00000008 OK
msh >

至此,移植RT-Thread至OPENHW開源的基于CV32E40P內核的CORE-V-MCU便移植完成。

CORE-V-MCU bsp
core-v-mcu的bsp已經合并至RT-Thread的主倉庫,并配有詳細的使用說明,鏈接。

小結

在為RISC-V移植RTOS時,筆者認為要具備RISC-V架構規范與編程規范的基本的了解,磨刀不誤砍柴工嘛,雖然在寫本文時洋洋灑灑寫的很自在,但是在移植的過程中每遇到一個坑就會卡好久,不過也不要妄自菲薄,經過這么一個過程就好很多了,此時不禁讓人感慨“兩岸猿聲啼不住,輕舟已過萬重山”。

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

    關注

    23

    文章

    3250

    瀏覽量

    114912
  • MCU控制
    +關注

    關注

    0

    文章

    48

    瀏覽量

    6739
  • RT-Thread
    +關注

    關注

    31

    文章

    1293

    瀏覽量

    40192
  • Ubuntu系統
    +關注

    關注

    0

    文章

    91

    瀏覽量

    3964
  • qemu
    +關注

    關注

    0

    文章

    57

    瀏覽量

    5357
收藏 人收藏

    評論

    相關推薦

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

    RT-Thread 是國人自主研發的開源實時操作系統(RTOS),RT-Thread Nano 是極簡版的硬實時內核,內存占用小,移植簡單。VGLite 是 NXP 提供的輕量級 2D
    的頭像 發表于 11-09 11:20 ?2718次閱讀
    i.MX <b class='flag-5'>RT</b>1170:VGLite<b class='flag-5'>移植</b><b class='flag-5'>RT-Thread</b> Nano過程講解(上)

    OPENHW開源CORE-V-MCU移植RT-Thread的流程

    %0x00000008 OKmsh >至此,移植RT-ThreadOPENHW開源的基于CV32E40P內核的CORE-V-MCU便
    發表于 02-09 14:32

    移植RT-Thread的原理與方法

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

    【國產MCU移植】HC32F460基于Keil MDK 移植 RT-Thread Nano

    【國產MCU移植】HC32F460基于Keil MDK 移植 RT-Thread Nano
    發表于 11-18 18:51 ?65次下載
    【國產<b class='flag-5'>MCU</b><b class='flag-5'>移植</b>】HC32F460基于Keil MDK <b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> Nano

    【國產MCU系列】在 HK32F030 上移植 RT-Thread Nano

    如需下載相關開源資料請點擊閱讀原文這是一個航順 HK32F030 的 RT-Thread Nano 移植示例,記錄了在 Keil 裸機工程的基礎上進行 RT-Thread Nano
    發表于 11-21 18:51 ?42次下載
    【國產<b class='flag-5'>MCU</b>系列】在 HK32F030 上<b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> Nano

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

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

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

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

    RT-Thread移植到GD32F150系列MCU

    RT-Thread移植到GD32F150系列MCU
    發表于 12-07 19:36 ?7次下載
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>移植</b>到GD32F150系列<b class='flag-5'>MCU</b>

    RT-Thread系統移植到STM32f103

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

    基于 Keil MDK 移植 RT-Thread Nano

    本文介紹如何基于 Keil MDK 移植 RT-Thread Nano ,并以一個 stm32f103 的基礎工程作為示例進行講解。 RT-Thread Nano 已集成在 Keil MD...
    發表于 01-26 17:04 ?16次下載
    基于 Keil MDK <b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> Nano

    RT-Thread操作系統的FreeRTOS兼容層

    項目。已經于2022年9月由唐照洲(美國佐治亞理工學院,大四)順利結項完成。FreeRTOS兼容層目前已經落地到RT-Thread對ESP32-IDF(唐照洲)和core-v-mcu(王順)兩款SDK
    的頭像 發表于 01-14 00:55 ?1657次閱讀

    OPENHW開源CORE-V-MCU移植RT-Thread

    OPENHW提供了基于FreeRTOS的示例工程,由于使用的是PLCT提供的QEMU,所以IDE中自帶的工程并不能直接使用,為了避免不必要的麻煩,本文采用PLCT提供的示例工程。
    的頭像 發表于 02-01 10:05 ?2182次閱讀

    RT-Thread文檔_內核移植

    RT-Thread文檔_內核移植
    發表于 02-22 18:31 ?3次下載
    <b class='flag-5'>RT-Thread</b>文檔_內核<b class='flag-5'>移植</b>

    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>

    機智云設備移植RT-Thread

    開發環境:Keil版本:V5.30RT-Thread版本:3.1.5STM32cubeMX:V6.0.1開發板MCU:STM32F103機智云平臺生成的應用代碼是裸機版本的,而在實際應用過
    的頭像 發表于 04-19 18:39 ?981次閱讀
    機智云設備<b class='flag-5'>移植</b><b class='flag-5'>RT-Thread</b>
    主站蜘蛛池模板: 曼谷av女郎| 琪琪的色原网站| 窝窝午夜色视频国产精品东北| 成激人情在线影院920| 色欲AV亚洲情无码AV蜜桃| 国产精品999| 亚洲AV 中文字幕 国产 欧美| 好男人视频免费高清在线观看www| 亚洲午夜精品A片久久不卡蜜桃| 老司机福利在视频在ae8| 24小时日本在线| 日本另类z0zxhd| 国产精品永久在线| 在线观看成人免费视频| 免费果冻传媒2021视频| 国产99久久久欧美黑人刘玥 | 爱如潮水3免费观看日本| 日日射夜夜干夜夜插在线播放| 国产一级特黄aa毛片| 777精品久无码人妻蜜桃| 污文啊好棒棒啊好了| 久久婷五月综合色啪首页| 纯肉合集(高H)| 怡春院院日本一区二区久久| 青青青青青青草| 久久99AV无色码人妻蜜| 白丝女仆被强扒内裤| 亚洲无吗在线视频| 日本枯瘦娇小| 久久亚洲人成网站| 国产精品久久国产三级国不卡顿 | 干了快生了的孕妇| 在线日本高清日本免费| 日日摸夜夜添无码AVA片| 九九免费高清在线观看视频| yellow片在线观看免费观看动漫| 性欧美xxxxporn| 日本美国群交P片内射捆绑| 久久精品视在线-2| 国产精品久久久久久久AV下载| 98久久人妻无码精品系列蜜桃|