www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號(hào)精選 > 嵌入式IoT

1.準(zhǔn)備工作

硬件

1.樹莓派2開發(fā)板(如果沒有,可以直接用qemu替代)。

軟件

1.window上可以采用rt-thread提供的env工具。

2.Ubuntu上需要裝scons,因?yàn)閞t-thread操作系統(tǒng)是通過scons組織的。

3.git工具,進(jìn)行代碼管理

4.qemu,模擬開發(fā)板

5.arm gcc版本gcc-arm-none-eabi-5_4-2016q3

以下文章的實(shí)驗(yàn)都是在Ubuntu16.04下進(jìn)行,用qemu仿真樹莓派2。實(shí)際硬件也進(jìn)行過測試,效果一樣。

2.移植思路

樹莓派2的啟動(dòng)上電流程是先啟動(dòng)gpu,從sd卡中讀取kernel固件。所以如果要自己實(shí)現(xiàn)kernel,也需要做類似的處理,編譯一個(gè)kernel7.img的固件放在sd卡中。如果直接用qemu操作,那么就不需要這么多復(fù)雜的操作,直接本地模擬就可以了。

如果要實(shí)現(xiàn)移植rt-thread操作系統(tǒng)到樹莓派上,要點(diǎn)是什么?

2.1.啟動(dòng)代碼

當(dāng)樹莓派的gpu加載kernel7.img到sdram開始執(zhí)行的時(shí)候,首先需要做必要的初始化工作。所以鏈接地址0x00008000需要正確的給予。初始化必要的設(shè)備,由于前期沒有分配棧,只能使用匯編進(jìn)行初始化。簡而言之,進(jìn)行必要的操作。那么這些必要的操作有那些?由于樹莓派2的芯片采用bcm2835,里面有4個(gè)核在工作,所以只能讓一個(gè)核工作,其他三個(gè)核睡眠。然后關(guān)閉mmu,分配??臻g,清除bss段。此時(shí)可以跳轉(zhuǎn)到C語言去執(zhí)行相關(guān)的邏輯操作了。畢竟C語言的操作比匯編看起來讓人清晰。

2.2.中斷向量初始化

這里需要指定中斷向量表,指定中斷函數(shù)的處理函數(shù)。根據(jù)armv7的體系架構(gòu),整理中斷向量表的偏移。然后初始化rt-thread中斷向量表的初始化。當(dāng)然,這些已經(jīng)在操作系統(tǒng)里面完成了。

2.3.tick

rt-thread操作系統(tǒng)需要有時(shí)鐘tick,也就是定時(shí)中斷。對于這部分來說,需要自己實(shí)現(xiàn)一個(gè)timer中斷。在實(shí)體硬件上,我們可以采用的是樹莓派內(nèi)部自帶的一個(gè)名為SP802的時(shí)鐘模塊產(chǎn)生的中斷,但是qemu并沒有實(shí)現(xiàn),只實(shí)現(xiàn)gtimer。所以為了保證硬件和qemu都能運(yùn)行,實(shí)驗(yàn)中采用的是gtimer。

2.4.上下文切換

如果要實(shí)現(xiàn)中斷現(xiàn)場的返回和線程切換現(xiàn)場的返回,少不了上下文切換的邏輯,也就是context。這部分主要完成的是切換上下文前保存狀態(tài)寄存器,切換完成后恢復(fù)寄存器的內(nèi)容。這樣就能夠恢復(fù)上次的現(xiàn)場了。

2.5.uart

如果要調(diào)試rt-thread程序,當(dāng)然少不了串口打印,rt-thread操作系統(tǒng)的一大特色就是支持shell。可以通過命令來操作系統(tǒng),查看信息。樹莓派有兩個(gè)串口,一個(gè)是直接通過內(nèi)部時(shí)鐘驅(qū)動(dòng)的mini uart。另外一個(gè)是pl011串口模塊,兩者操作的寄存器地址不一樣。

以上5點(diǎn)也是整個(gè)最小系統(tǒng)移植關(guān)鍵。現(xiàn)在筆者已經(jīng)將這個(gè)樹莓派rt-thread最小系統(tǒng)移植上去了。有興趣的自己可以玩一下。

https://github.com/bigmagic123/raspi-littlevgl。

這個(gè)項(xiàng)目的是為了在樹莓派上移植littlevgl。初代版本就是最小系統(tǒng)。

3.操作步驟

首先需要將代碼clone下來。

git@github.com:bigmagic123/raspi-littlevgl.git

然后進(jìn)入到工程目錄/bsp/raspi2。這里需要修改的是rtconfig.py文件中的GCC路徑。

這里需要改成自己的gcc路徑。

然后打開vscode上的Terminal --> new  Terminal可以看到控制臺(tái)窗口的出現(xiàn)。

輸入scons進(jìn)行編譯?,F(xiàn)象如下則表示成功。


QEMU運(yùn)行

如果此時(shí)電腦上已經(jīng)裝了qemu,那么直接啟動(dòng)腳本即可正常運(yùn)行了。


此時(shí)表示系統(tǒng)正常運(yùn)行成功。

樹莓派2硬件運(yùn)行


連接樹莓派用USB轉(zhuǎn)TTL模塊。然后將剛才編譯好的文件放到SD卡目錄中。

SD卡文件只留下這三個(gè)文件就可以了,其中kernel7.img就是我們剛才用scons編譯出來的rtthread固件。


4.代碼分析

相關(guān)的內(nèi)核代碼可以在rt-thread的官方網(wǎng)站上進(jìn)行下載。筆者只是改了一些bsp文件。

CPU相關(guān)

與cpu相關(guān)的在bsp/raspi2/cpu目錄下。

啟動(dòng)從start_gcc.S開始。上下文切換在context_gcc.S文件中。

外設(shè)相關(guān)

外設(shè)相關(guān)的代碼在driver目錄下。目前只有實(shí)現(xiàn)uart和tick。

用戶操作代碼

用戶操作代碼在applications文件中,其中啟動(dòng)的第一個(gè)線程就是在main函數(shù)中

int main(int argc, char** argv)
{
rt_kprintf("Hello RT-Thread!\n");
while(1)
{
rt_kprintf("cur tick is %d\n",rt_tick_get());
rt_thread_delay(1000);
}
return 0;
}

如果用戶需要自己創(chuàng)建線程,可以參考rt-thread官方文檔進(jìn)行操作。https://www.rt-thread.org/document/site/

5.后期計(jì)劃

系統(tǒng)移植只是其中的一個(gè)很小的步驟,打算先做一下littlevgl的移植,相關(guān)的移植會(huì)在后續(xù)的文章中不斷的更新。采用qemu模擬器進(jìn)行rtthread+littlevgl圖形界面的開發(fā)和實(shí)驗(yàn)。也歡迎大家多多支持,參與這個(gè)項(xiàng)目的推進(jìn)工作??梢灾苯蛹游襮q郵箱565658641@qq.com聯(lián)系我?;蛘叩絞ithub發(fā)issue來推進(jìn)這個(gè)項(xiàng)目。讓更多初學(xué)rt-thread與littlevgl的人更加方便。


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