0

我有一个项目,它由网格中的节点组成,它们之间将进行无线通信,并使用地址相互识别。

节点的职责是相同的,因此每个节点的源代码都是相同的,除了我想为每个节点指定和唯一的地址。

该项目将是一种演示或技术演示,因此为简单起见,我不想介绍一些地址协商或类似的复杂内容。

我正在研究并发现一些在 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 脚本?

编辑:我在想是否可以从 CMake 级别执行 #define <device_addr> 之类的操作,然后对其余设备重复 X 次。所以最后我会得到 X 二进制文件,它们仅在#define <device_addr> 方面有所不同。

感谢您提前回复。

4

1 回答 1

0

使用地址在您的项目中创建一个自定义 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>

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

总的来说,这听起来像是一种奇怪的方法,因为每个设备都有一些“标识号”、“制造商号”等存储在一些只读设备特定的内存中。强烈考虑阅读该数字并将其用作地址。

于 2022-01-22T12:09:33.733 回答