本帖最后由 Ai-Thinker小泽 于 2023-9-8 13:41 编辑
本帖最后由 Ai-Thinker小泽 于 2023-9-8 13:38 编辑
本帖最后由 Ai-Thinker小泽 于 2023-9-8 13:36 编辑
本帖最后由 Ai-Thinker小泽 于 2023-9-8 13:30 编辑
本帖最后由 Ai-Thinker小泽 于 2023-9-8 13:30 编辑
零基础开发小安派-Eyes-S1【入门篇】——工程文件架构
新建的工程包含多个文件和文件夹,作为初学者第一次接触,下面浅聊一下我对工程文件的了解,若有不对的地方请大家多多指正。
一、build文件夹
该文件夹是编译后生成的bin文件存储的地方,如本工程文件的文件名作为Helloworld,编译后的bin文件也是以工程名+芯片命名。
生成的bin文件存储在build/build_out下,可以看见有多个类似的文件,这里我们烧录取bin文件,这里可以看到在hellowworld工程编译生成的bin文件命名为 helloworld_bl616.bin,因为bl616和bl618的芯片其实在软件上的区分很小,他们通用同一个SDK,在硬件上的区分在于616的IO口数量不如618,由于使用同一套SDK,所以bl616和618的固件是可以通用的,这里无需过多计较区别。
注意,这里的bin文件在博流的烧录工具上并不是合成的bin文件,这里对应的bin文件是图中的firmware目录下的bin文件,还需要其他的如boot2等文件,那么问题来了,使用Single Download Options烧录的合成bin文件在哪里,其实是在SDK中,具体的路径为:
aithinker_Ai-M6X_SDK/tools/bflb_tools/bouffalo_flash_cube/chips/bl616/img_create/whole_flash_data.bin
如果需要使用Windows下的烧录工具烧录bin文件,选择这个路径下的whole_flash_data.bin即可。
二、CMakeLists.txt
CMake是一个跨平台、开源的构建系统,它可以帮助我们管理好工程里的软件架构。CMakeLists.txt文件相当于执行的列表,它可以调用其他的.h头文件和.so/.a库文件,生成Makefile,将.cpp/.c/.cc文件编译成可执行文件或新的库文件。我们从简单的helloworld工程学习,先打开CMakeLists.txt查看里面的语句。
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就是依赖这个文件执行的。它也有自己的语法。
正常使用只需要创建一个 KEY,例如 [FW],并且填写 filedir 和 address 就可以使用了。
其中 filedir 的填写方式有以下几种:
- bin 文件全路径 + bin 文件名称
- bin 文件相对路径 + bin 文件名称
- bin 文件名称添加 _$(CHIPNAME) 后缀可以自动识别成不同芯片(仅在 bin 文件名称前缀不同的时候使用)
- bin 文件名称添加 * 通配符,可以自动补全bin 文件名称(仅在 bin 文件名称前缀不同的时候使用)
1.模组作为MCU(不使用无线功能)
只需要和helloworld工程一样修改filedir的文件名即可。
[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
[FW]
filedir = ./build/build_out/xxx*_$(CHIPNAME).bin
address = 0x0000
- cfg 表示烧录时的一些配置,正常不需要改动
- FW 要烧录的应用固件,必须使用 FW 名称。filedir 表示应用固件所在相对路径,正常来说是编译完后放在 build/build_out 目录。 _$(CHIPNAME).bin 用于自动区分不同芯片。 xxx 表示应用固件名称,与 CMakeLists.txt 中 project(xxx) 中名称一致。* 表示正则匹配,可用可不用。address 必须使用 0 地址
2.模组作为IOT(开启无线功能)
[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
[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
address = 0x210000
- cfg 表示烧录时的一些配置,正常不需要改动
- FW 要烧录的应用固件,必须使用 FW 名称。
filedir 表示应用固件所在相对路径,正常来说是编译完后放在 build/build_out 目录。 _$(CHIPNAME).bin 用于区分不同芯片。 xxx 表示应用固件名称,与 CMakeLists.txt 中 project(xxx) 中名称一致。
address 由 partition_xxx.toml 指定
- boot2 要烧录的 boot2 固件,必须使用 boot2 名称。
filedir 表示 boot2 固件所在相对路径,正常来说是编译完后放在 build/build_out 目录。 自动从 bsp/board/board_name/config 目录拷贝。
address 必须使用 0 地址
- partition 要烧录的 partition 固件,必须使用 partition 名称。
filedir 表示 partition 固件所在相对路径,正常来说是编译完后放在 build/build_out 目录。 自动从 bsp/board/board_name/config 目录 partition_xxx.toml 转换成 bin 文件并拷贝。
address 由 partition_xxx.toml 指定
- mfg 要烧录的 mfg 固件,必须使用 mfg 名称。 mfg 可选,可以不烧录
filedir 表示 mfg 固件所在相对路径,正常来说是编译完后放在 build/build_out 目录。 自动从 bsp/board/board_name/config 目录拷贝。
address 由 partition_xxx.toml 指定
(备注:如果使用了 partition,address 可以使用 @partition 代替绝对地址,@partition 将会自动从 partition_xxx.toml 找到对应的地址)
3.多个运行固化烧录
禁止使用通配符 * 以及 _$(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
main.c,主程序运行的文件。
五、Makefile
编译的文件,其指定了一系列以赖关系和依赖规则。指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,可以实现自动化编译,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
目前来说只需要修改第二行BL_SDK_BASE ?= $(SDK_DEMO_PATH)/../aithinker_Ai-M6X_SDK的编译路径设置即可。
六、proj.conf
前面在CMakeLists.txt中提到的组件的使用,当我们需要使用各种组件或开启一些配置功能时,需要进入这个文件中添加。
举例:需要添加SD卡,或者LVGL。需要在proj.conf中
set(CONFIG_FATFS 1)
set(CONFIG_LVGL 1)
七、README.md
README相当于一个说明书,由工程的管理者进行编写,包括该工程一些简介,使用方法,注意事项等等。
md文件后缀的格式并不是什么高大上的文件,只是一种编辑的语法,可以使用记事本打开,也可以在VS中安装Markdown Preview插件。
这样查看README时可以右键点击 MPE:打开侧边预览,可以方便我们查看README。