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.

[参考译文] MSP430FR5969:完全映射 SRAM

Guru**** 653660 points
Other Parts Discussed in Thread: MSP430FR5969-SP
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1127917/msp430fr5969-mapping-out-sram-entirely

器件型号:MSP430FR5969

您好!

我正在为 MSP430FR5969-SP 编写一个程序、并且需要配置存储器、以便通常驻留在 SRAM 中的任何内容都位于 FRAM 区域(位于0x4400、而不是位于0x10000的 FRAM2)。 我知道将堆栈放入 FRAM 会导致性能下降、但我们的应用程序不允许使用 SRAM。

我的想法是用两个区域手动配置 MPU、一个区域用于代码、另一个区域用于其他所有区域:

 

除了此块外,我已成功地将所有内容移动到 FRAM 区域:

组(READ_WRITE_MEMORY)

  .TI.persistent:{}      对于#pragma PERSISTENT *
  .cio:{}              /* C I/O 缓冲器*/
  .sysmem:{}         /*动态内存分配区域*/
} PALIGN (0x0400)、RUN_START (fram_rw_start)

 

有两个原因我不想将这个块留在 FRAM 中并使 FRAM 成为代码段:

  1. ISR 代码必须位于较低的 FRAM 区域、因为该区域可以使用16位地址进行访问、而 ISR 矢量是16位地址
  2. 当我将.text 和 ISR 代码段移动到 FRAM2时、它会填充大部分 FRAM2、并且我仍有更多代码需要添加。

您能否为我提供有关如何完成此操作的具体说明? 谢谢你

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

    ISR 不应成为问题、因为有一个属性可强制函数进入较低的 FRAM 中、编译器通常会自动将其应用于具有中断属性的任何内容。

    如果您使用动态内存(malloc()和朋友),则会遇到问题,因为这从 BSS 中分配的内存的末尾开始。 如果您不使用动态内存分配、那么它在 SRAM 中不应该成为问题。

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

    感谢 David 的帮助。 首先、我需要说我将错误的 MPU 配置图片复制到了上面的原始文本中。 下面的图片是我要展示的图片:

    我在程序中不使用动态内存分配、因此这不是问题。 我成功地获得了 FRAM 中的所有内容、SRAM 中没有任何内容。 ISR 起作用。 但是、仍然存在一个与我使用 PERSISTENT pragma 声明为 PERSISTENT 的变量相关的问题。 它会将其放入代码区域、如下所示:

    我已将 MPU 配置为禁止在 FRAM 区域中写入。 当程序尝试写入 persistent 变量时、出现 MPU 异常、程序无法运行。 我可以通过向 MPU 配置中的 FRAM 区域添加写入权限来使其运行、但由于应用程序代码不再受到意外写入的保护、因此启用 MPU 几乎没有意义。  

    我想使用 MPU。 是否有方法可以将.TI.persistent 段放入 FRAM2中?

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

    如果您确实已经完全映射了 SRAM、那么我不明白为什么您使用 persistent 属性。 您的所有变量都应位于 FRAM (或 FRAM2)中、默认为 persistent。 (除了复位时的初始化。)

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

    这是我最初的信念:我不再需要在我的全局变量之前的行上进行#pragma PERSISTENT 声明。 但我将变量的值更改为非零值(50)。 我确认变量包含50。 然后、我对 MSP430进行循环通电、并在加电后查看变量的值。 它是零。 该序列始终是可重复的。 此时、我一直假设没有 PERSISTENT pragma、编译器会将全局变量视为 SRAM 中的变量、方法是将其初始化为零。 这不应该发生?

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

    以下是我在使用 PERSISTENT pragma 时的存储器分配:

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

    C 运行时启动代码始终将 BSS 清零、并且在 BSS 中放置一个不带初始化程序的变量。 属性 noinit 应禁用应用到的特定变量的任何启动初始化。