Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9218861
  • 博文数量: 1728
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 19870
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1728)

文章存档

2024年(4)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: 其他平台

2021-10-01 10:22:24

主要是参考

点击(此处)折叠或打开

  1. 主要是参考
  2. https://gitee.com/liangzili/harmony-raspberry
  3. 虽然是 harmony 1.0 的版本相关, 但是对于构建 liteos-A的整体架构流程和各个环节上绕坑还是很有参考意义的.
liteos_A对标 linux.
    Linux的强大在于它支持的硬件非常多,但是它过于庞大,启动慢、耗电,这些缺点导致它不适合用在物联网领域。比如倒车摄像头,没人能忍受2秒钟后才看见图像:即使你能忍受,也很难把Linux优化到2秒内启动。
    Liteos-a为物联网而生,支持MMU,支持内核/APP空间隔离、支持各个APP空间隔离,系统更健壮;支持POSIX接口,大量开源软件可以在Liteos-a上直接使用;启动快,省电。

实现上的差异化

  1. 参考 https://blog.csdn.net/fzf1996/article/details/116297562
  2. 了解 liteOS_A 和 linux 的内核架构/实现的文件架构的差别 .

liteOS_A 前期准备.

  1. 开发机环境
  2. ubuntu
  3. 引导流程
  4. iROM -> UBOOT -> liteos.bin (100,000) -> rootfs.jffs2(10,100,000)
  5. go 100000 - 10100000

  6. 引导媒介 SD
  7. fat32 格式. mkfs.vfat /dev/sdb1
  8. 内容
  9.  start4.elf --- raspberry pi 4b 特有
  10.  config.txt
  11.  fixup4.dat
  12.  u-boot.bin
  13.  bcm2711-rpi-4-b.dtb.

  14. 看到没, 这个部分和 linux部分基本上没有什么差别.

  liteOS-A配置部分


  1. 1. 添加新的单板. make menuconfig -> 进入huawei LiteOS configure 界面
  2.  - 添加 platform kernel\liteos_a\platform\Kconfig
  3.       新增 RASPi2B (选中 cortex_A7)
  4.  - 设置编译器. kernel\liteos_a\Kconfig
  5.       设置为 clang-llvm
  6.  - 其他
  7.       Enable kernel SMP
  8.       Enable libc
  9.       Enable posix
  10.       Enable security module
  11.       Enable VFS
  12.       Enable Driver


点击(此处)折叠或打开

  1. -------------------------------------------------
  2. 修改 makefile

  3. kernel\liteos_a\Makefile
  4.   ifeq ($(LOSCFG_PLATFORM_RASPBERRYPI2B), y)
  5.     FSTYPE = jffs2 设置根文件系统类型和大小.
  6.     ROOTFS_SIZE = 0xA00000
  7.   endif

  8.   ##### make lib #####
  9. $(__LIBS): $(OUT) $(CXX_INCLUDE)
  10. ifeq ($(LOSCFG_PLATFORM_RASPBERRYPI2B),y)
  11. BOARD_INCLUDE_DIR := $(LITEOSTOPDIR)/../../vendor/broadcom/BCM2836/board
  12. else
  13. BOARD_INCLUDE_DIR := $(LITEOSTOPDIR)/../../vendor/hisi/hi35xx/$(LITEOS_PLATFORM)/config/board
  14. endif

  15. $(OUT): $(LITEOS_MENUCONFIG_H)
  16.     $(HIDE)mkdir -p $(OUT)/lib
  17.     $(HIDE)$(CC) -I$(LITEOS_PLATFORM_BASE)/include -I$(BOARD_INCLUDE_DIR)     -E $(LITEOS_PLATFORM_BASE)/board.ld.S         -o $(LITEOS_PLATFORM_BASE)/board.ld -P

  18. 同时在源码目录/vendor下添加broadcom文件目录, 下层目录参考
  19. 内核/架构/芯片公司/芯片/板卡公司/硬件版本
  20. Cortex-A7/Armv7-A/broadcom/BCM2836/Raspberry_Pi/.. (跟着韦东山老师走)
  21. ------------------------------------------------
  22. 修改 vendor\broadcom\BCM2836\BCM2836.mk

  23. 设置基目录地址
  24. BCM2836_BASE_DIR := $(LITEOSTOPDIR)/../../vendor/broadcom/BCM2836
  25. ------------------------------------------------
  26. kernel\liteos_a\platform\Makefile
  27. 仿照其他单板添加,43行左右
  28. $(LOSCFG_PLATFORM_RASPBERRYPI2B) \
  29. ifeq ($(findstring y, $(LOSCFG_PLATFORM_HI3518EV300)$(LOSCFG_PLATFORM_HI3516DV300)$(LOSCFG_PLATFORM_RASPBERRYPI2B)), y)

  30. ------------------------------------------------
  31. kernel\liteos_a\platform\bsp.mk

  32. 设置单板的设备类型,比如中断、timer、串口、USB之类的,58行左右

  33. ########################## LOSCFG_PLATFORM_RASPBERRYPI2B Options##############################
  34. else ifeq ($(LOSCFG_PLATFORM_RASPBERRYPI2B), y)
  35.     HWI_TYPE := arm/interrupt/gic
  36.     TIMER_TYPE := arm/timer/arm_generic
  37.     HRTIMER_TYPE := BCM2836/hrtimer
  38.     #UART_TYPE := amba_pl011

  39. 设置头文件要包含的目录,在90行左右

  40. ifeq ($(findstring y, $(LOSCFG_PLATFORM_HI3518EV300)$(LOSCFG_PLATFORM_HI3516DV300)), y)
  41.     PLATFORM_INCLUDE += -I $(LITEOSTOPDIR)/../../vendor/hisi/hi35xx/$(LITEOS_PLATFORM)/config/board/include/hisoc
  42. else ifeq ($(LOSCFG_PLATFORM_RASPBERRYPI2B),y)
  43.     PLATFORM_INCLUDE += -I $(LITEOSTOPDIR)/../../vendor/broadcom/BCM2836/board/include
  44. endif
  45. ------------------------------------------------
  46. drivers\hdf\lite\hdf_lite.mk

  47. 设置HDF的顶层目录,在39行左右,有点没搞懂,为啥不直接使用一个默认的路径

  48. include $(LITEOSTOPDIR)/../../vendor/huawei/hdf/hdf_vendor.mk
  49. 替换为:
  50. ifeq ($(findstring y, $(LOSCFG_PLATFORM_HI3518EV300)$(LOSCFG_PLATFORM_HI3516DV300)), y)
  51. include $(LITEOSTOPDIR)/../../vendor/huawei/hdf/hdf_vendor.mk
  52. endif

  53. ifeq ($(LOSCFG_PLATFORM_RASPBERRYPI2B), y)
  54. include $(LITEOSTOPDIR)/../../vendor/broadcom/hdf/hdf_vendor.mk
  55. endif
  56. ------------------------------------------------
  57. vendor\huawei\hdf\hdf_vendor.mk(TODO)

  58. 设置下单板的HDF相关文件路径,18行左右

  59. else ifeq ($(LOSCFG_PLATFORM_RASPBERRYPI2B), y)
  60.     LIB_SUBDIRS += $(LITEOS_SOURCE_ROOT)/vendor/broadcom/BCM2836/config
  61.     VENDOR_HDF_DRIVERS_PLATFORM_ROOT := $(LITEOSTOPDIR)/../../vendor/broadcom/BCM2836/platform #这个文件夹还没有
  62. ------------------------------------------------
  63. 编译

  64. 编译测试的时候可以修改kernel\liteos_a\tools\build\mk\los_config.mk HIDE的值为空,可以显示make的执行命令

  65. HIDE := #删除@表示显示make的执行命令
  66. ------------------------------------------------
  67. 修改下面这4个头文件(TODO)

  68. kernel/liteos_a/shell/full/src/base/show.c
  69. kernel/liteos_a/shell/full/src/base/shcmd.c
  70. kernel/liteos_a/shell/full/src/base/shmsg.c
  71. kernel/liteos_a/shell/full/src/cmds/dmesg.c
  72. #elif defined LOSCFG_PLATFORM_RASPBERRYPI2B
  73. #include "uart.h"

  74. ------------------------------------------------
  75. tools\build\mk\los_config.mk:170

  76. LITEOS_BASELIB += -lhi35xx_bsp
  77. LIB_SUBDIRS += $(LITEOSTOPDIR)/../../vendor/hisi/hi35xx/$(LITEOS_PLATFORM)/config/board/
  78. 替换为:
  79. ifeq ($(LITEOS_PLATFORM),BCM2836)
  80. include $(LITEOSTOPDIR)/../../vendor/broadcom/BCM2836/BCM2836.mk
  81. endif
  82. ifeq ($(findstring y, $(LOSCFG_PLATFORM_HI3518EV300)$(LOSCFG_PLATFORM_HI3516DV300)), y)
  83. LITEOS_BASELIB += -lhi35xx_bsp
  84. LIB_SUBDIRS += $(LITEOSTOPDIR)/../../vendor/hisi/hi35xx/$(LITEOS_PLATFORM)/config/board/
  85. endif
  86. ------------------------------------------------
  87. kernel\liteos_a\kernel\common\los_config.h

  88. 43行左右,注释此行

  89. //#include "hisoc/clock.h" //或者直接把这个文件放到hisoc这个文件夹试试
  90. #include "clock.h"
  91. ------------------------------------------------

点击(此处)折叠或打开

  1. 启动模式
  2. 树莓派默认启动在HYP模式,我们需要在内核启动前改为SVC模式

  3. kernel\liteos_a\arch\arm\arm\src\startup\reset_vector_up.S 在115行左右,reset_vector:下面添加

  4.     mrs r0,cpsr         //读取CPU模式寄存器
  5.     bic r0,r0,#0x1F        //清除CPU模式位(如果处于催眠模式,它将是1A)保留所有其他
  6.     orr r0,r0,#0x13        //设置CPU_MODE为SVC_MODE (0x13),而ORR仍然保留所有其他位
  7.     msr spsr_cxsf,r0    //将其写入spsr_cxsf寄存器,以便在调用交换机时加载该寄存器。
  8.     add r0,pc,#4        //从pc计算要进入SVC_MODE的地址(后面的两个操作码很长)
  9.     msr ELR_hyp,r0        //将地址值写入ELR_hyp寄存器
  10.     eret                //执行了回车指令

点击(此处)折叠或打开

  1. 串口打印驱动
  2. https://gitee.com/liangzili/harmony-raspberry/blob/master/doc/2.3%E3%80%81%E4%B8%B2%E5%8F%A3%E5%88%86%E6%9E%90%E7%A7%BB%E6%A4%8D.md

点击(此处)折叠或打开

  1. 系统时钟
  2. 操作系统运行多任务,需要tick中断来切换Task,tick中断由Timer产生,主要文件kernel\liteos_a\platform\hw\arm\timer\arm_generic\arm_generic_timer.c

  3. Timer的驱动文件在kernel\liteos_a\platform\bsp.mk进行了设置
  4. ########################## LOSCFG_PLATFORM_RASPBERRYPI2B Options##############################
  5. else ifeq ($(LOSCFG_PLATFORM_RASPBERRYPI2B), y)
  6.     HWI_TYPE := arm/interrupt/gic
  7.     TIMER_TYPE := arm/timer/arm_generic
  8.     HRTIMER_TYPE := BCM2836/hrtimer
  9.     #UART_TYPE := amba_pl011
  10. endif


  11. 分析这个文件参考
  12. https://gitee.com/liangzili/harmony-raspberry/blob/master/doc/2.4%E3%80%81%E7%B3%BB%E7%BB%9F%E6%97%B6%E9%92%9F.md













    



阅读(1618) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~