摘要:树莓派是英国的慈善组织“Raspberry Pi 基金会”开发的一款基于arm的微型电脑主板。本文介绍基于LiteOS的树莓派移植过程。

本文分享自华为云社区《2021 LiteOS树莓派移植指南(一)》,作者: Lionlace 。

树莓派是英国的慈善组织“Raspberry Pi 基金会”开发的一款基于arm的微型电脑主板。本文介绍基于LiteOS的树莓派移植过程。

硬件信息

开发板:Raspberry Pi 2 Model B(树莓派2B)

CPU:Broadcom BCM2836

主频:900MHz

内存:1GB

GPU:VideoCore IV GPU

移植准备

硬件环境

本实验使用了Raspberry Pi 2 Model B开发板、USB转TTL模块、SDcard和读卡器。

软件环境

  • 本实验需要先按照码云上的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/

移植步骤

创建目录结构

在targets目录下新增Raspberry_Pi2B目录,参考与cortex-A7架构差异较小的realview-pbx-a9的启动流程进行移植。

  • 将realview-pbx-a9目录下的reset_vector.S和main.c拷贝到Raspberry_Pi2B目录下并将reset_vector.S重命名为los_startup_gcc.S。
  • 将realview-pbx-a9目录下的board.ld和liteos.ld中内容合并到Raspberry_Pi2B目录下liteos.ld文件中。
  • 拷贝realview-pbx-a9目录下include、os_adapt文件夹到Raspberry_Pi2B目录下,并删除不需要的dma相关头文件include/asm/dma.h。

关闭SMP和MMU

在los_startup_gcc.S文件中增加关闭SMP和MMU的代码。

  • 关闭SMP功能
mrc p15, 0, r0, c1, c0, 1
bic r0, r0, #0x40
mcr p15, 0, r0, c1, c0, 1

上表是ACTLR(Auxiliary Control Register)寄存器bit6功能描述信息,了解更多寄存器相关信息可以参考Cortex-A7 MPCore Technical Reference Manual。

  • 关闭MMU的功能
mrc     p15, #0, r0, c1, c0, #0
bic     r0, r0, #1
mcr     p15, #0, r0, c1, c0, #0    @ clear mmu bit

上表是SCTLR (System Control Register)寄存器bit0功能描述信息,了解更多寄存器相关信息可以参考Cortex-A7MPCore Technical Reference Manual。

  • 删除调用SMP相关函数

删除los_startup_gcc.S中的enable_scu和secondary_cpu_start。

使能FPU/ENON

配置FPU/NEON:

/* enable fpu+neon */
LDR     r0, =(0xF << 20)
MCR     p15, 0, r0, c1, c0, 2
MOV     r3, #0x40000000
VMSR    FPEXC, r3

以上前两行代码用于设置CP10和CP11的访问权限,后两行用于设置寄存器FPEXC的EN位来使能FPU。

:在arm的协处理器设计中,最多可以支持16个协处理器,通常被命名为cp0~cp15。

上表为寄存器CPACR bit20-23功能描述信息,了解更多寄存器相关信息可以参考Cortex-A7 MPCore Technical Reference Manual。

修改链接脚本

树莓派启动时首先加载SD卡中的start.elf文件,该程序会读取SD卡中的config.txt文件内容,该文件记录了一些配置信息。如果没有设置启动地址和启动文件,则默认会加载kernel8.img文件,该文件是aarch64编译的程序,启动地址为0x80000。如果SD卡中无kernel8.img镜像文件,则会加载kernel7.img镜像文件,该文件是32位编译器编译的程序,启动地址为0x8000。树莓派2B的cpu是32位架构,因此设置liteos.ld文件中启动地址为0x8000。

栈初始化

树莓派2B启动文件los_startup_gcc.S中只设置了SVC模式的sp寄存器,新增cpuInit函数来初始化其他模式的sp指针。如下所示:

VOID cpuInit(VOID)
{__asm__ ("msr    cpsr_c, %1\n\t""mov    sp,     %0\n\t""msr    cpsr_c, %3\n\t""mov    sp,     %2\n\t""msr    cpsr_c, %5\n\t""mov    sp,     %4\n\t""msr    cpsr_c, %7\n\t""mov    sp,     %6\n\t""msr    cpsr_c, %8\n\t":: "r" (__irq_stack_top),"I" (PSR_F_BIT | PSR_I_BIT | CPSR_IRQ_MODE),"r" (__abt_stack_top),"I" (PSR_F_BIT | PSR_I_BIT | CPSR_ABT_MODE),"r" (__undef_stack_top),"I" (PSR_F_BIT | PSR_I_BIT | CPSR_UNDEF_MODE),"r" (__fiq_stack_top),"I" (PSR_F_BIT | PSR_I_BIT | CPSR_FIQ_MODE),"I" (PSR_F_BIT | PSR_I_BIT | CPSR_SVC_MODE): "r14");
}

配置动态内存地址

#define OS_SYS_MEM_ADDR        ((void *)(&__bss_end))
#define LOS_HEAP_ADDR_END      (void*)(0x0 + 4 * 1024 * 1024)
#define OS_SYS_MEM_SIZE        (UINT32)(((UINT32)LOS_HEAP_ADDR_END - (UINT32)OS_SYS_MEM_ADDR + (64 - 1)) & ~(64 - 1))

以上代码定义OS_SYS_MEM_ADDR为动态内存起始地址,LOS_HEAP_ADDR_END为动态内存结束地址,OS_SYS_MEM_SIZE为动态内存大小。

串口实现

树莓派2B原理图引出了mini_uart串口TXD0、RXD0,对应的引脚为GPIO14、GPIO15,如下图所示:

创建usart.c和usart.h文件,在usart.c中编写串口初始化函数UartInit,并实现uart_debug.c文件中uart_getc、uart_hwiCreate、uart_write接口,实现printf函数从串口输出。

适配中断

树莓派2B的中断属于bcm特定的中断控制器。在drivers/interrupt目录下新增arm_control.c文件,并在该文件中实现HwiControllerOps结构体内的回调函数。

STATIC const HwiControllerOps g_armControlOps = {.enableIrq      = HalIrqUnmask,.disableIrq     = HalIrqMask,.getCurIrqNum   = HalCurIrqGet,.getIrqVersion  = HalIrqVersion,.getHandleForm  = HalIrqGetHandleForm,.handleIrq      = IrqEntryArmControl,.clearIrq       = HalIrqClear,.triggerIrq     = HalIrqPending,
};

以上表格是interrupt寄存器偏移地址,读者想了解详细寄存器相关信息请参考官方芯片手册。

适配systick

树莓派2B通过Timer(arm side)来触发systick中断。具体操作细节请参考文件:drivers\timer\rasp_systick.c。

/* systime=250000000 */
timer->preDivider = (OS_SYS_CLOCK / OS_SYS_US_PER_SECOND - 1);
timer->reload   = 0;
timer->load     = 0;
timer->IRQClear = 0;
timer->control  = 0;
timer->reload   = LOSCFG_BASE_CORE_TICK_PER_SECOND;
timer->load     = LOSCFG_BASE_CORE_TICK_PER_SECOND;
/* 23-bit counter, enable interrupt, enable timer */    timer->control = (1 << 1) | (1 << 5) | (1 << 7);
UINT32 ret = LOS_HwiEnable(ARM_TIMER_INI);

以上代码配置定时器Timer为每1ms触发一次systick中断。

以上是Timer寄存器偏移地址,读者想了解详细寄存器相关信息请参考官方芯片手册。

配置编译

在targets目录下新增kconfig.raspberry文件:

ConfigLOSCFG_PLATFORMconfig LOSCFG_PLATFORMstringdefault "Raspberry_Pi2B"      if LOSCFG_PLATFORM_Raspberry_Pi2B
choiceprompt "Board"depends on LOSCFG_FAMILY_RASPBERRYdefault LOSCFG_PLATFORM_Raspberry_Pi2BhelpRaspberry_Pi2B
config LOSCFG_PLATFORM_Raspberry_Pi2Bbool "Raspberry_Pi2B"select LOSCFG_ARCH_CORTEX_A7select LOSCFG_USING_BOARD_LDselect LOSCFG_PLATFORM_ARM_CONTROLselect LOSCFG_Raspberry_Pi2B_SYSTICK
endchoice

修改Makefile文件

分别修改以下路径Makefile(详情请参考gitee仓库对应文件):driver/timer/Makefiledriver/interrupt/Makefiletargets/Raspberry_Pi2B/Makefile

添加.img生成指令

在根目录下Makefile中添加指令$(OBJCOPY) -O binary $(OUT)/$@.elf $(OUT)/kernel7.img,用来将生成的elf文件转换生成kernel7.img文件。

制作启动SDcard

  • 使用Raspberry Pi Imager工具制作Raspberry Pi系统。

Raspberry Pi Imager 下载链接:https://www.raspberrypi.org/software/

  • 将编译生成的kernel7.img文件替换掉SDcard中kernel7.img文件。
  • 将写入镜像文件的SDcard插入树莓派2B中并上电,树莓派2B即可运行LiteOS系统。运行结果如下:
********Hello Huawei LiteOS********
LiteOS Kernel Version : 5.1.0
build data : Jul 13 2021 16:40:42
**********************************
OsAppInit
cpu 0 entering scheduler
app init!
Hello, welcome to liteos demo!
Huawei LiteOS #

至此,LiteOS系统成功启动和运行。该移植工程已经在Gitee LiteOS社区上线,相关代码链接地址为:LiteOS: Huawei LiteOS开源代码官方主仓库.LiteOS Studio 开发工具请访问https://gitee.com/LiteOS/LiteOS_Studio - Gitee.com

参考文献链接

[1] Raspberry Pihardware - Raspberry Pi Documentation:https://www.raspberrypi.org/documentation/hardware/raspberrypi/README.md

[2] 树莓派官方芯片手册:

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

[3] Cortex-A7 MPCore Technical Reference Manual:

https://developer.arm.com/documentation/ddi0464/f?lang=en

点击关注,第一时间了解华为云新鲜技术~

手把手带你做LiteOS的树莓派移植相关推荐

  1. 用Python写个桌面挂件,手把手带你做只桌面宠物~

    导语 前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今天就满足一下留过类似言的小伙伴的请求呗~不过感觉写桌面的挂历啥的没意思,就简单带大家做一只桌面宠物吧~ 皮卡丘大家喜欢吗~今天就由做个皮卡丘为 ...

  2. python桌面宠物模块_利用python写个桌面挂件 | 手把手带大家做只桌面宠物呗

    导语 前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今天就满足一下留过类似言的小伙伴的请求呗~不过感觉写桌面的挂历啥的没意思,就简单带大家做一只桌面宠物吧~ 废话不多说,让我们愉快地开始吧~ 开发 ...

  3. python桌面宠物_写个桌面挂件 | 手把手带大家做只桌面宠物呗

    原文链接网页链接​mp.weixin.qq.com 效果展示桌面宠物https://www.zhihu.com/video/1230197062286778368 导语 前段时间有小伙伴留言说想让我带 ...

  4. 用python做一个宠物系统_利用python写个桌面挂件 | 手把手带大家做只桌面宠物呗...

    导语 前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今天就满足一下留过类似言的小伙伴的请求呗~不过感觉写桌面的挂历啥的没意思,就简单带大家做一只桌面宠物吧~ 废话不多说,让我们愉快地开始吧~ 开发 ...

  5. 手把手带你做一套毕业设计-征程开启

    本文是<Vue + SpringBoot前后端分离项目实战>专栏的开篇,文本将会包含我们创作这个专栏的初衷,专栏的主体内容,以及我们专栏的后续规划.关于这套毕业设计的作者呢前端部分由狗哥负 ...

  6. 今天清华学长手把手带你做UI自动化测试

    互联网产品的迭代速度远高于传统软件,尤其是移动APP不但更新频繁,还需要在不同硬件.系统版本的环境下进行大量兼容测试,这就给传统测试方法和测试工具带来了巨大挑战.为满足产品敏捷开发.快速迭代的需求,自 ...

  7. 清华学长手把手带你做UI自动化测试

    互联网产品的迭代速度远高于传统软件,尤其是移动APP不但更新频繁,还需要在不同硬件.系统版本的环境下进行大量兼容测试,这就给传统测试方法和测试工具带来了巨大挑战.为满足产品敏捷开发.快速迭代的需求,自 ...

  8. 手把手带你做一个Python打飞机游戏

    搭建界面 #coding=utf-8 import pygame'''1\. 搭建界面,主要完成窗口和背景图的显示 '''if __name__ == "__main__":#1\ ...

  9. 手把手带你做强化学习实验--敲级详细

    小菜鸡在完成一个作业 好艰难 "如果你装环境不熟练,不要心急,淡定冷静深呼吸,总会遇到奇奇怪怪的问题,有的报错都看不懂搜不到,要慢慢来哦,尽量贴近我的版本号,再做好快照" 环境如下 ...

最新文章

  1. 金融数据分析(二)-------基本资本,金融衍生品,资本收益率
  2. 可视化生信分析利器 Galaxy 之 Docker 部署
  3. TeeChart经验总结 10.ZoomScroll
  4. OSChina 周四乱弹 —— 澳门首家货车上线啦
  5. 前端_JavaScript_面向对象编程
  6. CodeForces - 1325F Ehabs Last Theorem(dfs树找最大环)
  7. ModuleNotFoundError: No module named 'oscar.app'
  8. Unity的几个特殊文件夹
  9. Android设计模式之——中介者模式
  10. 已读服务器返回为空,钉钉考勤显示已读什么意思
  11. SQL2000系统表、存储过程、函数的功能介绍及应用
  12. 询问任意区间的min,max,gcd,lcm,sum,xor,or,and
  13. 一封信:同学聚会后的追忆
  14. 啊哈c语言逻辑的挑战课后题答案,啊哈C语言!逻辑的挑战(修订版) (啊哈磊著) 完整pdf高清版...
  15. IDEA 格式化代码快捷键冲突解决
  16. selenuim使用cookie登录京东
  17. 设计模式优秀文章集合
  18. Vant_根据已有地址获取code
  19. 360安全浏览器安装插件源文件存放位置
  20. 用Mailgun邮寄出去!

热门文章

  1. 第二十三章:准备原材料
  2. 十进制负数的二进制表示法
  3. linux c的内存映像
  4. Vrep脚本的执行顺序
  5. microsoft符合服务器加载符号的解决方案
  6. 以太坊代币事件监控_以太坊程序员的常见误解
  7. android 删除wifi文件在哪里设置,如何删除无线终端的无线配置文件
  8. 自考专科计算机信息管理专业好,计算机信息管理(专科)专业介绍
  9. js如何处理后台传递过来的Map
  10. 【原】android【手机】屏幕适配解决方案,完美适配适配hdpi,xhdpi,xxhdpi的做法。...