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.

[参考译文] MSPM0L1306:MSPM0L1306:EEPROM 仿真:链接器文件似乎没有保留空间

Guru**** 2390755 points
Other Parts Discussed in Thread: MSPM0L1306, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1348507/mspm0l1306-mspm0l1306-eeprom-emulation-linker-file-seems-to-have-no-reserved-space

器件型号:MSPM0L1306
主题中讨论的其他器件: SysConfig

您好!

我将要`mEEPROM 仿真类型 A、并参考示例` spm0_SDK_1_30_00_03\examples\nortos\LP_MSPM0L1306\EEPROM_emulation_type_A\EEPROM_emulation_type_A\。

现在在`m 45nm0l1306.cmd`中,我希望为 EEPROM-EMLUX 保留一些空间。 至少闪存的来源和大小应为

   FLASH           (RX)  : origin = 0x00000800, length = 0x0000F7F8
 

而不是

   FLASH           (RX)  : origin = 0x00000000, length = 0x0000FFF8

则可以使用双扇区 EEPROM 仿真空间。

我是否缺少某些东西(通常是这种情况),还是缺少示例,希望应用程序数据永远不会超过0xF7F8?

此外、存储空间的放置位置是否有限制? 放到闪存的开头或结尾? (0x1000、如示例中所示、对我来说似乎很奇怪。。)

谢谢!

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

    您好、Joern、

    在示例中、看起来 EEPROM 仿真数据的放置由编译器/链接器来确定其应驻留在存储器中的什么位置。

    如果您希望强制链接器将其放置在特定区域、则可以修改链接器脚本来添加一个段、并在代码中指定使用该存储器进行 EEPROM 仿真数据放置。

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

    Hej Dennis、

    链接器不会在这里进行任何自动放置。 怎么可能呢?:
    在 eeprom_emulation_type_a.h 第71行中、我们将

    #define EEPROM_EMULATION_ADDRESS                                    (0x00001000)

    然后、在 C 文件内部、仿真代码首先解锁闪存、然后写入闪存、从而直接将其写入闪存。 不管其中有什么、至少两个扇区都会被覆盖。 因此、恕我直言、示例的链接器文件中应该至少提示用户注意这一点。

    我虽然懒惰,但我希望这里有人在银盘上交付解决方案。 因为没有人知道、下面是我的想法。 请添加您个人的想法。

    我禁用了 SysConfig 以生成链接器文件、将生成的文件移动到了我的工程根目录中、并对其进行了修改、如下所示:

    ...
    
    MEMORY
    {
        FLASH           (RX)  : origin = 0x00000000, length = 0x0000F400
        FLASH_EEPROM    (RX)  : origin = 0x0000F400, length = 0x00000800
        FLASH_REST      (RX)  : origin = 0x0000FC00, length = 0x000003F8
        SRAM            (RWX) : origin = 0x20000000, length = 0x00001000
        BCR_CONFIG      (R)   : origin = 0x41C00000, length = 0x00000080
        BSL_CONFIG      (R)   : origin = 0x41C00100, length = 0x00000080
    }
    
    SECTIONS
    {
        .intvecs:   > 0x00000000
        .text   : palign(8) {} > FLASH | FLASH_REST
        .const  : palign(8) {} > FLASH | FLASH_REST
        .cinit  : palign(8) {} > FLASH | FLASH_REST
        .pinit  : palign(8) {} > FLASH | FLASH_REST
        .rodata : palign(8) {} > FLASH | FLASH_REST
        .ARM.exidx    : palign(8) {} > FLASH
        .init_array   : palign(8) {} > FLASH
        .binit        : palign(8) {} > FLASH
        .TI.ramfunc   : load = FLASH, palign(8), run=SRAM, table(BINIT)
    
        .vtable :   > SRAM
        .args   :   > SRAM
        .data   :   > SRAM
        .bss    :   > SRAM
        .sysmem :   > SRAM
        .stack  :   > SRAM (HIGH)
    
        .BCRConfig  : {} > BCR_CONFIG
        .BSLConfig  : {} > BSL_CONFIG
    
        .eeprom_data : {} > FLASH_EEPROM, type = NOINIT
    }
    

    FLASH_EEPROM 是我希望获得 EEPROM 存储空间的位置。 我需要的是2k。 这里有两点需要注意:

    - FLASH_EEPROM 必须扇区对齐并且是0x400的倍数(MSPM0上的扇区大小)

    -您不能使用闪存中最后的8个字节*

    我的 FLASH_EEPROM 的长度为0x0000F400、FLASH_REST 的长度为0x400-8。

    在各部分中、我添加了一个名为 EEPROM_DATA 的部分、该部分会映射到我们新的 FLASH_EEPROM 存储器中。
    NOINIT 防止初始化段。

    您可能希望通过在 C 代码中添加一个实例来

    __attribute__((used, section(".eeprom_data"))) \
        volatile uint32_t eeprom_placeholder[EEPROM_EMULATION_SECTOR_ACCOUNT * 256];

    使用的属性可防止 clang 优化变量 out、而 section 会将放置固定到新创建的段。
    请注意、我们使用的是..sector_account。 这是一种保护措施、可防止在不修改链接器文件的情况下扩展扇区数量。

    最后、我们需要将 EEPROM_emulation_address 设置为0x0000F400。
    遗憾的是、我不知道如何将此预编译器指令与链接器文件中设置的原点链接在一起。 这很好。

    请告诉我您对该解决方案的看法。
    甚至可能有一种更优雅的方式。

    谢谢你。

    *正如 MSPM0L1306的数据表(SLASEX0C)在第38页指出:"CPU 访问闪存区域的最后8个字节之一将导致硬故障。 这是因为预取逻辑尝试从另一个器件
    提前刷新字(64位)、导致对无效存储器位置的读取尝试。"