您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關怎么在樹莓派2上移植rt-thread操作系統的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
1.準備工作
硬件
1.樹莓派2開發板(如果沒有,可以直接用qemu替代)。
軟件
1.window上可以采用rt-thread提供的env工具。
2.Ubuntu上需要裝scons,因為rt-thread操作系統是通過scons組織的。
3.git工具,進行代碼管理
4.qemu,模擬開發板
5.arm gcc版本gcc-arm-none-eabi-5_4-2016q3
以下文章的實驗都是在Ubuntu16.04下進行,用qemu仿真樹莓派2。實際硬件也進行過測試,效果一樣。
2.移植思路
樹莓派2的啟動上電流程是先啟動gpu,從sd卡中讀取kernel固件。所以如果要自己實現kernel,也需要做類似的處理,編譯一個kernel7.img的固件放在sd卡中。如果直接用qemu操作,那么就不需要這么多復雜的操作,直接本地模擬就可以了。
如果要實現移植rt-thread操作系統到樹莓派上,要點是什么?
2.1.啟動代碼
當樹莓派的gpu加載kernel7.img到sdram開始執行的時候,首先需要做必要的初始化工作。所以鏈接地址0x00008000需要正確的給予。初始化必要的設備,由于前期沒有分配棧,只能使用匯編進行初始化。簡而言之,進行必要的操作。那么這些必要的操作有那些?由于樹莓派2的芯片采用bcm2835,里面有4個核在工作,所以只能讓一個核工作,其他三個核睡眠。然后關閉mmu,分配棧空間,清除bss段。此時可以跳轉到C語言去執行相關的邏輯操作了。畢竟C語言的操作比匯編看起來讓人清晰。
2.2.中斷向量初始化
這里需要指定中斷向量表,指定中斷函數的處理函數。根據armv7的體系架構,整理中斷向量表的偏移。然后初始化rt-thread中斷向量表的初始化。當然,這些已經在操作系統里面完成了。
2.3.tick
rt-thread操作系統需要有時鐘tick,也就是定時中斷。對于這部分來說,需要自己實現一個timer中斷。在實體硬件上,我們可以采用的是樹莓派內部自帶的一個名為SP802的時鐘模塊產生的中斷,但是qemu并沒有實現,只實現gtimer。所以為了保證硬件和qemu都能運行,實驗中采用的是gtimer。
2.4.上下文切換
如果要實現中斷現場的返回和線程切換現場的返回,少不了上下文切換的邏輯,也就是context。這部分主要完成的是切換上下文前保存狀態寄存器,切換完成后恢復寄存器的內容。這樣就能夠恢復上次的現場了。
2.5.uart
如果要調試rt-thread程序,當然少不了串口打印,rt-thread操作系統的一大特色就是支持shell。可以通過命令來操作系統,查看信息。樹莓派有兩個串口,一個是直接通過內部時鐘驅動的mini uart。另外一個是pl011串口模塊,兩者操作的寄存器地址不一樣。
以上5點也是整個最小系統移植關鍵。現在筆者已經將這個樹莓派rt-thread最小系統移植上去了。有興趣的自己可以玩一下。
https://github.com/bigmagic123/raspi-littlevgl。
這個項目的是為了在樹莓派上移植littlevgl。初代版本就是最小系統。
3.操作步驟
首先需要將代碼clone下來。
git@github.com:bigmagic123/raspi-littlevgl.git
然后進入到工程目錄/bsp/raspi2。這里需要修改的是rtconfig.py文件中的GCC路徑。
這里需要改成自己的gcc路徑。
然后打開vscode上的Terminal --> new Terminal可以看到控制臺窗口的出現。
輸入scons進行編譯。現象如下則表示成功。
QEMU運行
如果此時電腦上已經裝了qemu,那么直接啟動腳本即可正常運行了。
此時表示系統正常運行成功。
樹莓派2硬件運行
連接樹莓派用USB轉TTL模塊。然后將剛才編譯好的文件放到SD卡目錄中。
SD卡文件只留下這三個文件就可以了,其中kernel7.img就是我們剛才用scons編譯出來的rtthread固件。
4.代碼分析
相關的內核代碼可以在rt-thread的官方網站上進行下載。筆者只是改了一些bsp文件。
CPU相關
與cpu相關的在bsp/raspi2/cpu目錄下。
啟動從start_gcc.S開始。上下文切換在context_gcc.S文件中。
外設相關
外設相關的代碼在driver目錄下。目前只有實現uart和tick。
用戶操作代碼
用戶操作代碼在applications文件中,其中啟動的第一個線程就是在main函數中
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;
}
感謝各位的閱讀!關于“怎么在樹莓派2上移植rt-thread操作系統”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。