把鸿蒙Liteos-a移植到STM32MP157部分直播课件

系统
文章由鸿蒙社区产出,想要了解更多内容请前往:51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com/#zz

[[349898]]

 想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

0 . 准备工作与说明

0.1 准备工作

请先下载以下文件,里面有文档:

https://gitee.com/weidongshan/openharmony_for_imx6ull/repository/archive/master.zip

参考GIT中的文档,安装好虚拟机,从GIT总下载Liteos-a源码,打上IMX6ULL的补丁。

0.2 说明

1. Makefile编译系统分析

1.1 变量 

  1. 1. LITEOSTOPDIR // kernel/liteos_a 
  2.  
  3. 2. LITEOSTHIRDPARTY // third_party 
  4.  
  5. 3. LITEOS_MK_PATH // kernel/liteos_a/tools/build/mk 
  6.  
  7. 4. MK_PATH = $(LITEOSTOPDIR)/tools/build/mk // kernel/liteos_a/tools/build/mk 

1.2 包含的文件 

  1. Makefile 
  2.  
  3. -include $(LITEOSTOPDIR)/tools/build/config.mk 
  4.  
  5. -include $(LITEOSTOPDIR)/tools/build/mk/los_config.mk 
  6.  
  7. -include $(LITEOSTOPDIR)/.config 
  8.  
  9. include $(LITEOSTOPDIR)/arch/cpu.mk 
  10.  
  11. -include $(LITEOSTOPDIR)/arch/arm/arm.mk 
  12.  
  13. include $(LITEOSTOPDIR)/platform/bsp.mk 
  14.  
  15. include $(LITEOSTOPDIR)/../../vendor/nxp/imx6ull/imx6ull.mk 
  16.  
  17. include $(LITEOSTOPDIR)/../../drivers/hdf/lite/hdf_lite.mk 
  18.  
  19. include $(LITEOSTOPDIR)/../../vendor/nxp/hdf/hdf_vendor.mk 
  20.  
  21. -include $(LITEOSTOPDIR)/3rdParty/3rdParty.mk 
  22.  
  23. -include $(LITEOS_MK_PATH)/liteos_tables_ldflags.mk 
  24.  
  25. -include $(LITEOS_MK_PATH)/dynload.mk 

1.3 把Makefile全部展开

得到了一个Makefile_all.txt,

分析Makefile_all.txt,就可以知道编译过程。

1.4 分析在kernel/liteos_a下执行make的过程

1.4.1 第1个目标

all: $(OUT) $(BUILD) $(LITEOS_TARGET) $(APPS)

1.4.2 目标:OUT

  • OUT目标: 
  1. # .config文件中, LOSCFG_PLATFORM="imx6ull" 
  2.  
  3. OUT = $(LITEOSTOPDIR)/out/$(LITEOS_PLATFORM) 
  4.  
  5. $(OUT): $(LITEOS_MENUCONFIG_H) 
  6.  
  7. $(HIDE)mkdir -p $(OUT)/lib 
  8.  
  9. $(HIDE)$(CC) -I$(LITEOS_PLATFORM_BASE)/include -I$(BOARD_INCLUDE_DIR) \ 
  10.  
  11. -E $(LITEOS_PLATFORM_BASE)/board.ld.S \ 
  12.  
  13. -o $(LITEOS_PLATFORM_BASE)/board.ld -P 
  • OUT的依赖:LITEOS_MENUCONFIG_H 
  1. LITEOS_MENUCONFIG_H = $(LITEOSTOPDIR)/include/generated/autoconf.h 
  2.  
  3. KCONFIG_FILE_PATH = $(LITEOSTOPDIR)/Kconfig 
  4.  
  5. $(LITEOS_MENUCONFIG_H): 
  6.  
  7. ifneq ($(LITEOS_PLATFORM_MENUCONFIG_H), $(wildcard $(LITEOS_PLATFORM_MENUCONFIG_H))) 
  8.  
  9. $(HIDE)$(MAKE) genconfig 
  10.  
  11. endif 
  12.  
  13. genconfig:$(MENUCONFIG_PATH)/conf 
  14.  
  15. $(HIDE)mkdir -p include/config include/generated 
  16.  
  17. $< --silentoldconfig $(KCONFIG_FILE_PATH) 
  18.  
  19. -mv -f $(LITEOS_MENUCONFIG_H) $(LITEOS_PLATFORM_MENUCONFIG_H) 

 1.4.3 目标:BUILD

创建目录 kernel/liteos_a/imx6ull/obj 

  1. OUT = $(LITEOSTOPDIR)/out/$(LITEOS_PLATFORM) 
  2.  
  3. BUILD = $(OUT)/obj 
  4.  
  5. $(BUILD): 
  6.  
  7. $(HIDE)mkdir -p $(BUILD) 

1.4.4 目标:LITEOS_TARGET

  1. LITEOS_TARGET = liteos 
  2. $(LITEOS_TARGET): $(__LIBS) 
  3.     $(HIDE)touch $(LOSCFG_ENTRY_SRC) 
  4.  
  5.     $(HIDE)for dir in $(LITEOS_SUBDIRS); \ 
  6.     do $(MAKE) -C $$dir all || exit 1; \ 
  7.     done 
  8.  
  9.     $(LD) $(LITEOS_LDFLAGS) $(LITEOS_TABLES_LDFLAGS) $(LITEOS_DYNLDFLAGS) -Map=$(OUT)/$@.map -o $(OUT)/$@ --start-group $(LITEOS_LIBDEP) --end-group 
  10. #   $(SIZE) -t --common $(OUT)/lib/*.a >$(OUT)/$@.objsize 
  11.     $(OBJCOPY) -O binary $(OUT)/$@ $(LITEOS_TARGET_DIR)/$@.bin 
  12.     $(OBJDUMP) -t $(OUT)/$@ |sort >$(OUT)/$@.sym.sorted 
  13.     $(OBJDUMP) -d $(OUT)/$@ >$(OUT)/$@.asm 
  14. #   $(NM) -S --size-sort $(OUT)/$@ >$(OUT)/$@.size 
  • 目标:__LIBS 
  1. # 没做什么事 
  2.  
  3. __LIBS = libs 
  4.  
  5. $(__LIBS): $(OUT) $(CXX_INCLUDE) 
  • 命令:$(HIDE)touch $(LOSCFG_ENTRY_SRC)

           每次都要编译los_config.c,touch一下 

  1. LOSCFG_ENTRY_SRC = $(LITEOSTOPDIR)/kernel/common/los_config.c 
  • 命令:进入每个LITEOS_SUBDIRS,执行make,后面重点讲解各个子目录的编译 
  1. # LIB_SUBDIRS 等于一系列的目录 
  2.  
  3. LIB_SUBDIRS := 
  4.  
  5. LIB_SUBDIRS += arch/arm/$(LITEOS_ARCH_ARM) # 就是arch/arm/arm 
  6.  
  7. LIB_SUBDIRS += $(PLATFORM_BSP_HISI_BASE) 
  8.  
  9. LIB_SUBDIRS += $(LITEOSTOPDIR)/kernel/common 
  10.  
  11. LIB_SUBDIRS += kernel/base 
  12.  
  13. LIB_SUBDIRS += $(IMX6ULL_BASE_DIR)/board 
  14.  
  15. LIB_SUBDIRS += $(IMX6ULL_BASE_DIR)/driver/mtd/common 
  16.  
  17. LIB_SUBDIRS += $(IMX6ULL_BASE_DIR)/driver/mtd/spi_nor 
  18.  
  19. LIB_SUBDIRS += $(IMX6ULL_BASE_DIR)/driver/imx6ull-fb 
  20.  
  21. LIB_SUBDIRS += $(IMX6ULL_BASE_DIR)/driver/imx6ull-uart 
  22.  
  23. LIB_SUBDIRS += kernel/extended/cpup 
  24.  
  25. LIB_SUBDIRS += lib/libc 
  26.  
  27. LIB_SUBDIRS += lib/libsec 
  28.  
  29. LIB_SUBDIRS += lib/libscrew 
  30.  
  31. LIB_SUBDIRS += fs/fat 
  32.  
  33. LIB_SUBDIRS += fs/jffs2 
  34.  
  35. LITEOS_SUBDIRS = $(LIB_SUBDIRS) 
  36.  
  37. $(HIDE)for dir in $(LITEOS_SUBDIRS); \ 
  38.  
  39. do $(MAKE) -C $$dir all || exit 1; \ 
  40.  
  41. done 
  • 链接及各类处理 
  1. $(LD) $(LITEOS_LDFLAGS) $(LITEOS_TABLES_LDFLAGS) $(LITEOS_DYNLDFLAGS) -Map=$(OUT)/$@.map -o $(OUT)/$@ --start-group $(LITEOS_LIBDEP) --end-group 
  2.  
  3. # $(SIZE) -t --common $(OUT)/lib/*.a >$(OUT)/$@.objsize 
  4.  
  5. $(OBJCOPY) -O binary $(OUT)/$@ $(LITEOS_TARGET_DIR)/$@.bin 
  6.  
  7. $(OBJDUMP) -t $(OUT)/$@ |sort >$(OUT)/$@.sym.sorted 
  8.  
  9. $(OBJDUMP) -d $(OUT)/$@ >$(OUT)/$@.asm 
  10.  
  11. # $(NM) -S --size-sort $(OUT)/$@ >$(OUT)/$@.size  

1.4.5 怎么编译各个子目录 

 
  • 第1行包含config.mk

           这是包含一些预先定义的变量,比如默认的编译选项等。

  • 定义了LOCAL_SRCS

           等于一系列C文件,这就是要编译的源文件。

  • 定义了LOCAL_INCLUDE

           这是头文件的目录

  • 定义了LOCAL_FLAGS

           这是编译选项

  • 定义了MODULE_NAME

           一般等于当前目录的名字,比如fat,以后就编译得到libfat.a

  • 怎么编译?看最后一行 
  1. include $(MODULE) 

MODULE就是: 

  1. MODULE = $(MK_PATH)/module.mk # kernel/liteos_a/tools/build/mk/module.mk 

分析module.mk: 

  1. # 找到第1个目标 
  2.  
  3. all : $(LIB) 
  4.  
  5. # LIB是什么, 如果没定义LOCAL_SO,LIB就是 lib$(MODULE_NAME).a, 比如 libfat.a 
  6.  
  7. ifeq ($(LOCAL_SO), y) 
  8.  
  9. LIBSO := $(OUT)/lib/lib$(MODULE_NAME).so 
  10.  
  11. LIBA := $(OUT)/lib/lib$(MODULE_NAME).a 
  12.  
  13. else 
  14.  
  15. LIBSO := 
  16.  
  17. LIBA := $(OUT)/lib/lib$(MODULE_NAME).a 
  18.  
  19. endif 
  20.  
  21. LIB := $(LIBA) $(LIBSO) 
  22.  
  23. # 怎么编译 LIBA ? 看下图 

 想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2020-10-16 09:47:34

鸿蒙Liteos-a移植

2020-10-19 10:28:58

liteos-a移植STM32MP157

2020-10-22 10:08:06

韦东山STM32MP157鸿蒙

2020-09-17 17:41:24

Liteos-a鸿蒙Linux

2020-11-13 09:45:36

Liteos-a

2019-12-09 14:13:41

awkPython编程语言

2012-11-28 09:08:04

UbuntuUbuntu 13.0图标

2011-03-30 09:49:19

Firefox 5.0

2011-03-29 13:40:41

SQLserver20SQL

2010-05-06 11:34:49

实现负载均衡

2011-03-17 17:36:01

iptables嵌入式Linux

2010-09-27 16:26:09

JVMarm

2022-07-25 14:31:55

LiteOS开发工具

2012-08-20 11:14:12

IBMdW

2011-09-14 09:26:24

Windows 8微软BUILD

2019-04-11 10:50:26

前端JavaScript开发

2012-05-18 20:30:19

微软 Android ap

2018-10-15 10:15:30

STM32Linux经验

2009-07-14 13:49:28

Swing组件AWT

2012-03-19 10:08:37

VmwarevSphere 5.0资源管理
点赞
收藏

51CTO技术栈公众号