溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ls2k1000開發(fā)板移植rt-thread的示例分析

發(fā)布時(shí)間:2021-12-17 14:59:44 來源:億速云 閱讀:274 作者:柒染 欄目:互聯(lián)網(wǎng)科技

龍芯ls2k1000開發(fā)板移植rt-thread的示例分析,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

ls2k1000開發(fā)板移植rt-thread筆記


  • 1.前言

  • 2.龍芯派基本介紹

  • 3.rt-thread在龍芯派上的運(yùn)行過程

  • 4.rtt的啟動(dòng)分析

    • 4.1 啟動(dòng)代碼引導(dǎo)

    • 4.2 rt-thread的啟動(dòng)流程

  • 5.關(guān)鍵部分驅(qū)動(dòng)的初始化

  • 6.Stack Frame

  • 7.總結(jié)


 

1.前言

龍芯2k1000開發(fā)板擁有非常豐富的外設(shè)資源,板子設(shè)計(jì)也非常的精致。

ls2k1000開發(fā)板移植rt-thread的示例分析

所以打算運(yùn)行一下rt-thread,然后進(jìn)行相關(guān)的開發(fā)操作。

本文主要針對(duì)龍芯2k1000的龍芯派的開發(fā)板進(jìn)行rt-thread移植,通過這篇文章,基本上掌握rt-thread對(duì)于一個(gè)新的體系架構(gòu)上的移植過程,同時(shí)也可以很好的掌握mips64體系架構(gòu)上的相關(guān)知識(shí),同時(shí)熟悉使用龍芯派2k1000。

由于裸機(jī)開發(fā)與rtos開發(fā)有著一定的聯(lián)系,所以如果要想理解rt-thread更加底層的東西,一定需要理解芯片的設(shè)計(jì)以及各種體系架構(gòu)的設(shè)計(jì)。

 

2.龍芯派基本介紹

龍芯派就是面對(duì)普通開發(fā)群體的一個(gè)開發(fā)板,龍芯派搭載 2K1000 處理器(主頻 1GHz),板載 DDR3 顆粒,實(shí)現(xiàn) DDR3 的運(yùn)行存儲(chǔ)功能。實(shí)現(xiàn)了 GPIO 的輸入輸出,中斷功能。板上集成 1 個(gè)網(wǎng) 口,集成 3 個(gè) USB 接口,HDMI 接口,LCD 接口,音頻輸入/輸出,集成 SD 卡接口,集成 2 個(gè) CAN 接口,集成 RTC 計(jì)時(shí)功能。可以外擴(kuò) WIFI 模塊。2K 龍芯派可以廣泛應(yīng)用于信息安 全、電力、軌道交通、工業(yè)控制、信號(hào)處理、數(shù)據(jù)通信、信息教育等領(lǐng)域。

ls2k1000開發(fā)板移植rt-thread的示例分析

由于其強(qiáng)大的性能以及多接口,也讓更多方案實(shí)現(xiàn)變的可能。

龍芯派擁有8Mb的SPI Flash,龍芯的BIOS就是存放在這個(gè)SPI Flash中,龍芯叫pmon??梢岳斫鉃閡boot,由于龍芯的pmon的使用,我們?yōu)榱蓑?yàn)證和體驗(yàn)效果,并且方便開發(fā)測(cè)試,我們可以利用pmon的tftp的下載功能,將固件拷貝到內(nèi)存中,然后直接執(zhí)行即可。這種方式有利于程序的調(diào)試和開發(fā)。

當(dāng)實(shí)際應(yīng)用到生產(chǎn)環(huán)境中時(shí),可以將rt-thread固化到spi flash中,這樣就可以很好的加快啟動(dòng)速度了。現(xiàn)在我們只講開發(fā)階段的啟動(dòng)過程。

 

3.rt-thread在龍芯派上的運(yùn)行過程

龍芯派是通過網(wǎng)絡(luò)下載方式將固件進(jìn)行燒錄的,所以首先啟動(dòng)了pmon,然后將rt-thread固件轉(zhuǎn)移到ddr中。

上電之后,龍芯的pmon開始啟動(dòng),當(dāng)串口打印過程中,我們可以通過輸入鍵盤上的c字符進(jìn)入pmon的控制臺(tái)中,這樣就可以利用pmon的tftp將固件加載到ddr中,然后跳轉(zhuǎn)到ddr中去執(zhí)行。

ifaddr syn0 192.168.12.100
load tftp://192.168.12.35/rtthread.elf;
g
 

其中ifaddr為設(shè)置開發(fā)板的ip地址,syn0表示第一個(gè)網(wǎng)卡,load加載程序到內(nèi)存,g開始執(zhí)行。

接著,rt-thread啟動(dòng)初始化流程,初始化串口,初始化中斷,然后開啟中斷,線程開始調(diào)度,rt-thread開始進(jìn)行任務(wù)調(diào)度。

這就是一個(gè)龍芯派執(zhí)行的完整流程。

 

4.rtt的啟動(dòng)分析

對(duì)于龍芯派的移植,或者說對(duì)于一個(gè)新的體系架構(gòu)移植rt-thread,基本過程分為如下幾個(gè)部分:

1.裸機(jī)代碼引導(dǎo),初始化??臻g與bss段,為運(yùn)行c代碼提供環(huán)境

2.關(guān)閉中斷,直到所有的流程初始化完成,第一個(gè)最高優(yōu)先級(jí)的線程出棧時(shí),打開中斷

3.初始化uart

4.初始化os tick中斷

5.控制臺(tái)輸出logo

6.初始化ipc,以及組件,初始化timer()以及idle線程

 

4.1 啟動(dòng)代碼引導(dǎo)

這部分的主要功能就是為啟動(dòng)C代碼做準(zhǔn)備。

這部分的代碼一般是由匯編寫的,準(zhǔn)備好sp的棧指針,然后清空bss段然后直接跳轉(zhuǎn)到了rtthread_startup函數(shù)中。

然后就進(jìn)入rt-thread入口函數(shù)。

 

4.2 rt-thread的啟動(dòng)流程

簡(jiǎn)述一下rt-thread的啟動(dòng)流程如下:

1.關(guān)閉全局中斷

2.板級(jí)驅(qū)動(dòng)初始化(關(guān)鍵初始化,timer、uart等,移植大部分工作)

3.初始化選中的rtt組件

4.打印logo

5.調(diào)度器初始化

6.初始化main、idle等線程

7.啟動(dòng)調(diào)度(出棧時(shí)開啟全局中斷)

8.線程開始調(diào)度

 

5.關(guān)鍵部分驅(qū)動(dòng)的初始化

對(duì)于龍芯2k1000來說,我們需要關(guān)注的是rt_hw_board_init里面關(guān)鍵外設(shè)的初始化。這里主要涉及到兩個(gè),一個(gè)是uart驅(qū)動(dòng)初始化,另外一個(gè)就是timer初始化。

對(duì)于tick,我們采用mips中的c0寄存器進(jìn)行比較。

HPET 控制器

通過配置,每個(gè)定時(shí)器都能獨(dú)立產(chǎn)生中斷。

這組定時(shí)器由一個(gè)向上累加的主計(jì)時(shí)器(up-counter)以及一組比較器構(gòu)成。這個(gè)計(jì)時(shí)器以固定的頻率(125MHz)向上累加,因此當(dāng)軟件兩次讀取計(jì)時(shí)器的值時(shí),除非遇到計(jì)時(shí)器溢出,否則第二次讀取的值總是比第一次讀取的值大。而每個(gè)定時(shí)器都包含一個(gè) match 寄存器以及一個(gè)比較器。當(dāng) match 寄存器的值與主計(jì)時(shí)器相等時(shí),那么定時(shí)器產(chǎn)生中斷。部分定時(shí)器可產(chǎn)生周期性中斷。HPET 模塊包括一個(gè)主計(jì)數(shù)器(main count)以及三個(gè)比較器(comparator),且他們的寬度都是 32 位。在這三個(gè)比較器中,有且僅有一個(gè)比較器支持周期性中斷(periodic-capable),這三個(gè)比較器都支持非周期性中斷。

而在我們的rtt中正常情況下是使用非周期性中斷。相關(guān)的寄存器不展開描述,使用的過程中配置好即可。

uart控制器

作為rtt的控制臺(tái),串口這部分也是必不可少的,在使用ls2k1000的時(shí)候,需要充分考慮到uart資源使用情況。

2K1000 集成了 12 個(gè) UART 控制器,通過 APB 總線與總線橋通信。雖然說有這么多串口控制器,但是實(shí)際上很多都是復(fù)用的串口控制器,所以實(shí)際上只能最大同時(shí)使用的是4路uart接口。

ls2k1000開發(fā)板移植rt-thread的示例分析

其uart控制器有如下幾個(gè)部分:

1.發(fā)送和接收控制器負(fù)責(zé)將fifo中的數(shù)據(jù)進(jìn)行分發(fā)或者接收

2.moden寄存器控制著串口的輸出信號(hào) DTR 和 RTS 的狀以及相關(guān)的校驗(yàn)狀態(tài)。

3.中斷仲裁模塊:當(dāng)任何一種中斷條件被滿足,并且在中斷使能寄存器(IER)中相應(yīng)位置 1,那么 UART 的中斷請(qǐng)求信號(hào) UAT_INT 被置為有效狀態(tài)。

4.訪問寄存器模塊:當(dāng) UART 模塊被選中時(shí),CPU 可通過讀或?qū)懖僮髟L問被地址線選中的寄存器。

其中中斷這一塊必須十分的小心,因?yàn)榇诘氖褂茫婕暗絝ifo的時(shí)候,需要知道空閑狀態(tài)以及相關(guān)的半滿或者全滿或者32字節(jié)產(chǎn)生中斷等屬性。否則讀取數(shù)據(jù)出來將異常復(fù)雜。

 

6.Stack Frame

棧幀這部分與編譯器相關(guān),也與體系架構(gòu)相關(guān),所以在使用的時(shí)候,需要知道棧的活動(dòng)軌跡。函數(shù)的壓棧與出棧,操作系統(tǒng)的調(diào)用,都和這部分相關(guān)。

rt-thread的壓棧操作在libcpu的特定的體系架構(gòu)的stack.c文件中。

每個(gè)線程在初始化的時(shí)候,都會(huì)進(jìn)行壓棧操作。出棧的操作在context_gcc.S文件中。

壓棧除了壓入通用寄存器外,還會(huì)涉及到狀態(tài)寄存器,比如spsr或者cpsr等等,如果有FPU,也需考慮進(jìn)去。

需要注意的是,壓棧的順序與出棧的順序必須是一一對(duì)應(yīng)的。這部分的調(diào)試功能比較繁瑣,需要一步一步的進(jìn)行跟蹤。

看完上述內(nèi)容,你們掌握龍芯ls2k1000開發(fā)板移植rt-thread的示例分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI