LiteOS樹莓派移植指南(二)

      網友投稿 1328 2022-05-30

      移植介紹

      對于嵌入式設備,由于芯片型號和外設差異較大,且資源有限,所以物聯網操作系統無法像 Windows/Linux 那樣適配集成所有驅動,因此通常會先適配部分芯片/開發板。為了讓操作系統運行在其他芯片/開發板上,首先需要進行移植。

      硬件信息

      開發板:Raspberry Pi 3 Model B(樹莓派3B)

      CPU:Broadcom BCM2837

      主頻:1.2GHz

      內存:1GB

      Gpu: VideoCore IV GPU

      移植準備

      由于armv8-A AArch32 完全向后兼容armv7,因此可以通過參考樹莓派2B《LiteOS樹莓派移植指南》來適配樹莓派3B。

      硬件環境

      本次移植使用了Raspberry Pi 3 Model B開發板、USB轉TTL模塊、SDcard和讀卡器。

      軟件環境

      本次移植需要先按照碼云(gitee)上的LiteOS教程搭建好linux開發環境(make、arm-none-eabi編譯工具鏈)。環境搭建教程為:https://gitee.com/LiteOS/LiteOS/blob/master/doc/LiteOS_Build_and_IDE.md。

      本次移植需要下載樹莓派官方的鏡像制作工具(Raspberry Pi Imager),

      -為:https://www.raspberrypi.org/software/ 。

      移植步驟

      在Raspberry_Pi3B開發板上移植適配LiteOS的主要步驟如下:

      創建目錄結構

      在targets目錄下復制Raspberry_Pi2B目錄并重命名為Raspberry32_Pi3B??截恡argets\qemu-virt-a53\include\asm\dma.h文件到Raspberry32_Pi3B\include\asm目錄下:

      目錄/文件

      說明

      Inc

      芯片外設配置的頭文件

      include

      系統相關配置頭文件

      os_adapt

      適配的接口文件

      Src

      芯片外設配置的源文件

      liteos.ld

      當前開發板工程的鏈接文件

      Makefile

      當前開發板工程的Makefile

      los_startup_gcc.S

      芯片啟動文件

      表1 目錄結構

      設置異常向量表

      在los_startup_gcc.S中設置System Control Register寄存器的第13bit為0,表示異常向量表的基地址從0開始。代碼如下所示:

      /* set vector base 0x00000000 */ mrc p15, 0, r0, c1, c0, 0 bic r0, #(1 << 13) mcr p15, 0, r0, c1, c0, 0

      System Control Register寄存器第13bit如下所示:

      [13]

      V

      V Vectors bit. This bit selects the base address of the exception vectors:

      0:Normal exception vectors, base address 0x00000000. Software can remap this base address usingthe VBAR.

      1:High exception vectors, base address 0xFFFF0000. This base address is never remapped.The primary input VINITHI defines the reset value of the V bit.

      添加MMU功能

      MMU(Memory Management Unit):主要用于虛擬地址到物理地址的轉換和訪問權限控制。更多MMU功能請參考文末鏈接。

      ? 設置L1頁表表項

      LiteOS樹莓派移植指南(二)

      在main.c增加如下設置L1頁表表項代碼(本次MMU只涉及L1頁表),將4G虛擬內存線性映射到物理地址。

      VOID MmuSectionInit(VOID) { UINT32 ttbBase = (UINTPTR)g_firstPageTable; /* First clear all TT entries - ie Set them to Faulting */ (VOID)memset_s((VOID *)(UINTPTR)ttbBase, MMU_16K, 0, MMU_16K); /* Set all mem 4G as uncacheable & rw first */ X_MMU_SECTION(0, 0, (MMU_4G >> SHIFT_1M), UNCACHEABLE, UNBUFFERABLE, ACCESS_RW, NON_EXECUTABLE, D_CLIENT); X_MMU_SECTION(0, 0, ((AUX_BASE - 1) >> SHIFT_1M), CACHEABLE, BUFFERABLE, ACCESS_RW, EXECUTABLE, D_CLIENT); }

      ? 在los_startup_gcc.S文件中添加以下代碼開啟MMU

      1.無效TLB所有表項

      mcr p15, #0, r0, c8, c7, #0

      注:TLB(Translation Lookaside Buffer)相當于頁表的Cache。

      2.設置DOMAIN0和DOMAIN01的訪問權限

      mov r0, #(DOMAIN0 | (DOMAIN1 << 2)) mcr p15, 0, r0, c3, c0

      注:CP15中的寄存器C3定義了ARM處理器的16個域的訪問權限。(具體請參考文末相關文檔)

      3.設置MMU L1頁表基地址

      ldr r0, =g_firstPageTable mcr p15, #0, r0, c2, c0, #0

      4.開啟MMU和cache

      /* enable mmu */ mrc p15, #0, r0, c1, c0, #0 orr r0, r0, #1 mcr p15, #0, r0, c1, c0, #0 /* enable icache */ mrc p15, #0, r0, c1, c0, #0 orr r0, r0, #(1 << ICACHE_BIT) mcr p15, #0, r0, c1, c0, #0 mrc p15, #0, r0, c1, c0, #0 orr r0, r0, #(1 << DCACHE_BIT) mcr p15, #0, r0, c1, c0, #0

      注:更多協處理器請參考鏈接:https://developer.arm.com/documentation/ddi0464/f?lang=en 。

      添加SMP功能

      ? 在los_startup_gcc.S文件中增加如下代碼:

      1. 增加獲取cpu id代碼

      mrc p15, 0, r11, c0, c0, 5 and r11, r11, #MPIDR_CPUID_MASK

      MPIDR寄存器bit[1:0]如下所示:

      [1:0]

      CPU ID

      Indicates the processor number in the Cortex-A7 MPCore processor. For:

      ? One processor, the CPU ID is 0x0.

      ? Two processors, the CPU IDs are 0x0 and 0x1.

      ? Three processors, the CPU IDs are 0x0, 0x1, and 0x2.

      ? Four processors, the CPU IDs are 0x0, 0x1, 0x2, and 0x3.

      2.增加如下判斷(用于避免全局資源重復初始化):

      cmp r11, #0 bne excstatck_loop_done

      3. 增加其他核入口(secondary_cpu_start函數具體實現請參考main.c中的實現):

      cpu_start: #ifdef LOSCFG_APC_ENABLE bl setup_mmu #ifdef LOSCFG_KERNEL_SMP bl secondary_cpu_start #endif #endif b .

      ? 在main.c中添加如下代碼:

      for (coreId = 1; coreId < LOSCFG_KERNEL_CORE_NUM; coreId++) { /* per cpu 4 mailbox */ mailbox->writeSet[coreId * 4 + MAILBOX3_IRQ - MAILBOX0_IRQ] = (UINT32)reset_vector; asm volatile ("sev"); } while (LOS_AtomicRead(&g_cpuNum) < LOSCFG_KERNEL_CORE_NUM) { asm volatile("wfe"); }

      注:主核通過mailbox機制喚醒其他核,并等待其他核啟動。

      ? 在drivers/interrupt/arm_control.c文件添加ipi中斷代碼。參考樹莓派官方芯片手冊中的mailbox機制來實現HalIrqSendIpi函數和HalSmpIrqInit函數。

      適配編譯配置

      ? 在targets/kconfig.raspberry文件添加如下代碼:

      config LOSCFG_PLATFORM_RASPBERRY32_PI3B bool "Raspberry32_Pi3B" select LOSCFG_ARCH_CORTEX_A53_AARCH32 select LOSCFG_USING_BOARD_LD select LOSCFG_PLATFORM_ARM_CONTROL select LOSCFG_RASPBERRY_PI_SYSTICK

      ? 修改以下Makefile:

      driver/timer/Makefile driver/interrupt/Makefile targets/Raspberry32_Pi3B/Makefile

      注:樹莓派3B開啟SMP功能后systick使用generic time,否則使用arm side timer。

      制作啟動SDcard

      使用Raspberry Pi Imager工具制作Raspberry Pi系統。

      Raspberry Pi Imager 下載鏈接:https://www.raspberrypi.org/software/

      ? 將編譯生成的kernel7.img文件替換掉SDcard中kernel7.img文件。

      ? 將寫入鏡像文件的SDcard插入樹莓派3B中并上電,樹莓派3B即可運行LiteOS系統。

      運行結果如下:

      ********Hello Huawei LiteOS******** LiteOS Kernel Version : 5.1.0 Processor : Cortex-A53 * 4 Run Mode : SMP build time : Aug 21 2021 10:15:24 ********************************** OsAppInit cpu 0 entering scheduler cpu 1 entering scheduler cpu 2 entering scheduler cpu 3 entering scheduler Huawei LiteOS #

      至此,LiteOS系統成功啟動和運行。該移植工程已經在Gitee LiteOS社區上線,

      相關代碼鏈接地址為:https://gitee.com/LiteOS/LiteOS/tree/master/targets/Raspberry32_Pi3B 。

      相關文檔地址

      MMU 訪問權限控制:https://blog.csdn.net/llf021421/article/details/6330102

      MMU 訪問權限控制:https://blog.csdn.net/llf021421/article/details/6330102

      MMU cache和writebuffer:https://blog.csdn.net/fcglx/article/details/87924578

      MMU 頁表:https://blog.csdn.net/czg13548930186/article/details/74979222

      樹莓派官方芯片手冊:

      https://datasheets.raspberrypi.org/bcm2835/bcm2835-peripherals.pdf

      結語

      至此,LiteOS系統成功啟動和運行。該移植工程已經在Gitee LiteOS社區上線,相關代碼鏈接地址為:https://gitee.com/LiteOS/LiteOS/tree/master/targets/APM32F103_Geehy

      感謝您的閱讀,有任何問題、建議,都可以留言給我們,讓我們一起進步:

      https://gitee.com/LiteOS/LiteOS/issues

      為了更容易找到“LiteOS”代碼倉,建議訪問https://gitee.com/LiteOS/LiteOS,關注“ Watch”、“Star”、并“Fork”到自己賬號下,如下圖。

      -end-

      IoT 單片機 硬件開發 輕量級操作系統 LiteOS

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:細說機器人過程自動化(RPA)與AI人工智能
      下一篇:從簡單SQL轉換理解Antlr4訪問者模式技術細節
      相關文章
      国产亚洲精品成人a v小说| 中文字幕亚洲精品无码| 亚洲av无码成人精品区一本二本| 亚洲国产片在线观看| 亚洲国产精品第一区二区| 亚洲精品你懂的在线观看| 在线亚洲精品福利网址导航| 2022中文字字幕久亚洲| 亚洲精品无码专区2| 亚洲国产成人VA在线观看| 亚洲AV无码乱码在线观看牲色| 国产精品亚洲专区在线播放| 爱情岛论坛亚洲品质自拍视频网站 | 国产亚洲av片在线观看16女人| 亚洲一区爱区精品无码| 亚洲人成人无码网www电影首页 | 国产亚洲精品无码拍拍拍色欲 | 亚洲免费一级视频| 亚洲中文字幕无码av在线| 久久精品国产亚洲AV蜜臀色欲 | 国产亚洲成AV人片在线观黄桃 | 亚洲国产精品网站在线播放 | 亚洲精品国产suv一区88 | 国产亚洲精彩视频| 亚洲国产一区二区视频网站| 亚洲熟伦熟女新五十路熟妇 | 亚洲日韩精品一区二区三区无码| 国产亚洲精品a在线观看app| 亚洲AV本道一区二区三区四区| 久久久久久亚洲Av无码精品专口 | 久久亚洲国产精品123区| 亚洲综合精品香蕉久久网| 亚洲精品高清无码视频| 亚洲一区综合在线播放| 亚洲国产综合精品| 亚洲乱亚洲乱妇24p| 亚洲国产高清精品线久久| 精品亚洲综合在线第一区| 亚洲黄色在线观看| 亚洲伦理中文字幕| 国产尤物在线视精品在亚洲|