【M61笔记】M61工程文件架构

[复制链接]
查看144 | 回复6 | 2024-6-11 12:24:33 | 显示全部楼层 |阅读模式

本帖最后由 知行合一 于 2024-6-13 19:20 编辑

之前看泽哥的帖子,仅仅只是看了遍,似懂非懂,即使配置GPIO也得回来看帖子

这次借着手里有快M61kit,根据泽哥的帖子看SDK,我也缕缕

顺便把一些问题请教下大家

有我理解错误的地方,正好请大家指正

build文件夹

该文件夹是编译后生成的 bin 文件存储的地方

编译生成的固件名由CMakeLists.txt决定

# 设置工程名称,这个配置决定了编译出来的文件名
# 编译后的 bin 文件是以工程名 + 芯片命名,这里只指定工程名
get_filename_component(PROJECT_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)

# CMAKE_CURRENT_SOURCE_DIR 指向当前处理的 CMakeLists.txt 文件对应的构建目录
project(${PROJECT_NAME})

生成的 bin 文件存储在 build/build_out 下,编译生成的bin文件为wifi_test_bl616.bin,616和618软件区分很小,共用SDK

1718079762355.jpg

这里生成的bin文件不是合成的bin文件,还需要其他如boot2等文件,具体看flash_prog_cfg.ini文件

使用博流烧录工具烧录的合成bin文件在SDK中,具体路径为:

必须执行下 make flash 才可以生成新的组合固件

aithinker_Ai-M6X_SDK/tools/bflb_tools/bouffalo_flash_cube/chips/bl616/img_create/whole_flash_data.bin

1718079796834.jpg

CMakeLists.txt

CMake 是一个跨平台、开源的构建系统,它可以帮助我们管理好工程里的软件架构。CMakeLists.txt 文件相当于执行的列表,它可以调用其他的.h 头文件和.so/.a 库文件,生成 Makefile,将.cpp/.c/.cc 文件编译成可执行文件或新的库文件。

cmake_minimum_required(VERSION 3.15)        # 指定Cmake的最小版本

include(proj.conf)      # 包含需要使用的组件文件,添加需要的组件都在这个文件设置

# 芯片包,原厂适配好了,不用管
find_package(bouffalo_sdk REQUIRED HINTS $ENV{BL_SDK_BASE})

# #############################################################

# 搜集所有的C文件
file(GLOB_RECURSE sources "${CMAKE_CURRENT_SOURCE_DIR}/components/*.c")

# 添加头文件的引用路径
sdk_add_include_directories(main config components/wifi components/mqtt components/led components/state components/esay_flash  components/cJson)

# 把C文件添加到工程里
target_sources(app PRIVATE ${sources})

# 设置main.c 的文件
# 注意:不能和file(GLOB_RECURSE sources "${CMAKE_CURRENT_SOURCE_DIR}/components/*.c") 冲突(Note: Cannot conflict with “file(GLOB_RECURSE sources "${CMAKE_CURRENT_SOURCE_DIR}/components/*.c")”)
sdk_set_main_file(main/main.c)

# 设置工程名称,这个配置决定了编译出来的文件名。
get_filename_component(PROJECT_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)
project(${PROJECT_NAME})    # 工程名 也是Build生成的文件名称

BouffaloSDK 中封装了以下函数接口,基本满足常用场景使用。

Function Description
sdk_generate_library 生成库,库名如果函数没有形参则使用当前库所在目录名
sdk_library_add_sources 为库添加源文件
sdk_library_add_sources_ifdef 为库添加源文件(满足 if 条件)
sdk_add_include_directories 添加头文件路径
sdk_add_include_directories_ifdef 添加头文件路径(满足 if 条件)
sdk_add_compile_definitions 添加宏定义,不要带 -D
sdk_add_compile_definitions_ifdef 添加宏定义(满足 if 条件)
sdk_add_compile_options 添加编译选项
sdk_add_compile_options_ifdef 添加编译选项(满足 if 条件)
sdk_add_link_options 添加链接选项
sdk_add_link_options_ifdef 添加链接选项(满足 if 条件)
sdk_add_link_libraries 添加静态库
sdk_add_link_libraries_ifdef 添加静态库(满足 if 条件)
sdk_add_subdirectory_ifdef 编译子目录下的 cmakelist(满足 if 条件)
sdk_add_static_library 添加外部静态库
sdk_set_linker_script 设置链接脚本
sdk_set_main_file 设置 main 函数所在文件
project 工程编译
target_source(app PRIVATE xxx) 添加源文件到 app 库中,当用户需要自己添加一些源文件又不想创建 cmakelist 单独编译成库,可以使用该项

flash_prog_cfg.ini

BouffaloSDK 采用新的 flash tool(bouffalo_flash_cube),并且烧录依赖 flash prog cfg.ini 文件。我们的烧录命令 make flash 就是依赖这个文件执行的。它也有自己的语法。

[cfg]
# 0: no erase, 1:programmed section erase, 2: chip erase
erase = 1
# skip mode set first para is skip addr, second para is skip len, multi-segment region with ; separated
skip_mode = 0x0, 0x0
# 复位下载功能使能(Reset download function enable)
# 0: not use isp mode, #1: isp mode
boot2_isp_mode = 1
# 配置boot2固件,否则无法使用复位烧录功能(Configure boot2 firmware, otherwise the reset burn function cannot be used)
[boot2]
# AiPi-Eyes-R1/R2 必要固件
#filedir = ./build/build_out/Rx_boot2_*.bin

filedir = ./build/build_out/boot2_*.bin
address = 0x000000  # address 必须使用 0 地址
# AiPi-Eyes-R1/R2 必要固件
#[edata]
#filedir = ./build/build_out/edata.bin
#address = 0x3e0000
# 配置partition固件,这是必要的(Configuring partition firmware is necessary)
[partition]
filedir = ./build/build_out/partition*.bin
address = 0xE000

# 配置应用程序固件地址,需要新建工程时需要修改“Project_basic” 为新工程的名字,否则可能会导致烧录失败
[FW]
filedir = ./build/build_out/WiFi6-Test_$(CHIPNAME).bin
address = 0x10000

正常使用只需要创建一个 KEY,例如 [FW],并且填写 filedir 和 address 就可以使用了

其中 filedir 的填写方式有以下几种

  • bin 文件全路径 + bin 文件名称
  • bin 文件相对路径 + bin 文件名称
  • bin 文件名称添加 _\$(CHIPNAME) 后缀可以自动识别成不同芯片(仅在 bin 文件名称前缀不同的时候使用)
  • bin 文件名称添加 * 通配符,可以自动补全 bin 文件名称(仅在 bin 文件名称前缀不同的时候使用)

[FW]项

  • FW 要烧录的应用固件,必须使用 FW 名称。
  • filedir 表示应用固件所在相对路径,正常来说是编译完后放在 build/build_out 目录。 _\$(CHIPNAME).bin 用于自动区分不同芯片。 xxx 表示应用固件名称,与 CMakeLists.txt 中 project(xxx) 中名称一致。* 表示正则匹配,可用可不用。address 必须使用 0 地址

多个运行固化烧录

禁止使用通配符 * 以及 _\$(CHIPNAME) 前缀,因为 bin 文件名称前缀相同。

[cfg]
 # 0: no erase, 1:programmed section erase, 2: chip erase
 erase = 1
 # skip mode set first para is skip addr, second para is skip len, multi-segment region with ; separated
 skip_mode = 0x0, 0x0
 # 0: not use isp mode, #1: isp mode
 boot2_isp_mode = 0

 [FW1]
 filedir = ./build/build_out/xxx0.bin
 address = 0x00000

 [FW2]
 filedir = ./build/build_out/xxx1.bin
 address = 0x10000

 [FW3]
 filedir = ./build/build_out/xxx2.bin
 address = 0x20000

main.c

主程序运行的文件。

Makefile

编译的文件,其指定了一系列以赖关系和依赖规则。指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,可以实现自动化编译,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。

目前来说只需要修改第二行 BL_SDK_BASE ?= \$(SDK_DEMO_PATH)/../aithinker_Ai-M6X_SDK 的编译路径设置即可。

# 当前工程文件路径(Current project file path)
SDK_DEMO_PATH ?= .
# 配置SDK路径(Configure SDK path)
BL_SDK_BASE ?= $(SDK_DEMO_PATH)/../aithinker_Ai-M6X_SDK
# 设置SDK路径(Set SDK path)
export BL_SDK_BASE

#配置芯片型号,M61/M62都配置成bl616(Configure chip models, with both M61 and M62 configured as bl616)
CHIP ?= bl616
#配置板子类型,M61/M62 保持 “bl616dk”(Configuration board subtype, M61/M62 maintains' bl616dk ')
BOARD ?= bl616dk
#配置编译工具链(Configure Compilation Toolchain)
CROSS_COMPILE ?= riscv64-unknown-elf-

# add custom cmake definition
#cmake_definition+=-Dxxx=sss

#引用实际的编译配置(Reference the actual compilation configuration)
include $(BL_SDK_BASE)/project.build

proj.conf

前面在 CMakeLists.txt 中提到的组件的使用,当我们需要使用各种组件或开启一些配置功能时,需要进入这个文件中添加。

# 这个文件决定了当前工程中用到的组件,并且把它们添加到编译列表
# 如果发现引用的某个组件的文件夹找不到路径,大概率是该组件没在这个文件中设置为启用

# Components
set(CONFIG_BFLOG 1)
set(CONFIG_FREERTOS 1)
set(CONFIG_POSIX 1)
set(CONFIG_TLSF 1)
set(CONFIG_SHELL 0)
set(CONFIG_LWIP 1)
set(CONFIG_WIFI6 1)
set(CONFIG_RF 1)
set(CONFIG_MBEDTLS 1)
set(CONFIG_DHCPD 1)
set(CONFIG_PING 1)

readme.md

说明文件,略过

问题

flash_prog_cfg.ini中

 [boot2]
 filedir = ./build/build_out/boot2_*.bin
 address = 0x000000

 [partition]
 filedir = ./build/build_out/partition*.bin
 address = 0xE000

 [FW]
 filedir = ./build/build_out/xxx*_$(CHIPNAME).bin
 address = 0x10000

 [mfg]
 filedir = ./build/build_out/mfg*.bin

已知boot2用于自动下载

FW是固件

其他两个 泽哥 说是 开启wifi功能烧录,但是 wifi6 test 没烧录 mfg 和 partition 也可以正常连接wifi

mfg 和 partition 这两个是干什么用的

回复

使用道具 举报

lovzx | 2024-6-11 13:45:21 | 显示全部楼层
学习
看到这条评论的人都发财了
回复

使用道具 举报

WT_0213 | 2024-6-11 13:50:04 | 显示全部楼层
学习
回复

使用道具 举报

爱笑 | 2024-6-11 15:13:12 | 显示全部楼层
给你问问泽哥!
用心做好保姆工作
回复 支持 反对

使用道具 举报

Ai-Thinker小泽 | 2024-6-11 15:24:55 | 显示全部楼层
写的时候还比较早期,是这样的,flash_prog_cfg.ini是给你配置make flash命令需要烧录的内容,而make flash也是有脚本的,会合成固件,其实后续也是烧录的合成固件,而如果是烧录工具烧录,是根据你partition table(分区表)来选择需要烧录的内容。具体你可以看一下bsp/board/bl616dk/config/partition_cfg_4M.toml。
回复 支持 反对

使用道具 举报

wxlinus | 2024-6-12 08:52:38 | 显示全部楼层
学习学习
回复

使用道具 举报

qhsj | 2024-6-12 12:31:30 | 显示全部楼层
学习~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则