从Zephyr RTOS项目在CMake中构建多个二进制文件,每个二进制文件都有不同的设备地址

Building multiple binaries in CMake from Zephyr RTOS project, each with different device address

本文关键字:二进制文件 地址 CMake 项目 构建 Zephyr RTOS      更新时间:2024-09-24

我有一个项目,它由网格中的节点组成,这些节点将在彼此之间进行无线通信,并通过使用地址来识别彼此。

节点的职责是等效的,因此每个节点的源代码都是相同的,除了地址,我希望每个节点都是特定和唯一的。

这个项目将是一种演示或技术演示,所以为了简单起见,我不想介绍一些地址谈判或类似的复杂内容。

我进行了研究,发现了一些在CMake中使用target_compile_definitions的建议,但我真的不确定如何将其应用于通用Zephyr CMakeLists.txt:

set(BOARD qemu_x86)
find_package(Zephyr)
project(my_zephyr_app)
target_sources(app PRIVATE src/main.c)

所以我想知道最好的方法是什么?在CMake中有办法做到这一点吗(说到CMake,我还很不熟悉(?或者我应该修改一些Python脚本?

编辑:我在想,也许可以做一些像#define<device_addr>从CMake级别开始,然后对其余设备重复X次。所以最后我会有X个二进制文件,它们只在#define<device_addr>。

感谢您提前回复。

使用地址在项目中创建一个自定义ELF部分。使用编译器特定的语法。这是为GCC编译器:

// volatile, so that optimizer does not bite us
__attribute__((__section__("myaddress")))
__attribute__((__used__))
volatile const uint8_t _address[20] = {0};
# external API - fetch the address
# remove volatile for usage for optimizations
uint8_t *get_address(uint8_t buffer[20]) {
memcpy(buffer, _address, sizeof(_address));
return address;
}

最好创建一个链接器文件,这样您的节就可以放在.rodata只读内存中。

生成一个ELF文件。

创建一个简短的脚本。此脚本将用您的自定义数据(实际地址(替换生成的ELF文件中的部分内容。使用objcopy --update-section myaddress=filename更新节,其中filename具有节的二进制内容。对每个地址重复objcopy。最好是在CMake-researchCMakeFindBinUtilsadd_custom_command+add_custom_target中编写该脚本,并用$<TARGET_FILE:app>生成表达式。

然后对生成的ELF文件使用objcopy来生成bin文件。

总的来说,这听起来像是一种奇怪的方法,因为每个设备都有一些";识别号"制造商编号";等等存储在一些只读设备专用存储器中。强烈考虑读取该数字并将其用作地址。