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.

[参考译文] TMS570LC4357:重置时无初始化内存,用于存储重置信息

Guru**** 2470720 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1077304/tms570lc4357-no-init-memory-on-reset-for-storing-reset-information

部件号:TMS570LC4357
“线程:HALCOGEN测试”中讨论的其它部件

您好,

我想将重置信息存储在 SRAM 中,并在执行热重置后读取该信息。 我尝试了所有选项,但在 PC 设置为重置条目矢量时,在任何类型的重置后,所有 RAM 数据都初始化回0。

我已将变量放入 noinit 部分,并使用了以下链接程序脚本:

#define NON_VOLATILE_DATA __attribute__ ((section(".noinit")))
NON_VOLATILE_DATA static char data[16];

#define SRAM_SIZE                       0x00080000

#define STACKS_START_ADDR               0x08000000
#define STACKS_SIZE                     0x00004e00

#define KRAM_START_ADDR                 (STACKS_START_ADDR + STACKS_SIZE)
#define KRAM_SIZE                       0x00000800

#define RAM_START_ADDR                  (KRAM_START_ADDR + KRAM_SIZE)
#define RAM_SIZE                        (SRAM_SIZE - NOINIT_RAM_SIZE - KRAM_SIZE - STACKS_SIZE)

#define NOINIT_RAM_START_ADDR           (RAM_START_ADDR + RAM_SIZE)
#define NOINIT_RAM_SIZE                 0x000000100

MEMORY
{
    VECTORS         (X)   : origin = 0x00000000                 length = 0x00000020
    KERNEL          (RX)  : origin = 0x00000020                 length = 0x00008000
    FLASH0          (RX)  : origin = 0x00008020                 length = 0x001F7FE0
    FLASH1          (RX)  : origin = 0x00200000                 length = 0x00200000
    STACKS          (RW)  : origin = STACKS_START_ADDR          length = STACKS_SIZE
    KRAM            (RW)  : origin = KRAM_START_ADDR            length = KRAM_SIZE
    RAM             (RW)  : origin = RAM_START_ADDR             length = RAM_SIZE
    NOINIT_RAM      (RW)  : origin = NOINIT_RAM_START_ADDR      length = NOINIT_RAM_SIZE
}

SECTIONS
{
    .intvecs : {} > VECTORS
    /* FreeRTOS Kernel in protected region of Flash */
    .kernelTEXT  align(32) : {} > KERNEL
    .cinit       align(32) : {} > KERNEL
    .pinit       align(32) : {} > KERNEL
    /* Rest of code to user mode flash region */
    .text        align(32) : {} > FLASH0 | FLASH1
    .const       align(32) : {} > FLASH0 | FLASH1
    /* FreeRTOS Kernel data in protected region of RAM */
    .kernelBSS      : {}  > KRAM
    .kernelHEAP     : {}  > RAM
    .bss            : {}  > RAM
    .data           : {}  > RAM
    .sysmem         : {}  > RAM
    .noinit         : {}  > NOINIT_RAM type=NOINIT
}

我甚至在重置前尝试禁用内存块初始化:

l2ramwREG->MEMINITDOMAIN = 0x7f;

但上述情况不起作用,在重置后 RAM 总是读数为0。

在没有重置时初始化数据的情况下,是否有任何方法可以将数据存储在 SRAM 中?

谢谢!

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

    您好,

    内存硬件初始化将清除内存内容,RAM PBIST 也将清除内容。

     NOINIT_RAM   (RW) :原点= NOINIT_RAM_START_ADDR   长度= NOINIT_RAM_SIZE   

    这超出了有效的 SRAM 范围,即0x0800_0000~0x0808_0000

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

    您好,

    我认为我的 NOINIT_RAM 部分不在有效范围内。 NOINIT_RAM_START_ADDR 是 RAM_START_ADDR + RAM_SIZE,即0x08005600+0x0007A900=0x0807FF00,NOINIT_RAM_SIZE 为0x000000100。 因此,它应该适合有效的 RAM,这不是问题。 我还可以在地图文件中验证这些部分:

      STACKS                08000000   00004e00  00000000  00004e00  RW  
      KRAM                  08004e00   00000800  00000168  00000698  RW  
      RAM                   08005600   0007a900  0006b5cf  0000f331  RW  
      NOINIT_RAM            0807ff00   00000100  00000070  00000090  RW  

    关于 HW 内存初始化和 RAM PBIST:我可以看到这些是在 mem_init 函数内的 c_init 过程中执行的。 在使用调试器达到这一点之前,NOINIT_RAM 部分的内容将在重置触发器上被清除。

    在第8.3.8节 L2RAMW 内存初始化域寄存器(MEMINIT_DOMAIN)的参考手册中,我指出 MEMINIT_ENA 位在重置时都设置为启用。 这是否会导致 RAM 初始化?

    那么,是否还有其他设置可以防止在热重置时清除柱塞?

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

    您好,Marton,

    很抱歉我的计算错误。

    [引用 userid="492576" url="~/support/minuters/arm-based 微处理器组/基于 ARM 的微控制器/f/基于 ARM 的微控制器-forum/1077304/tms570lc4357-no-init-memory-on-timet-for-store-reset-informion/3988632#3988632"min_set 在 MINENA 上启用所有位重置。] 这是否会导致 RAM 初始化?

    否,这不会启动 SRAM 自动初始化。 MEMIT_ENA 位用于打开 RAM 域(总共8个域),这些域在默认情况下处于启用状态。   当设置了 MINITENA (0xA)并且 设置了 MSINENA[0]时,自动初始化将启动。 因此,MEMIT_ENA 的默认设置不会启动内存初始化。

     在读取变量之前,是否通过调用_cacheEnable_()来启用高速缓存?  启用高速缓存后,它将首先使高速缓存中的所有数据无效。 您的数据首先存储在2级 SRAM 中。 在读取数据时,数据将存储在高速缓存中,以便将来快速访问。 执行重置时,CPU 从_c_init00()启动,并将执行_cacheEnable_()以使缓存无效。 由于 高速缓存回写方案,当2级 SRAM 未更新时,高速缓存中的数据将被清除。

    您需要回答一个问题:

    我不确定以下声明是否有效,现在我没有硬件主板可供尝试。

    #define non-volatile 数据__attribute__((section(".noinit")))
    非易失性数据静态字符数据[16];

    在我尝试之前,您是否可以使用编译器(TI ARMCL 编译器)用户指南中列出的以下方法:

    https://www.ti.com/lit/ug/spnu151v/spnu151v.pdf

    #pragma NOINIT (x)
    国际 x;

     

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

    您好,Marton,

    您可以从以下线程中找到有用的信息:

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/422177/__ti_auto_init-and-gcc-questions-for-tms570lc43/2002436?tisearch=e2e-sitesearch&keymatch=NOINIT%252525252520AND%252525252520SRAM#2002436

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

    您好,

    感谢您提供链接,但我认为我的问题与链接器无关。

    我已经尝试了#pragma NOINIT (x)声明,根据地图文件,我的非易失性变量将放置在名为.TI.noinit 的部分中,但重置后它仍被初始化为零。

    这是写入非易失性变量时从调试会话中看到的内容:

    这是在热重置后,PC 在 c_init 之前仍在 resetEntry 上,并且清除了非易失性变量:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="492576" url="~/support/icros/arm-based 微处理器-组/基于 ARM 的微控制器/f/基于 ARM 的微控制器- forum/1077304/tms570lc4357-no-init-memory-On-reset-for-store-volatile reset-information/3990345#3990345'从该会话中写入非调试内容]

     地址中的非易失性变量是否 可以缓存回写?

    如果是这样,则在执行热重置后,可能在执行热重置之前未将变量写入实际 SRAM。

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

    我已经检查了 MPU 配置,高速缓存已启用,但所有 MPU 区域在壁龛中均设置为默认值,并且已为 SRAM 范围禁用高速缓存。

    我甚至尝试创建一个新的 MPU 区域,其中包含参数:Shared 和禁用高速缓存:

    问题与以前相同,重置后 PC 位于重置矢量上,RAM 已被清除。

    是否有任何方法可以禁用 此内存区域的回写高速缓存?

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

    您好,Marton,

    如果内存区域(#7)为“Normal_OINC_SHARED”,则如果该区域为 type=NOINT,则不会清除该区域中的数据

    如果内存区域(#7)为“Normal_OWTNOWA_NONSHARED”,则如果该区域的数据类型为 NOINT,则不会清除该区域中的数据

    sys_main.c:

    #define non-volatile 数据__attribute__((section(".noinit")))
    非易失性数据静态字符数据[16];

    sys_link.cmd:

    noinit:{}> NOINIT_RAM type=NOINIT

    sys_startup.c:

    应该注释_memInit_()

    //_memInit_();

    您可以从下拉菜单中选择 OIWT (直写式)或 OIWB (回写式):

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

    我已禁用整个 SRAM 区域的高速缓存回写,结果相同:热重置后,调试器位于“resetEntry:b  _c_int00”上,RAM 已被清除。

    我还尝试了上述配置,memInit()评论说,RAM 仍被清除。

    我不知道我会错过什么。
    我开始怀疑此 MCU 在热重置时不能进行无初始化 RAM。

    此方案是否有任何工作示例? (用于在热重置时存储数据的无初始化 RAM)?

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

    您好,Marton,

    我没有一个正在运行的独立项目。 我将在稍后为您创建一个简单的。

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

    重置后,0x0807f000内存区的变量不会被清除:

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

    e2e.ti.com/.../TMS570LC43x_5F00_GlobalVariables_5F00_NoInit.zip

    以下是用于测试的 CCS 项目

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

    在我的 CCS 示例项目中:

    MPU 设置:

    1.已启用高速缓存

    NOINIT_RAM 映射到0x0807F000,MPU 区域15,写入

    链接器 CMD:

    NOINIT_RAM 映射为0x0807F000,大小为4KB

    这些部分(在 sys_main.c 中定义).noinit0和.noinit1被分配给类型为 NOINT_RAM 的 NOINT_RAM

    sys_main():

    在 sys_main.c.中声明和定义了三个全局变量 这三个变量位于两个未初始化的部分:.noinit0和.noinit1

    1.在 while (i = 0)和 while (1) in main()中添加断点

    2.将代码运行到 while (i=0),然后暂停执行代码,在表达式窗口中手动将 I 更改为1

    3.将代码运行到 While (1);所有三个变量都已分配,它们位于 MPU 区域15 (自0x0807F0000起)。 检查该区域中的变量:

    4.单击 CCS-Tools--reset -->系统重置,然后单击 CCS-Tools -->重新启动,执行将在第一个断点停止,而(I=0),请检查 MPU 区域15中的值。 该值应保持不变。

    5.按主板上的 nRST 按钮,当执行第一次停止时,请检查 MPU 区域15中的值。  该值应保持不变。

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

    QJ 您好,

    谢谢您的示例,它的工作正常。 我尝试使用此示例中的设置修改自己的项目,但这仍然第一次对我不起作用。

    然后,我意识到我在项目中使用 FreeRTOS,在 RTOS 端口实施中,MPU 已由 RTOS 重新初始化,因此导致 MPU 设置的更改无法正常工作。

    更改 RTOS MPU 设置后,一切都可以正常工作。
    感谢您的支持!

    此致,
    马顿

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

    很高兴知道,谢谢