PlatformIO:结合引导加载程序和应用程序映像的最佳方式

问题描述 投票:0回答:1

我正在为 stm32f4 目标处理两个不同的 Platformio 项目:引导加载程序和应用程序。最终,引导加载程序应该能够通过网络更新应用程序代码,但现在我想构建构建系统,以便我可以方便地使用编程器刷新芯片进行开发。 通过创建单独的 .elf 映像并刷新应用程序映像,然后使用 OpenOCD 手动刷新引导加载程序映像,我能够正确执行这两个部分。但是,只有当我先刷新应用程序,然后使用 OpenOCD 的

flash erase_sector
flash write_image
命令手动擦除并写入引导加载程序扇区时,它才会运行。

我的目标是拥有一个灵活的设置,使我能够方便地刷新 MCU,并在将来网络更新发挥作用时生成单独的二进制文件。

我对如何进行有一些想法,但我不确定最好的前进方法是什么:

a) 继续构建单独的图像并研究

objcopy/objdump
来切片和合并 .elf 文件,以便能够创建一个易于上传到目标 MCU 的组合图像,或者

b) 使用 PlatformIO 脚本,以便我链接两个项目的

.pio/build
目录中的目标文件的组合图像。

我还想知道我是否可以在 PlatformIO 框架内工作,而不是围绕两个完全独立的项目编写脚本。

欢迎任何意见。

embedded elf scons stm32f4 platformio
1个回答
0
投票

我找到了一种与 PlatformIO 配合使用且方便的方法:

  1. 将项目与其自己的链接器脚本分开,但确保它们链接到闪存的不相交区域。
  2. 使用
    arm-none-eabi-objcopy -O binary
    将 PlatformIO 创建的 .elf 文件转换为 .bin 文件(我已将其作为 PlatformIO 的 post 操作 包含在内)。
  3. 使用调用
    openocd
    的脚本进行 Flash。这里重要的部分是以二进制形式而不是 .elf 形式上传图像。这需要提供闪存中的地址:
openocd <target-specifics copied from Platformio> --command 'program { <path/to/bootloader.bin> 0x08000000 verify' --command 'program {path/to/app.bin} 0x08020000 verify' --command reset --command shutdown

这会保留调试符号并与 VSCode 中的调试器一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.