日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > 嵌入式IoT

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


  • 1.前言

  • 2.龍芯派基本介紹

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

  • 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開(kāi)發(fā)板擁有非常豐富的外設(shè)資源,板子設(shè)計(jì)也非常的精致。

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

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

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

2.龍芯派基本介紹

龍芯派就是面對(duì)普通開(kāi)發(fā)群體的一個(gè)開(kāi)發(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í)功能??梢酝鈹U(kuò) WIFI 模塊。2K 龍芯派可以廣泛應(yīng)用于信息安 全、電力、軌道交通、工業(yè)控制、信號(hào)處理、數(shù)據(jù)通信、信息教育等領(lǐng)域。

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

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

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

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

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

上電之后,龍芯的pmon開(kāi)始啟動(dòng),當(dāng)串口打印過(guò)程中,我們可以通過(guò)輸入鍵盤(pán)上的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è)置開(kāi)發(fā)板的ip地址,syn0表示第一個(gè)網(wǎng)卡,load加載程序到內(nèi)存,g開(kāi)始執(zhí)行。

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

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

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

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

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

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

3.初始化uart

4.初始化os tick中斷

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

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

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

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

這部分的代碼一般是由匯編寫(xiě)的,準(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等線(xiàn)程

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

8.線(xiàn)程開(kāi)始調(diào)度

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

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

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

HPET 控制器

通過(guò)配置,每個(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)的寄存器不展開(kāi)描述,使用的過(guò)程中配置好即可。

uart控制器

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

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

其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)任何一種中斷條件被滿(mǎn)足,并且在中斷使能寄存器(IER)中相應(yīng)位置 1,那么 UART 的中斷請(qǐng)求信號(hào) UAT_INT 被置為有效狀態(tài)。

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

其中中斷這一塊必須十分的小心,因?yàn)榇诘氖褂?,涉及到fifo的時(shí)候,需要知道空閑狀態(tài)以及相關(guān)的半滿(mǎn)或者全滿(mǎn)或者32字節(jié)產(chǎn)生中斷等屬性。否則讀取數(shù)據(jù)出來(lái)將異常復(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è)線(xiàn)程在初始化的時(shí)候,都會(huì)進(jìn)行壓棧操作。出棧的操作在context_gcc.S文件中。

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

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

7.總結(jié)

移植rt-thread到ls2k1000的開(kāi)發(fā)板的過(guò)程主要如上述所示。如果有新的體系架構(gòu)要移植到rt-thread上,需要充分的考慮移植的過(guò)程與移植的流程。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉