This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 如何用已知值填充缝隙和未使用的闪存?

Guru**** 2586755 points
Other Parts Discussed in Thread: MSP432E401Y, SHA-256

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1068961/how-to-fill-gaps-and-unused-flash-with-known-values

线程中讨论的其他部件:MSP432E401YSHA-256

您好,论坛

我正在将 CCS 10.4.0.00006与 MSP432E401Y 配合使用。  它具有1024K 的闪存(长度为0x00100000字节)。  我们的代码目前仅使用约0x00050000字节,但仍在增长。

我需要计算整个闪存(或至少使用过的闪存)上的 SHA-256,以便连接 MSP432的主机可以验证是否安装了正确的固件。

如何使用已知值(如0xFF -看起来像正常的“已擦除”值)填充缝隙或未使用的代码空间(闪存)?

或者,是否有办法以编程方式获取已用闪存的结尾,以便我可以计算出仅覆盖该空间的 SHA-256?

用0xFF 填充所有闪存的缺点似乎是我每次都必须下载1024K,这在编辑/编译/调试周期中显然需要更长的时间。

感谢你的帮助!

斯科特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    供参考,从查看链接器地图文件看,输出中似乎有一些默认填充为0的孔。  这些值以“-孔-[填充= 0]"表示

    斯科特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    斯科特:您好,

    是的,我相信在 cmd 文件中,您可以附加 fill =“FFFFFFFF”,或者您选择的任何值。

    例如:

    MEMORY
    {
        FLASH (RX) : origin = 0x00000000, length = 0x00100000, fill = 0x00000000
        SRAM (RWX) : origin = 0x20000000, length = 0x00040000
    }

    现在,计算整个1M 内存上的 SHA-256毫无意义,我同意。

    查看此发布链接

    我在 MSP430汇编器/链接器指南第8.5.10.7节中做了一些诗,并找到了我认为适合您的内容。  我还在 MSP432汇编器指南中找到了类似的信息,但坦率地说,MSP430指南提供了更多信息。  此外,我还测试了一个简单的程序,它很有效。  我希望这是你所寻找的。

    下面是我修改后的链接程序 cmd 文件的一部分。

    MEMORY
    {
        FLASH (RX) : origin = 0x00000000, length = 0x00100000 LAST(_flashmem_end)
        SRAM (RWX) : origin = 0x20000000, length = 0x00040000
    }
    
    /* Section allocation in memory */
    
    SECTIONS
    {
        .intvecs:   > 0x00000000
        .text   :   > FLASH
        				START(_text_start), END(_text_end)
        .const  :   > FLASH
        .cinit  :   > FLASH
        .pinit  :   > FLASH
    	.rodata :   > FLASH
        .init_array : > FLASH

    下面是我的简单代码,用于查看运行期间是否可以访问这些符号。

    #include "msp.h"
    extern char _text_start;
    extern char _text_end;
    extern char _flashmem_end;
    int main(void)
    {
    
        uint32_t beginAddr = _symval(&_text_start);
        uint32_t endAddrs = _symval(&_text_end);
        uint32_t flashMemorySize = _symval(&_flashmem_end);
    
        return 0;
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢丹尼斯!

    在我看到您的帖子之前,我遇到了类似的解决方案。  我的链接器命令文件如下所示:

    #define APP_BASE 0x00000000
    
    MEMORY
    {
        FLASH (RX) : origin = APP_BASE, length = 0x00100000
        SRAM (RWX) : origin = 0x20000000, length = 0x00040000
    }
    SECTIONS
    {
        .intvecs:   > APP_BASE
        .text   :   > FLASH
        .const  :   > FLASH
    /* Creates global symbol IMG_END_ADDR at end of program image */
        .cinit  :   LOAD_END(IMG_END_ADDR) > FLASH
        .pinit  :   > FLASH
    	.rodata :   > FLASH
        .init_array : > FLASH
        .vtable :   > 0x20000000
        .data   :   > SRAM
        .bss    :   > SRAM
        .sysmem :   > SRAM
        .stack  :   > SRAM
    }
    
    __STACK_TOP = __stack + 512;
    

    然后,我添加了以下内容来计算闪存图像空间上的 SHA-256,使用与您的实验类似的_symval(IMG_End_ADDR):

    uint32_t hash[8]; // Buffer to hold calculated SHA-256
    
    void Init_SHA256(void)
    {
        // Setup cryptographic control module
        MAP_SysCtlPeripheralDisable(SYSCTL_PERIPH_CCM0);
        MAP_SysCtlPeripheralReset(SYSCTL_PERIPH_CCM0);
        MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_CCM0);
    
        // Wait for the cryptographic control module to be ready
        while (!MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_CCM0))
        {
        }
    
        // Reset the SHA/MD5 module
        MAP_SHAMD5Reset(SHAMD5_BASE);
    
        // Configure it for SHA256
        MAP_SHAMD5ConfigSet(SHAMD5_BASE, SHAMD5_ALGO_SHA256);
    
        // Calculate the length of the image
        uint32_t* imgStartAddr = (uint32_t *) 0x0;
        extern uint32_t IMG_END_ADDR;
        uint32_t imgLengthBytes = _symval(&IMG_END_ADDR);
    
        // Calculate hash value
        MAP_SHAMD5DataProcess(SHAMD5_BASE, imgStartAddr, imgLengthBytes, hash);
    }
    

    已将您的答案视为解决方案,因为它解决了填充已知值的问题以及如何插入和获取 Flash 图像的结尾。  在此处发布我的解决方案是希望它能在未来帮助他人!

    此致,

    斯科特