从Zephyr RTOS项目在CMake中构建多个二进制文件,每个二进制文件都有不同的设备地址
Building multiple binaries in CMake from Zephyr RTOS project, each with different device address
我有一个项目,它由网格中的节点组成,这些节点将在彼此之间进行无线通信,并通过使用地址来识别彼此。
节点的职责是等效的,因此每个节点的源代码都是相同的,除了地址,我希望每个节点都是特定和唯一的。
这个项目将是一种演示或技术演示,所以为了简单起见,我不想介绍一些地址谈判或类似的复杂内容。
我进行了研究,发现了一些在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-researchCMakeFindBinUtils
和add_custom_command
+add_custom_target
中编写该脚本,并用$<TARGET_FILE:app>
生成表达式。
然后对生成的ELF文件使用objcopy
来生成bin文件。
总的来说,这听起来像是一种奇怪的方法,因为每个设备都有一些";识别号"制造商编号";等等存储在一些只读设备专用存储器中。强烈考虑读取该数字并将其用作地址。
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- C++单个生成文件多个二进制文件
- 尝试将数字写入二进制文件时引发异常
- C++中读/写二进制文件
- 如何忽略某些二进制文件的执行?
- 如何使用Qt为每个地址打印二进制文件
- 将二进制文件读取到向量元素的地址中