ARM分散文件 - 如何在执行区域内保留Flash数据

时间:2017-10-23 14:57:57

标签: linker arm scatter

我使用ARM编译器+链接器用于STM32 MCU。

当生成HEX时,我使用工具srec_cat来计算并将CRC写入HEX内的特定地址。当发生这种情况时,我可以在我的HEX中正确地看到这个CRC。

问题出在执行时间,此值消失并由值0重写。

这是我的分散文件:

LR_IROM1 0x08000000 0x000FE00  {    ; load region size_region
ER_IROM1 0x08000000 0x00FE00  {  ; load address = execution address    ; 64kB - 12kB = 53248 B  (ILR Output -O0 = 52496 B) ; For PTB MUST use optimization -O1 or stronger!  
startup_stm32l100xba.o (RESET, +First)
vectortable.o (VECTORS)
* (+RO)
}  
RW_IRAM1 0x20000000 0x00002000  {  ; RW data
.ANY (+RW +ZI)
}
}

LR_IROM3 0x0800FE00 0x0000200 { ; // 512B for Production Constants
ER_CONST_ROM3 0x0800FE00 FIXED 0x0000200 { ; // 512B for Production Constants
    ;params.o (PARAM, +First)
}
}

我通过srec_cat工具在后期处理中做的是我在地址0x0800FE08写CRC。 当我通过STM32 Link实用程序读取HEX文件时,我可以正确地看到这个值。 但是当我调试地址0x0800FE08的代码值为0时。 我尝试过UNINIT参数,但它没有用。

对我而言,我在汇编文件中指定了特殊区域,其中我放置了一些由srec_cat工具重写的虚拟DWORD,然后我可以在执行时间中正确读取CRC值。 这是代码:

       AREA    PARAM, DATA, READWRITE
            EXPORT  APP_CRC
            EXPORT  WEL_CRC 

__PARAM
APP_CRC         DCD     0xAAAABBBB                     
WEL_CRC         DCD     0xCCCCDDDD                

            ALIGN

            AREA    |.text|, CODE, READONLY
END

但必须有另一种方法如何保存HEX文件中的数据并在同一执行区域内同时使用at_address指令。 我希望通过以下方法将固定值放入地址0x0800FE00中。

const u32 U32_Product_SN 属性((at(0x0800FE00)))= 1;

我希望保留已经在地址0x0800FE08的后期处理操作添加的HEX文件中的内容。而且我不想使用汇编文件和AREA指令。

您是否知道如何保留srec_cat工具生成的CRC值,即使在运行时,执行时间?

1 个答案:

答案 0 :(得分:0)

好的,我发现了问题。

很简单,当我使用CRC探索HEX文件时,所有内容都可以,但在调试模式下,它使用的是AXF(ELF文件)而不是HEX,它只属于我的后期处理修改。

因此,要在调试模式下正确查看CRC,我还必须修改AXF。