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

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

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

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

移植RT-Thread的原理與方法

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來(lái)源:驚覺(jué)嵌入式 ? 作者:驚覺(jué) ? 2021-09-17 09:41 ? 次閱讀

大家好我是驚覺(jué)。是的,失蹤人口回來(lái)了。最近參加了rt-thread的國(guó)產(chǎn)MCU移植活動(dòng),移植rt-thread到華大的HC32L196。rtt論壇中已有許多介紹移植到各種平臺(tái)的文章,詳細(xì)講述移植步驟,在rtt論壇搜索“國(guó)產(chǎn)MCU移植”即可閱讀。本文不介紹具體移植步驟,而是如往常一樣,分享移植的原理與方法。

移植原理

移植一款軟件,無(wú)非是獲取源碼,修改其中與硬件相關(guān)的代碼以適配目標(biāo)硬件。移植rt-thread也是如此,首要任務(wù)是要明確要修改哪部分內(nèi)容。帶著這個(gè)問(wèn)題,我們來(lái)分析rt-thread的源碼結(jié)構(gòu)。

rt-thread源碼結(jié)構(gòu)

rt-thread源碼根目錄結(jié)構(gòu)如下:

目錄說(shuō)明

bsp板級(jí)支持包。存放各種硬件平臺(tái)的驅(qū)動(dòng)代碼,初始化代碼,工程文件。

components組件。如finsh控制臺(tái),抽象層驅(qū)動(dòng),文件系統(tǒng),網(wǎng)絡(luò)系統(tǒng)。

examples示例程序

include內(nèi)核以及l(fā)ibc的頭文件

libcpu與CPU架構(gòu)相關(guān)的接口,為操作系統(tǒng)調(diào)度提供支持。

src內(nèi)核代碼,如線程、定時(shí)器、線程間通信(互斥鎖,信號(hào)量)。

移植所涉及的目錄有兩個(gè):bsp和libcpu,相應(yīng)的移植分為BSP移植與CPU架構(gòu)移植。其他的目錄與具體的CPU無(wú)關(guān),無(wú)須改動(dòng)。

CPU架構(gòu)移植

嵌入式領(lǐng)域有多種不同 CPU 架構(gòu),例如 Cortex-M、ARM920T、MIPS32、RISC-V 等等。為了使 RT-Thread 能夠在不同 CPU 架構(gòu)的芯片上運(yùn)行,RT-Thread 提供了一個(gè) libcpu 抽象層來(lái)適配不同的 CPU 架構(gòu)。向下提供了一套統(tǒng)一的 CPU 架構(gòu)移植接口,這部分接口包含了全局中斷開(kāi)關(guān)函數(shù)、線程上下文切換函數(shù)、時(shí)鐘節(jié)拍的配置和中斷函數(shù)、Cache 等等內(nèi)容。下表是 CPU 架構(gòu)移植需要實(shí)現(xiàn)的接口和變量。

函數(shù)和變量描述

rt_base_t rt_hw_interrupt_disable(void);關(guān)閉全局中斷

void rt_hw_interrupt_enable(rt_base_t level);打開(kāi)全局中斷

rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit);線程棧的初始化,內(nèi)核在線程創(chuàng)建和線程初始化里面會(huì)調(diào)用這個(gè)函數(shù)

void rt_hw_context_switch_to(rt_uint32 to);沒(méi)有來(lái)源線程的上下文切換,在調(diào)度器啟動(dòng)第一個(gè)線程的時(shí)候調(diào)用,以及在 signal 里面會(huì)調(diào)用

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 線程,用于中斷里面進(jìn)行切換的時(shí)候使用

rt_uint32_t rt_thread_switch_interrupt_flag;表示需要在中斷里進(jìn)行切換的標(biāo)志

rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread;在線程進(jìn)行上下文切換時(shí)候,用來(lái)保存 from 和 to 線程

是不是看起來(lái)挺復(fù)雜的,其實(shí)rtt已經(jīng)支持了非常多的CPU架構(gòu)。下圖的libcpu目錄中已支持多種CPU架構(gòu)。讓我們看看對(duì)arm系列的支持情況,從低端的cortex-m0到高端的cortex-m7,甚至還有cortex-a和cortex-r系列的。大家熟知的stm32f103為cortex-m3內(nèi)核,stm32f407為cortex-m4內(nèi)核。如果要移植到的目錄芯片內(nèi)核出現(xiàn)在此目錄之中,那就無(wú)需關(guān)注libcpu,只要在配置文件中指定正確的內(nèi)核即可。

我移植的HC32L196使用cortex-m0+內(nèi)核,可使用cortex-m0的代碼,因此無(wú)須進(jìn)行CPU構(gòu)架移植。

bsp結(jié)構(gòu)

由于不需要進(jìn)行CPU架構(gòu)移植,所以本次移植相對(duì)簡(jiǎn)單,唯一的工作就是在rt-thread的bsp目錄中創(chuàng)建自己硬件的bsp。

rt-thread當(dāng)前支持了100多個(gè)bsp,可能大家用的最多的是stm32。不過(guò)我并不建議大家在移植時(shí)參考stm32,因?yàn)樗亲顝?fù)雜的一個(gè)bsp。早期rt-thread中關(guān)于stm32的bsp比較簡(jiǎn)單,各種型號(hào)如stm32f10x, stm32f40x都是獨(dú)立的bsp。新手入門(mén)相對(duì)簡(jiǎn)單。不過(guò)弊病也很明顯:隨著支持的stm32系列的增加,bsp的子目錄也就急劇增加,維護(hù)成本很高。可能得益于stm32的HAL庫(kù),可以相對(duì)較低的投入將它們合為一個(gè)bsp。它們共用一份驅(qū)動(dòng)代碼,其在HAL_Drivers中。可能以后國(guó)產(chǎn)MCU的bsp也會(huì)發(fā)展成這樣,不過(guò)對(duì)于移植新手,最好是先易后難。我移植的HC32L196是華大單片機(jī),以已經(jīng)被rtt支持的hc32f4a0為模板進(jìn)行移植。同時(shí)參考了swm320,以及stm32stm32l053-st-nucleo。

大多數(shù)bsp目錄結(jié)構(gòu):

目錄說(shuō)明

applications用戶代碼。純凈的bsp中只需要一個(gè)main.c文件,里面定義main函數(shù)。

board板級(jí)驅(qū)動(dòng)代碼(最主要的是board.c),鏈接腳本(gcc, keil, iar)。

drivers設(shè)備驅(qū)動(dòng)代碼,比如gpio和uart驅(qū)動(dòng)。

figures電路板照片。

Libraries芯片廠商驅(qū)動(dòng)庫(kù)。

.config, rtconfig.h, KconfigKconfig配置系統(tǒng)相關(guān)文件

rtconfig.py, SConscript, SConstructscons構(gòu)建系統(tǒng)相關(guān)文件

template.uvprojx, template.uvoptxkeil模板工程

project.uvprojx, project.uvoptxkeil工程

template.eww, template.ewpiar模板工程

project.eww, project.ewpiar工程

可分為如下幾類(lèi):

代碼文件:applications, board, drivers, Libraries中的.h和.c

Kconfig配置系統(tǒng)相關(guān)文件

scons構(gòu)建系統(tǒng)相關(guān)文件

工程模板

代碼結(jié)構(gòu)

先來(lái)看看我移植后的keil工程,其打開(kāi)的幾個(gè)目錄就是涉及移植的代碼目錄。applications目錄最為簡(jiǎn)單。drivers目錄是移植的重點(diǎn),不過(guò)它不是移植的首要任務(wù)。下面幾節(jié)介紹移植前最迫切需要搞清楚的內(nèi)容。

Kconfig

rtt支持通過(guò)menuconfig命令來(lái)配置內(nèi)核、組件及軟件包。執(zhí)行menuconfig命令時(shí),其從Kconfig文件中解析菜單結(jié)構(gòu),由用戶勾選、配置各個(gè)選項(xiàng),最終將配置結(jié)果寫(xiě)入.config和rtconfig.h。bsp中通常有兩個(gè)Kconfig文件。一個(gè)位于根目錄,另一個(gè)位于board。根目錄中的Kconfig僅僅是導(dǎo)入了別的目錄的Kconfig,所有bsp的基本都一樣,無(wú)須修改。

mainmenu “RT-Thread Project Configuration”

config BSP_DIR

string

option env=“BSP_ROOT”

default “。”

config RTT_DIR

string

option env=“RTT_ROOT”

default “。./。.”

config PKGS_DIR

string

option env=“PKGS_ROOT”

default “packages”

source “$RTT_DIR/Kconfig”

source “$PKGS_DIR/Kconfig”

source “board/Kconfig”

board/Kconfig

menu “Hardware Drivers Config”

config MCU_HC32L196

bool

select ARCH_ARM_CORTEX_M0

select RT_USING_COMPONENTS_INIT

select RT_USING_USER_MAIN

default y

menu “Onboard Peripheral Drivers”

endmenu

menu “On-chip Peripheral Drivers”

config BSP_USING_GPIO

bool “Enable GPIO”

select RT_USING_PIN

default y

menuconfig BSP_USING_UART

bool “Enable UART”

default y

select RT_USING_SERIAL

if BSP_USING_UART

config BSP_USING_UART0

bool “Enable UART0”

default y

config BSP_USING_UART1

bool “Enable UART1”

default n

endif

endmenu

menu “Board extended module Drivers”

endmenu

endmenu

其自動(dòng)選擇了幾個(gè)必選的配置,比如RT_USING_USER_MAIN。另,定義了可配置的驅(qū)動(dòng)選項(xiàng),比如GPIO配置和串口配置。

上述文件對(duì)應(yīng)的串口配置菜單如下:rtt官方文檔中有對(duì)Kconfig進(jìn)行詳細(xì)講解:https://www.rt-thread.org/document/site/#/development-tools/kconfig/kconfig

scons和工程模板文件

rt-thread使用scons作為構(gòu)建系統(tǒng),其用于編譯源碼,生成固件。不過(guò)呢,大家用的最多的,可能是用它生成keil工程,就是在使用menuconfig配置內(nèi)核、組件和驅(qū)動(dòng)之后,使用如下命令生成keil工程:

scons --target=mdk5

其原理,以生成keil5工程為例,是scons根據(jù)rtconfig.h文件中的配置,在template.uvprojx上添加宏定義、頭文件路徑配置、文件鏈接,從而生成project.uvprojx。下圖左側(cè)為模板工程,右側(cè)為生成的rtt工程。再多說(shuō)一句,rtt是如何能夠讀寫(xiě)keil工程文件呢?.uvprojx其實(shí)是xml文件,rtt通過(guò)模板工程創(chuàng)建新工程,就是在讀寫(xiě)xml,有興趣的話,可以閱讀rt-thread源碼根目錄下的tools/keil.py。

rtconfig.h是在Kconfig系統(tǒng)中生成,只要修改好Kconfig相關(guān)文件后,無(wú)須操心rtconfig.h。要修改的是模板工程。不過(guò)也很簡(jiǎn)單,從其他bsp復(fù)制模板工程,修改設(shè)備類(lèi)型,RAM和ROM配置就可以了。其他的配置,如下載接口等,可根據(jù)需要修改。稍復(fù)雜些的任務(wù)是修改下面三種文件:

SConstruct

rtconfig.py

SConscript

這三個(gè)文件都是python腳本,只不過(guò)它們里面調(diào)用了許多scons系統(tǒng)提供的函數(shù)。所以,如果熟悉python的話,修改起來(lái)會(huì)很輕松。

SConstruct

SConstruct是scons的入口腳本,其通過(guò)rtconfig.py以導(dǎo)入各種編譯配置,之后調(diào)用PrepareBuilding以獲取編譯對(duì)象(要編譯哪些文件)。PrepareBuilding會(huì)調(diào)用各SConscript腳本以獲取編譯對(duì)象。這文件一般不用修改,除非參考的bsp有瑕疵。

rtconfig.py

rtconfig.py中定義了各種與編譯相關(guān)的選項(xiàng)和參數(shù)。

頭部定義CPU架構(gòu)與型號(hào),還記得文首提到的架構(gòu)移植嗎?對(duì)于rtt已支持的CPU架構(gòu),只需要在這里指明即可,scons系統(tǒng)會(huì)根據(jù)這里的配置選擇相應(yīng)的架構(gòu)代碼以進(jìn)行編譯鏈接。

ARCH=‘a(chǎn)rm’

CPU=‘cortex-m0’

其他主要的是編譯參數(shù),比如armcc編譯系列如下。

elif PLATFORM == ‘a(chǎn)rmcc’:

# toolchains

CC = ‘a(chǎn)rmcc’

CXX = ‘a(chǎn)rmcc’

AS = ‘a(chǎn)rmasm’

AR = ‘a(chǎn)rmar’

LINK = ‘a(chǎn)rmlink’

TARGET_EXT = ‘a(chǎn)xf’

DEVICE = ‘ --cpu Cortex-M0 ’

CFLAGS = ‘-c ’ + DEVICE + ‘ --apcs=interwork --c99’

AFLAGS = DEVICE + ‘ --apcs=interwork ’

LFLAGS = DEVICE + ‘ --scatter “boardlinker_scriptslink.sct” --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict’

CFLAGS += ‘ -I’ + EXEC_PATH + ‘/ARM/ARMCC/include’

LFLAGS += ‘ --libpath=’ + EXEC_PATH + ‘/ARM/ARMCC/lib’

CFLAGS += ‘ -D__MICROLIB ’

AFLAGS += ‘ --pd “__MICROLIB SETA 1” ’

LFLAGS += ‘ --library_type=microlib ’

EXEC_PATH += ‘/ARM/ARMCC/bin/’

if BUILD == ‘debug’:

CFLAGS += ‘ -g -O0’

AFLAGS += ‘ -g’

else:

CFLAGS += ‘ -O2’

CXXFLAGS = CFLAGS

POST_ACTION = ‘fromelf --bin $TARGET --output rtthread.bin

fromelf -z $TARGET’

這塊與生成keil工程無(wú)關(guān),而是在命令行下編譯源碼并生成固件。可能大家平時(shí)不會(huì)這么編譯,都是用Keil。其實(shí)這種方法意義重大,其是持續(xù)集成的基礎(chǔ)。

適配起來(lái)很也簡(jiǎn)單,直接把相同CPU的配置復(fù)制過(guò)來(lái)即可。我移植HC32L196,雖然主要參考HC32F4A0,然而HC32F4A0的構(gòu)架是cortex-m4,顯然不適合。所以在適配rtconfig.py時(shí),我從stm32stm32l053-st-nucleo獲取cortex-m0的配置。

SConscript

SConscript存在于各源碼目錄下,用于決定編譯哪些文件。這些要編譯的文件也會(huì)在創(chuàng)建keil工程中時(shí)被包含進(jìn)去。c17aaa80-169e-11ec-8fb8-12bb97331649.pngbsp根目錄下的SConscript用于掃描出子目錄中的SConscript并調(diào)用之,一般不用修改。

子目錄下的SConscript大致分為兩種:

將指定文件包含到編譯目標(biāo)之中,或者使用Glob(‘*.c’)包含所有的C文件。

根據(jù)rtconfig.h中的配置來(lái)包含被選中的文件。

application中的為第1種,drivers為第2種。修改時(shí)依葫蘆畫(huà)瓢即可。

更多細(xì)節(jié),可參閱:https://www.rt-thread.org/document/site/#/development-tools/scons/scons

board

終于進(jìn)入代碼講解環(huán)節(jié)。board目錄中通常會(huì)有一個(gè)board.c。

void rt_hw_board_clock_init(void)

{

}

void SysTick_Configuration(void)

{

}

void SysTick_Handler(void)

{

/* enter interrupt */

rt_interrupt_enter();

rt_tick_increase();

/* leave interrupt */

rt_interrupt_leave();

}

void rt_hw_board_init()

{

/* Configure the System clock */

rt_hw_board_clock_init();

/* Configure the SysTick */

SysTick_Configuration();

#ifdef RT_USING_HEAP

rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);

#endif#ifdef RT_USING_COMPONENTS_INIT

rt_components_board_init();

#endif#ifdef RT_USING_CONSOLE

rt_console_set_device(RT_CONSOLE_DEVICE_NAME);

#endif

}

其做了如下事情:

初始化時(shí)鐘

配置SysTick定時(shí)器

初始化rtt堆內(nèi)存模塊

初始化板級(jí)驅(qū)動(dòng),如gpio和uart

設(shè)計(jì)控制臺(tái)串口

所有bsp的board.c都差不多,上面代碼中rt_hw_board_clock_init和SysTick_Configuration空著,這就是移植時(shí)需要修改的代碼。其他部分,一般不用修改。

另,配置堆內(nèi)存時(shí)用到的宏定義在board.h之中,需要根據(jù)硬件做修改。

#define SRAM_BASE 0x20000000#define SRAM_SIZE 0x8000#define SRAM_END (SRAM_BASE + SRAM_SIZE)

boardlinker_scripts目錄中存放鏈接腳本,需要修改其中有關(guān)RAM和ROM的配置。

link.sct:keil鏈接腳本

link.lds:gcc鏈接腳本

沒(méi)做iar支持,因?yàn)槲也挥胕ar,也沒(méi)裝iar:)

Libraries

Libraries存放芯片廠商提供的驅(qū)動(dòng)代碼。我移植的HC32L196基本結(jié)構(gòu)如下:

HC32L196_StdPeriph_Driver:分inc和src,存放芯片驅(qū)動(dòng),如hc32l196_adc.h和hc32l196_adc.c。

CMSISInclude:存放CMSIS相關(guān)頭文件,如core_cm0.h

CMSISDeviceHDSCHC32L196Include:雜類(lèi)驅(qū)動(dòng)頭文件。

CMSISDeviceHDSCHC32L196Source:雜類(lèi)驅(qū)動(dòng)源文件,比如system_hc32l19x.c,其內(nèi)包含匯編啟動(dòng)文件會(huì)調(diào)用的SystemInit函數(shù)。

CMSISDeviceHDSCHC32L196SourceARM:keil匯編啟動(dòng)文件startup_hc32l19x.s

CMSISDeviceHDSCHC32L196SourceGCC:gcc匯編啟動(dòng)文件startup_hc32l19x.s

CMSISDeviceHDSCHC32L196SourceIAR:iar匯編啟動(dòng)文件startup_hc32l19x.s

SConscript:包含本目錄中的代碼文件。在包含匯編啟動(dòng)文件時(shí),根據(jù)rtconfig.CROSS_TOOL來(lái)包含相應(yīng)編譯平臺(tái)的文件。

上述這些文件,除了SConscript,都來(lái)自芯片廠商的SDK,只不過(guò)其文件分布可能與上述不同。視具體情況做調(diào)整即可。

匯編啟動(dòng)文件

關(guān)于Libraries中的匯編啟動(dòng)文件,需要補(bǔ)充說(shuō)明一點(diǎn)。對(duì)于keil版本,一般無(wú)須修改。對(duì)于gcc版本,需要把跳轉(zhuǎn)main函數(shù)的語(yǔ)句修改為跳轉(zhuǎn)entry函數(shù)。

stm32的啟動(dòng)文件,其調(diào)用的是main函數(shù)。需要改為:

bl entry

之所以有如此差異,是因?yàn)閍rmcc(keil編譯器)與gcc的機(jī)制不同。

armcc

armcc的匯編啟動(dòng)文件相對(duì)簡(jiǎn)單,職責(zé)如下:

定義堆空間和棧空間,初始化棧指針

定義中斷向量表

定義入口函數(shù)Reset_Handler,其先調(diào)用SystemInit,之后調(diào)用__main

初始化全局變量等工作放在了__main之中,__main完成初始化操作后會(huì)調(diào)用main函數(shù)。不過(guò)呢,armcc提供了一種函數(shù)補(bǔ)丁機(jī)制。如果定義了$Sub$$main函數(shù)的話,在main函數(shù)調(diào)用之前,會(huì)先調(diào)用$Sub$$main。rt-thread就是通過(guò)定義$Sub$$main函數(shù),在其中進(jìn)行操作系統(tǒng)的初始化,之后調(diào)用applications中的main函數(shù)以執(zhí)行用戶代碼。

gcc

gcc匯編啟動(dòng)文件職責(zé)如下:

定義中斷向量表

定義入口函數(shù)Reset_Handler,其負(fù)責(zé)初始化全局變量(data和bss),調(diào)用SystemInit,調(diào)用main函數(shù)

由于gcc沒(méi)有armcc那樣的函數(shù)補(bǔ)丁機(jī)制,所以要運(yùn)行rt-thread的話,需要將調(diào)用main函數(shù)改為調(diào)用rt-thread入口函數(shù),即entry。

rt-thread根據(jù)編譯平臺(tái)定義了不同的入口函數(shù),armcc對(duì)應(yīng)$Sub$$main,gcc對(duì)應(yīng)entry。

#ifdef __ARMCC_VERSIONextern int $Super$$main(void);

/* re-define main function */int $Sub$$main(void)

{

rtthread_startup();

return 0;

}

#elif defined(__ICCARM__)extern int main(void);

/* __low_level_init will auto called by IAR cstartup */extern void __iar_data_init3(void);

int __low_level_init(void)

{

// call IAR table copy function.

__iar_data_init3();

rtthread_startup();

return 0;

}

#elif defined(__GNUC__)/* Add -eentry to arm-none-eabi-gcc argument */int entry(void)

{

rtthread_startup();

return 0;

}

#endif

移植到HC32L196

如前所說(shuō),我不打算詳細(xì)講解每一步操作,僅提一些要點(diǎn)。

移植步驟

可分為兩步:

創(chuàng)建可以運(yùn)行的bsp,這是最關(guān)鍵的一步。

填充rtt設(shè)備驅(qū)動(dòng),如gpio和uart,這是相對(duì)費(fèi)時(shí)的一步。

之所以分為兩大步,是因?yàn)橄韧瓿申P(guān)鍵的一步,運(yùn)行成功,將給予移植者一個(gè)很大的激勵(lì),提高信心。如果第一步失敗了,也好及時(shí)查找問(wèn)題,而不是等經(jīng)歷了漫長(zhǎng)的設(shè)備驅(qū)動(dòng)移植后,在測(cè)試時(shí)發(fā)現(xiàn)rt-thread系統(tǒng)都還無(wú)法跑起來(lái)。

創(chuàng)建可以運(yùn)行的bsp

所謂可以運(yùn)行,是指可以讓rt-thread操作系統(tǒng)在芯片上跑起來(lái),并不需要跑finsh控制臺(tái),甚至不需要點(diǎn)亮LED燈,不需要任何外設(shè)驅(qū)動(dòng),能運(yùn)行如下代碼就行。

main.c

int main(void)

{

for (uint32_t i = 0; ; i++)

{

rt_thread_delay(RT_TICK_PER_SECOND);

};

}

當(dāng)然啦,沒(méi)有任何外設(shè)驅(qū)動(dòng)的話,只能在調(diào)試模式下運(yùn)行才能觀察效果。只要rt_thread_delay的功能正常,就說(shuō)明rt-thread調(diào)度系統(tǒng)正常工作了。

在了解了移植原理后,創(chuàng)建可以運(yùn)行的bsp應(yīng)該能較快完成,具體步驟如下:

復(fù)制一個(gè)bsp,將名稱改為自己的平臺(tái)。

使用芯片原廠提供的SDK替換Libraries目錄中的內(nèi)容。對(duì)其中的匯編啟動(dòng)文件和鏈接腳本要稍加關(guān)注,尤其是gcc匯編。

修改board目錄源碼,主要是board.c,完成初始化時(shí)鐘和SysTick的工作。

刪除drivers中的文件,或者保留幾個(gè)驅(qū)動(dòng)文件的框架,刪除硬件相關(guān)代碼。

修改模板工程。

修改Kconfig相關(guān)文件。

修改Scons相關(guān)文件。

使用menuconfig更新rtconfig.h文件。

使用scons生成rt-thread工程。10.編譯燒錄調(diào)度。

RT-Thread Studio

創(chuàng)建可以運(yùn)行的bsp之后,之后就是開(kāi)發(fā)驅(qū)動(dòng)程序了。此時(shí)其實(shí)是可以使用RT-Thread Studio開(kāi)發(fā)的,其有一個(gè)非常好用的功能:導(dǎo)入Keil或者IAR項(xiàng)目到工作空間中。我在之后的驅(qū)動(dòng)開(kāi)發(fā)環(huán)節(jié)一直使用RT-Thread Studio編寫(xiě)代碼。

gpio映射表

struct rt_pin_ops

{

void (*pin_mode)(struct rt_device *device, rt_base_t pin, rt_base_t mode);

void (*pin_write)(struct rt_device *device, rt_base_t pin, rt_base_t value);

int (*pin_read)(struct rt_device *device, rt_base_t pin);

rt_err_t (*pin_attach_irq)(struct rt_device *device, rt_int32_t pin,

rt_uint32_t mode, void (*hdr)(void *args), void *args);

rt_err_t (*pin_detach_irq)(struct rt_device *device, rt_int32_t pin);

rt_err_t (*pin_irq_enable)(struct rt_device *device, rt_base_t pin, rt_uint32_t enabled);

rt_base_t (*pin_get)(const char *name);

};

rt-thread gpio設(shè)備驅(qū)動(dòng)接口使用引腳號(hào)(pin)來(lái)操作指定的引腳。早期的bsp會(huì)定義一個(gè)大數(shù)組來(lái)存儲(chǔ)引腳列表,下圖是swm320定義的列表。c1e24b68-169e-11ec-8fb8-12bb97331649.png這種方式比較繁瑣。通常芯片的GPIO口有一定的規(guī)律,比如PA0-PA15,PB0-PB15,PC0-PC15,等等。這些GPIO對(duì)應(yīng)的寄存器的地址是連續(xù)的,可以通過(guò)一個(gè)公式將寄存器地址轉(zhuǎn)換為引腳序號(hào),反之亦然。

因此出現(xiàn)了使用GET_PIN宏來(lái)計(jì)算指定GPIO引腳序號(hào)的方法,比如GET_PIN(A, 5)會(huì)計(jì)算出PA5引腳的序號(hào)。可能stm32 bsp最先使用這種方法,大家移植的時(shí)候可以參考一下。

支持gcc

支持編譯

HC32L196的原廠SDK中并不支持gcc。不過(guò)筆者是eclipse系列IDE的忠實(shí)用戶,既然原廠不支持,那我就自己支持吧。

首先,要?jiǎng)?chuàng)建匯編啟動(dòng)文件:LibrariesCMSISDeviceHDSCHC32L196SourceGCCstartup_hc32l19x.s。

怎么創(chuàng)建呢,當(dāng)然不需要從零開(kāi)始啦。從其他cortex-m0的bsp中復(fù)制一個(gè)來(lái)修改。比如stm32的,

bspstm32librariesSTM32L0xx_HALCMSISDeviceSTSTM32L0xxSourceTemplatesgccstartup_stm32l053xx.s

修改中斷向量表和中斷函數(shù)即可。c1ef7e64-169e-11ec-8fb8-12bb97331649.png

另外要關(guān)注下rtconfig.py和boardlinker_scriptslink.lds,同樣可以參考cortex-m0的bsp。

支持燒錄

添加了對(duì)gcc的支持后,使用RT-Thread Studio創(chuàng)建開(kāi)發(fā)板支持包,就可以真正使用RT-Thread Studio來(lái)開(kāi)發(fā)項(xiàng)目了。不過(guò)在這之前,需要先編譯出固件并燒錄驗(yàn)證。

使用scons命令編譯。c1fb2886-169e-11ec-8fb8-12bb97331649.png編譯后的固件位于bsp根目錄:c206673c-169e-11ec-8fb8-12bb97331649.png

可使用J-Flash燒錄:c20f72f0-169e-11ec-8fb8-12bb97331649.png成功運(yùn)行:c231da8e-169e-11ec-8fb8-12bb97331649.png大家在使用J-Flash創(chuàng)建工程時(shí),可能發(fā)現(xiàn)找不到自己的硬件配置。如下圖,HC32系列只有我移植的HC32L196,而沒(méi)有HC32F4A0等,這是我自己添加進(jìn)去的。怎么添加呢,可參考我之前的一篇文章:RT-Thread Studio燒寫(xiě)國(guó)產(chǎn)mcu(swm320)固件的方法。c254a500-169e-11ec-8fb8-12bb97331649.png

后記

本次移植過(guò)程相當(dāng)漫長(zhǎng),不是因?yàn)橐浦踩蝿?wù)本身艱難,而是我只能用碎片化的時(shí)間進(jìn)行移植。有幾天我九點(diǎn)半準(zhǔn)備下班回家移植,老板覺(jué)得走的太早,硬是拖到十點(diǎn),這些天就沒(méi)有早于十一點(diǎn)到家的。大家說(shuō)這樣的老板是不是很可惡?表示贊同的,支持下筆者,點(diǎn)個(gè)再看唄:)。

責(zé)任編輯:haq

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

    關(guān)注

    459

    文章

    52253

    瀏覽量

    437026
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17874

    瀏覽量

    361196
  • RTThread
    +關(guān)注

    關(guān)注

    8

    文章

    132

    瀏覽量

    41567

原文標(biāo)題:移植RT-Thread到國(guó)產(chǎn)芯片HC32L196,原理與方法詳解!

文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

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

    2025 RT-Thread全球技術(shù)大會(huì)議程正式發(fā)布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技術(shù)大會(huì))是聚焦基礎(chǔ)軟件技術(shù)創(chuàng)新與實(shí)踐的嵌入式技術(shù)盛會(huì),持續(xù)推動(dòng)技術(shù)價(jià)值轉(zhuǎn)化
    的頭像 發(fā)表于 05-27 19:28 ?446次閱讀
    2025 <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì)議程正式發(fā)布!

    RT-Thread審核團(tuán)招募: 深度參與開(kāi)源RTOS社區(qū)治理與演進(jìn)

    全球開(kāi)發(fā)者招募:RT-Thread審核團(tuán)(ReviewTeam)正式開(kāi)放申請(qǐng)!在開(kāi)源的世界里,代碼審查(CodeReview)是保證軟件質(zhì)量、促進(jìn)技術(shù)交流的關(guān)鍵環(huán)節(jié)。RT-Thread作為全球領(lǐng)先
    的頭像 發(fā)表于 05-21 18:02 ?511次閱讀
    <b class='flag-5'>RT-Thread</b>審核團(tuán)招募: 深度參與開(kāi)源RTOS社區(qū)治理與演進(jìn)

    如何將RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默認(rèn)支持的IDE只有IAR 和 Keil, 那如何將RT-Thread移植到NXP MCUXPressoIDE上呢?本文內(nèi)容比較簡(jiǎn)單但稍有瑣碎,希望對(duì)有需要的小伙伴有所幫助。
    的頭像 發(fā)表于 02-13 10:37 ?1776次閱讀
    如何將<b class='flag-5'>RT-Thread</b><b class='flag-5'>移植</b>到NXP MCUXPressoIDE上

    從開(kāi)源中來(lái)到開(kāi)源中去-RT-Thread北京社區(qū)篇

    RT-Thread今年全域推行不同區(qū)域社區(qū)網(wǎng),通過(guò)建立區(qū)域社區(qū)網(wǎng),構(gòu)建更加緊密聯(lián)系的開(kāi)源社區(qū),實(shí)現(xiàn)更廣泛的開(kāi)源資源共享,讓更多的RT-Thread開(kāi)發(fā)者受益。今年8月份RT-Thread正式啟動(dòng)北京
    的頭像 發(fā)表于 11-29 01:05 ?420次閱讀
    從開(kāi)源中來(lái)到開(kāi)源中去-<b class='flag-5'>RT-Thread</b>北京社區(qū)篇

    RT-Thread上CAN實(shí)踐

    開(kāi)箱測(cè)試RT-Thread官方已完成了對(duì)英飛凌XMC7200EVK的移植,通過(guò)shell可以看到做好了uart3的console。本文將介紹如何進(jìn)行RT-ThreadCan移植。接下來(lái)
    的頭像 發(fā)表于 11-13 01:03 ?1929次閱讀
    <b class='flag-5'>RT-Thread</b>上CAN實(shí)踐

    開(kāi)源共生 商業(yè)共贏 | RT-Thread 2024開(kāi)發(fā)者大會(huì)報(bào)名啟動(dòng)!

    親愛(ài)的RT-Thread開(kāi)發(fā)者我們很高興地宣布,一年一度的RDC(RT-ThreadDeveloperConference,RT-Thread開(kāi)發(fā)者大會(huì))正式啟動(dòng)報(bào)名!2024RT-Threa
    的頭像 發(fā)表于 10-29 08:06 ?879次閱讀
    開(kāi)源共生 商業(yè)共贏 | <b class='flag-5'>RT-Thread</b> 2024開(kāi)發(fā)者大會(huì)報(bào)名啟動(dòng)!

    Nordic-RT-Thread5.1.0移植筆記

    Nordic-RT-Thread5.1.0移植筆記
    的頭像 發(fā)表于 10-16 08:09 ?1164次閱讀
    Nordic-<b class='flag-5'>RT-Thread</b>5.1.0<b class='flag-5'>移植</b>筆記

    【成都】9月21日RT-Thread巡回線下培訓(xùn)-OpenMV機(jī)器視覺(jué)

    親愛(ài)的RT-Thread社區(qū)成員們:RT-Thread24年全球巡回培訓(xùn)將覆蓋超10座城市及國(guó)家,為開(kāi)發(fā)者提供一個(gè)深入學(xué)習(xí)RT-Thread嵌入式開(kāi)發(fā),以及和工程師們線下交流的絕佳機(jī)會(huì)。2024年
    的頭像 發(fā)表于 09-13 08:09 ?1441次閱讀
    【成都】9月21日<b class='flag-5'>RT-Thread</b>巡回線下培訓(xùn)-OpenMV機(jī)器視覺(jué)

    如何在RT-thread studio的裸機(jī)例程上移植freertos?

    如何在RT-thread studio的裸機(jī)例程上移植freertos
    發(fā)表于 09-13 06:32

    【大連】9月7日RT-Thread巡回線下培訓(xùn)-OpenMV機(jī)器視覺(jué)

    親愛(ài)的RT-Thread社區(qū)成員們:2024年RT-Thread全球開(kāi)發(fā)者線下培訓(xùn)拉開(kāi)帷幕啦!24年全球巡回培訓(xùn)將覆蓋超10座城市及國(guó)家,為開(kāi)發(fā)者提供一個(gè)深入學(xué)習(xí)RT-Thread嵌入式開(kāi)發(fā)的絕佳
    的頭像 發(fā)表于 09-01 08:02 ?3124次閱讀
    【大連】9月7日<b class='flag-5'>RT-Thread</b>巡回線下培訓(xùn)-OpenMV機(jī)器視覺(jué)

    2024 RT-Thread全球巡回 線下培訓(xùn)火熱來(lái)襲!

    親愛(ài)的RT-Thread社區(qū)成員們:我們非常高興地宣布,2024年RT-Thread全球開(kāi)發(fā)者線下培訓(xùn)即將拉開(kāi)帷幕!24年全球巡回培訓(xùn)將覆蓋超10座城市及國(guó)家,為開(kāi)發(fā)者提供一個(gè)深入學(xué)習(xí)RT-Thread嵌入式開(kāi)發(fā)的絕佳機(jī)會(huì)。
    的頭像 發(fā)表于 08-07 08:35 ?2483次閱讀
    2024 <b class='flag-5'>RT-Thread</b>全球巡回 線下培訓(xùn)火熱來(lái)襲!

    【好書(shū)推薦】RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南

    近年來(lái)國(guó)內(nèi)芯片產(chǎn)業(yè)和物聯(lián)網(wǎng)產(chǎn)業(yè)的快速崛起,行業(yè)發(fā)展迫切需要更多人才,尤其需要掌握嵌入式操作系統(tǒng)等底層技術(shù)的人才。隨著RT-Thread被更廣泛地應(yīng)用于行業(yè)中,開(kāi)發(fā)者對(duì)嵌入式驅(qū)動(dòng)開(kāi)發(fā)的需求越來(lái)越
    的頭像 發(fā)表于 08-01 08:35 ?1187次閱讀
    【好書(shū)推薦】<b class='flag-5'>RT-Thread</b>設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南

    RT-Thread 新里程碑達(dá)成——GitHub Star 破萬(wàn)!

    RT-Thread實(shí)時(shí)操作系統(tǒng)開(kāi)源項(xiàng)目在GitHub上的star數(shù)量突破一萬(wàn)!截止發(fā)文,RT-Thread作為實(shí)時(shí)操作系統(tǒng)在業(yè)界Star數(shù)量排名第一!倉(cāng)庫(kù)地址:https://github.com
    的頭像 發(fā)表于 07-04 08:35 ?717次閱讀
    <b class='flag-5'>RT-Thread</b> 新里程碑達(dá)成——GitHub Star 破萬(wàn)!

    lvgl移植RT-Thread Nano后進(jìn)入硬件錯(cuò)誤中斷的原因?

    使用的是RT-Thread Nano的最新版,第一次移植,不知道是不是因?yàn)檫@個(gè)lvgl只能移植到標(biāo)準(zhǔn)版里? 嘗試過(guò)給lvgl的線程分配更大的棧,但是依舊會(huì)卡死在硬件錯(cuò)誤中斷里。但只要把用戶的ui
    發(fā)表于 07-04 07:40

    基于 RT-Thread專業(yè)版的EtherCAT主站方案

    (一)方案介紹本方案基于RT-Thread專業(yè)版,在RT-Thread端集成EtherCAT主站協(xié)議,通過(guò)EtherCAT對(duì)伺服電機(jī)或遠(yuǎn)程IO進(jìn)行實(shí)時(shí)控制,具備傳輸速度快,實(shí)時(shí)性高,擴(kuò)展設(shè)備靈活等
    的頭像 發(fā)表于 06-19 08:35 ?1729次閱讀
    基于 <b class='flag-5'>RT-Thread</b>專業(yè)版的EtherCAT主站方案
    主站蜘蛛池模板: 欧美zoozzooz性欧美 | 天天综合天天射 | 四虎永久在线精品免费观看地址 | 亚洲人成毛片线播放 | 日韩写真在线 | 午夜视频免费在线观看 | 欧美成人看片一区二区三区 | 国产福利不卡一区二区三区 | 日韩毛片免费视频 | 在线播放黄色网址 | 人人草人人射 | 手机在线看片国产 | 色中文字幕 | 四只虎免费永久观看 | 国产伦理一区二区三区 | 成人青草亚洲国产 | 性中国videosex国产孕妇 | www.男人 | 1024手机看片日韩 | 美女大黄三级视频在线观看 | 婷婷五月在线视频 | 七月丁香八月婷婷综合激情 | 色妞妞网| 手机看片1024免费视频 | 色综合一区二区三区 | 宅男69免费永久网站 | se94se亚洲欧美在线 | 992tv国产精品福利在线 | 李丽莎尤物福利视频 | 成人久久精品 | 夜夜骑狠狠干 | 狠狠色狠狠色综合日日小蛇 | 天天色狠狠干 | 午夜色视频 | 亚洲高清国产拍精品影院 | 站长工具天天爽视频 | 天天激情站 | 国产精品久久国产三级国不卡顿 | 亚洲一区亚洲二区 | 开心激情小说 | 亚洲国产成人久久精品影视 |