Gdb eclipsecdt&;STM32:强制预定义程序内存
我有一个不常见但在我看来合理的用例: 我必须构建两个STM32固件映像:一个引导加载程序和一个应用程序(使用ST Microelectronics最新的基于Eclipse CDT的IDE,名为:“STM32CubeIDE”) 由于我的限制主要是低功耗,而不是安全性,因此我只需要DFU(设备固件升级)场景的数据完整性,为此,我对完整的FW映像执行了CRC32检查。棘手的部分是,固件本身在代码内存中的固定偏移地址0x200处的C结构中包含其实际大小(此设计的好处是,不必传输完整的代码内存,但FW始终受CRC32保护): 固件的布局如下所示:Gdb eclipsecdt&;STM32:强制预定义程序内存,gdb,eclipse-cdt,stm32,Gdb,Eclipse Cdt,Stm32,我有一个不常见但在我看来合理的用例: 我必须构建两个STM32固件映像:一个引导加载程序和一个应用程序(使用ST Microelectronics最新的基于Eclipse CDT的IDE,名为:“STM32CubeIDE”) 由于我的限制主要是低功耗,而不是安全性,因此我只需要DFU(设备固件升级)场景的数据完整性,为此,我对完整的FW映像执行了CRC32检查。棘手的部分是,固件本身在代码内存中的固定偏移地址0x200处的C结构中包含其实际大小(此设计的好处是,不必传输完整的代码内存,但FW始终
<ISR Table> <FW-Header@FixedAddress0x200> <RestFWCode> " + CRC32
(见:)
我的问题是,在调试器连接到MCU之前,我不知道如何启动这个简单的EXE调用。。。我尝试了“调试配置”->“启动”->“运行命令”,但没有成功
有人知道如何实现这一点吗?在启动调试会话之前运行程序可以使用位于调试配置下的Eclipse“启动组”来完成,例如,顶部菜单->运行->调试配置
但是,在执行此操作之前,您应该转到project properties->Builders并在那里添加程序调用-路径到可执行文件及其参数。确保未选中它,以便在构建项目时不会运行它。然后,您可以转到上面描述的启动组,创建一个包含您在project Builders部分中定义的程序的组,然后在该组中创建您应该已经在列表中可用的常规调试会话。在启动调试会话之前运行程序可以使用Eclipse的“启动组”完成位于调试配置下,例如顶部菜单->运行->调试配置
但是,在执行此操作之前,您应该转到project properties->Builders并在那里添加程序调用-路径到可执行文件及其参数。确保未选中它,以便在构建项目时不会运行它。然后,您可以转到上面描述的启动组,创建一个包含您在project Builders部分中定义的程序的组,然后在该组中创建您应该已经在列表中提供的常规调试会话。我将推荐一个不同的工作流来实现相同的图像格式:
<ISR Table> <FW-Header@FixedAddress0x200> <RestFWCode> " + CRC32
在STM32CubeIDE(生成原始二进制图像)中添加以下作为生成后步骤:
现在,您可以测试/评估流程了:
*.bin
文件*.bin
文件生成CRC-32C值\u IMAGE\u CRC=ABSOLUTE(0x0)
中的0x0
,以匹配您的计算值。取消对以下内容的注释:LONG((-u IMAGE\u CRC)-1)/*取消注释以追加值,注释以计算新值*/
0xffffff
arm none-eabi-objcopy-S-O binary${ProjName}.elf${ProjName}.bin
\u图像\u开始=代码>在向量表前面
/*FW图像头*/
长(_image_end-_image_start)/*FW图像的大小*/
长(_image_start)/*基址以加载FW image*/
/*将其放置在FW图像的末尾*/
_图像_end=。;
_图像_CRC=绝对值(0x0);/*使用CRC-32C(又名zip校验和)*/
/*长((-u IMAGE\u CRC)-1)/*取消注释以追加值,注释以计算新值*/
您可能会发现实际上不需要在图像中内置CRC值,只需将CRC值附加到
*.bin
。然后将*.bin
提供给引导加载程序。*.bin
仍将包含FW图像的加载地址和大小,附加CRC值为+4字节。我将推荐一种不同的工作流程来实现相同的图像格式:
<ISR Table> <FW-Header@FixedAddress0x200> <RestFWCode> " + CRC32
在STM32CubeIDE(生成原始二进制图像)中添加以下作为生成后步骤:
现在,您可以测试/评估流程了:
*.bin
文件*.bin
文件生成CRC-32C值\u IMAGE\u CRC=ABSOLUTE(0x0)
中的0x0
,以匹配您的计算值。取消对以下内容的注释:LONG((-u IMAGE\u CRC)-1)/*取消注释以追加值,注释以计算新值*/
0xffffff
arm none-eabi-objcopy-S-O binary${ProjName}.elf${ProjName}.bin
\u图像\u开始=代码>在向量表前面
/*FW图像头*/
长(_image_end-_image_start)/*FW图像的大小*/
长(_image_start)/*基址以加载FW image*/
.test_crc :
{
_image_start = .;
BYTE( 0x31)
BYTE( 0x32)
BYTE( 0x33)
BYTE( 0x34)
BYTE( 0x35)
BYTE( 0x36)
BYTE( 0x37)
BYTE( 0x38)
BYTE( 0x39)
/* FW Image Header */
LONG( _image_end - _image_start ) /* Size of FW image */
LONG( _image_start ) /* Base address to load FW image */
/* Place this at the end of the FW image */
_image_end = .;
_IMAGE_CRC = ABSOLUTE(0x0); /* Using CRC-32C (aka zip checksum) */
/*LONG( (-_IMAGE_CRC) - 1 ) /* Uncomment to append value, comment to calculate new value */
} >FLASH
arm-none-eabi-objcopy -S -O binary -j .test_crc ${ProjName}.elf ${ProjName}.bin