Gdb eclipsecdt&;STM32:强制预定义程序内存

Gdb eclipsecdt&;STM32:强制预定义程序内存,gdb,eclipse-cdt,stm32,Gdb,Eclipse Cdt,Stm32,我有一个不常见但在我看来合理的用例: 我必须构建两个STM32固件映像:一个引导加载程序和一个应用程序(使用ST Microelectronics最新的基于Eclipse CDT的IDE,名为:“STM32CubeIDE”) 由于我的限制主要是低功耗,而不是安全性,因此我只需要DFU(设备固件升级)场景的数据完整性,为此,我对完整的FW映像执行了CRC32检查。棘手的部分是,固件本身在代码内存中的固定偏移地址0x200处的C结构中包含其实际大小(此设计的好处是,不必传输完整的代码内存,但FW始终

我有一个不常见但在我看来合理的用例: 我必须构建两个STM32固件映像:一个引导加载程序和一个应用程序(使用ST Microelectronics最新的基于Eclipse CDT的IDE,名为:“STM32CubeIDE”)

由于我的限制主要是低功耗,而不是安全性,因此我只需要DFU(设备固件升级)场景的数据完整性,为此,我对完整的FW映像执行了CRC32检查。棘手的部分是,固件本身在代码内存中的固定偏移地址0x200处的C结构中包含其实际大小(此设计的好处是,不必传输完整的代码内存,但FW始终受CRC32保护):

固件的布局如下所示:

<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
    文件
  • 使用第三方工具,计算CRC-32校验和。我使用7-Zip命令行界面为
    *.bin
    文件生成CRC-32C值
  • 附加计算出的CRC-32C。在链接器脚本中,设置以下
    \u IMAGE\u CRC=ABSOLUTE(0x0)
    中的
    0x0
    ,以匹配您的计算值。取消对以下内容的注释:
  • LONG((-u IMAGE\u CRC)-1)/*取消注释以追加值,注释以计算新值*/

  • 重建图像并运行第三方CRC实用程序,它现在应该报告CRC-32C值的
    0xffffff
  • 当您准备将此应用于实际FW图像时,请执行以下操作:

  • 更改生成后步骤以转储完整的二进制文件:
    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
    文件
  • 使用第三方工具,计算CRC-32校验和。我使用7-Zip命令行界面为
    *.bin
    文件生成CRC-32C值
  • 附加计算出的CRC-32C。在链接器脚本中,设置以下
    \u IMAGE\u CRC=ABSOLUTE(0x0)
    中的
    0x0
    ,以匹配您的计算值。取消对以下内容的注释:
  • LONG((-u IMAGE\u CRC)-1)/*取消注释以追加值,注释以计算新值*/

  • 重建图像并运行第三方CRC实用程序,它现在应该报告CRC-32C值的
    0xffffff
  • 当您准备将此应用于实际FW图像时,请执行以下操作:

  • 更改生成后步骤以转储完整的二进制文件:
    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