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-EP:NOINIT RAM 部分

Guru**** 2466670 points
Other Parts Discussed in Thread: TMS570LS3137, TMS570LC4357-EP, TMS570LC4357, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1050945/tms570lc4357-ep-noinit-ram-section

器件型号:TMS570LC4357-EP
主题中讨论的其他器件:TMS570LS3137TMS570LC4357HALCOGEN

大家好、

在我的项目中、我想将一些变量值存储在 RAM 中、以便在外部看门狗复位引起的复位后再次读回它。

为此、我在段配置和存储器映射中创建了一个专用段、并保留了 RAM 的一部分作为 RAMNONINIT。 该方法在另一个上的 TMS570LS3137的不同项目中成功使用。

对于 TMS570LC4357-EP、此方法不起作用。

如何防止丢失存储在 RAMNOINIT 存储器中的数据?


最恰当的考虑。

Domenico

按照我的 C 源文件中的指令:

#pragma DATA_SECTION (Watchdog_ResetCounter_g、".section_noinit")
静态看门狗 ResetCounter_t Watchdog_ResetCounter_g;

按照我的链接器设置进行操作:

/*------------------ *
/*链接器设置                                                           */
--retain="*(.intvecs)"
堆0x800

/*------------------ *
/*内存映射                                                                */
存储器{
   引导程序      (X) :origin=0x00000000 length=0x00000020
   FLASH0       (RX):origin=0x00000020 length=0x001FFFC8
   FLASH1       (RX):origin=0x00200000 length=0x00200000
   堆栈       (RW):origin=0x08000000 length=0x00001300
   RAM          (RW):origin=0x08001300 length=0x0007E000
   版本信息   (R) :origin=0x001FFFE8 length=0x00000018
   RAMNONINIT       (RW):origin = 0x807F300,length = 0xD00


/*------------------ *
/*段配置                                                     */
剖面{
   .intvecs:{}>向量
   .text   :{}> FLASH0| FLASH1
   .const  :{}> FLASH0| FLASH1
   .cinit  :{}> FLASH0| FLASH1
   .pinit  :{}> FLASH0| FLASH1
   .section_versioninfo  :{}> versioninfo
   .bss    :{}> RAM
   .data   :{}> RAM
   .sysmem :{}>RAM
   .section_noinit: > RAMNONINIT、type=NOINIT

/*------------------ *

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

    您好!

    [引用 userid="312768" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1050945/tms570lc4357-ep-noinit-ram-section "]如何防止丢失存储在 RAMNOINIT 存储器中的数据?[/quot]

    我想知道原因是不是因为您在启动文件中调用了_memInit_()以清除 RAM? 您可以检查一下吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="312768" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1050945/tms570lc4357-ep-noinit-ram-section "]如何防止丢失存储在 RAMNOINIT 存储器中的数据?[/quot]

    您在代码中的哪个位置检查存储在 RAMNOINIT 存储器中的数据?

      对于 TMS570LC4357、HALCoGen 生成的_c_int00 ()函数在 复位源为以下任一条件时调用_memInit_()函数:

    • POWERON_RESET
    • DEBUG_RESET
    • EXT_RESET

    其中 _memInit_()执行"针对 SRAM 的自动硬件初始化"

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

    感谢您回答  和@Chester Gillon 的问题。 代码由 halcogen 生成、_c_int00 fucnion 尚未 修改、_memInit_函数出现在开关情况 power_reset、debug_reset 和 EXT_RESET 中。 如果我在 DEBUG_REST 和 EXT_RESET 情况下删除_memInit_函数、则在复位后清除全局变量 Watchdog_ResetCounter_g。

    在初始化阶段之后、RAMNOINIT 存储器中的数据将被检查。 为此、我将全局变量也放在_memInit_调用之前、但数据也会被清除。

    有什么想法吗?

    此致

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

    您好!

    继续调试、我注意到函数_cacheEnable_会清除 RAMNOINIT 存储器中的值。 在注释中、当 JTAG 复位 UP 时、所有操作都有效、但如果我没有运行 SW、RAMNOINIT 部分将继续被清除

    1) 1) _cacheEnable_()的功能是什么? 在使用或不使用_cacheEnable_时、UP 的行为是什么?  

    2) 2)_memInit_函数是否应在 DEBUG_RESET/EXT_RESET 情况下保持注释?

    谢谢你。

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

    尊敬的 Domenico:

    [引用 userid="312768" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1050945/tms570lc4357-ep-noinit-ram-section/3890450 #3890450"]1) _cacheEnable_()的功能是什么? 在使用或不使用_cacheEnable_时、UP 的行为是什么?  [/报价]

     TMS470LC4357处理器上同时有32kB 数据高速缓存和指令高速缓存。 启用高速缓存后、它将首先使高速缓存中的所有数据无效。 您的数据首先存储在2级 RAM 中。 读取数据后、数据将存储在缓存中、以便在将来进行快速访问。 换言之、 Watchdog_ResetCounter_t 首先分配给2级存储器。 首次读取后、它存储在高速缓存中。 执行重置时,处理器从_c_init00()启动,并将执行_cacheEnable_()以使缓存无效。 这就是 Watchdog_ResetCounter_t  在由于高速缓存回写方案而无法更新2级存储器时被清除的方式。 我建议您更改为直写方案、以便2级存储器始终与高速缓存保持一致。 应用复位后、缓存存储器无效、但2级存储器仍包含最新数据。 但是、如果您应用_memInit_()、它也会清除到2级内存中。 因此,您需要禁用_memInit_()以避免重置2级内存。 但请注意、在下电上电后、MCU 将在2级 RAM 中出现随机值。 您可能会在读取2级 RAM 时看到 ECC 错误。  

    ;启用缓存

    .def _cacheEnable_
    asmfunc

    _cacheEnable_

    stmfd sp!、{r0-r1}
    MOV r0、#0

    MRC P15、#0、R1、C1、c0、 0;读取系统控制寄存器配置数据
    ORR R1、R1、#0x1 <<12;指令高速缓存启用
    ORR R1、R1、#0x1 <<2;数据高速缓存启用
    DSB
    MCR P15、#0、r0、C15、C5、 0;使整个数据高速缓存无效
    DSB;延迟是必需的,手动添加
    MCR P15、#0、r0、C7、C5、 0;使整个指令高速缓存无效
    DSB;延迟是必需的,手动添加
    MCR P15、#0、R1、C1、c0、 0;已启用高速缓存 RAM
    ISB

    mfldd sp!、{r0-r1}

    BX LR
    endasmfunc

    要更改为直写高速缓存、您可以使用以下任一级别2 RAM 设置来更新 MPU。

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

    非常感谢。

    现在一切正常。 此外、我们的原理图设计也存在错误。 外部看门狗的输出信号连接到引脚 nPORRST、因此当它被置为无效时、函数 getResetSource()总是返回 powerON_REST 值而不是 EXT_RESET。 因此、为了不运行 memInit 函数、我必须修改_c_int00以正确检测看门狗复位。

    此致。