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.

[参考译文] UCD3138:RAM 大小超过88%后、UCD 器件不能正常工作

Guru**** 2540670 points
Other Parts Discussed in Thread: UCD3138

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1128216/ucd3138-ucd-device-doesn-t-work-after-ram-size-exceeds-88

器件型号:UCD3138

您好!

我 一直在进行 PMBus 项目。 为了加快状态寄存器中的状态读取/写入操作、我已经使用 RAM 应用了我的自定义获取/设置函数。 我注意到、在 RAM 的内存分配速率达到88%后、器件不允许我进行闪存编程。  此外、当我应用 OV 或 UV 情况时、GUI 上不会显示故障消息。 这种行为的原因是什么? 我是否可以尝试避免这种情况?

此致

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

    我不确定您是如何使用 RAM 还是测量内存分配的。  我怀疑您正在运行到堆栈中、尽管您可能正在运行到变量中。  我不知道器件不允许您进行闪存编程意味着什么。  我将为您提供有关如何避免运行到堆栈和变量的指导。  如果这不能解决问题、请告诉我您不允许进行闪存编程意味着什么。   

    对于 OV 或 UV 情况、通常需要通过信号链到 PMBus 命令进行调试。  OV/UV 从 ADC 读数或比较器触发器开始、因此您可以开始查看从 ADC 或比较器到 PMBus 命令的链、并查看其分解位置。   

    对于 RAM、load.asm 文件和.cmd 文件之间通常存在一定程度的断开连接。  load.asm 文件将具有如下定义的堆栈指针地址:

    SUP_STACK_TOP .equ 0x19ffc;监控器模式(SWI 堆栈)从存储器顶部开始
    fiq_stack_top .equ 0x19e00;为监控器堆栈分配256个字节、然后执行 FIQ 堆栈
    IRQ_STACK_TOP .equ 0x19d00;为 FIQ 堆栈分配256个字节、然后启动 IRQ 堆栈
    USER_STACK_TOP .equ 0x19b00;为 IRQ 堆栈分配512个字节、常规堆栈处于静止状态、一直到变量

    因此、最低地址 USER_STACK_TOP 将定义用户堆栈的顶部、该顶部将从此处向下展开。  比较容易确定您使用的堆栈数量。  load.asm 还会清除所有 RAM。  因此、您可以使用存储器调试器查看堆栈位置并查看正在使用的内容。  然后、您可以调整堆栈位置、因为我们的正常堆栈分配非常慷慨。   

    通常还有一个.cmd 文件、称为 cyclone.cmd、有时也称为 cyclone64.cmd 或其他文件。   

    它将包含如下语句:

    RAM (RW):org = 0x0001901C,len = 0x00000E50
    堆栈(RW):org = 0x00019E6C,len = 0x00000190

    您需要更改 RAM 大小、使其在上面测量的堆栈大小之前结束、然后将堆栈开始位置放在测量的位置、以及到下一个 RAM 元素或 RAM 结束的长度。   

    这样、至少如果您的变量适合堆栈下方的存储器、您应该是可以的。  如果你使用某种形式的自由堆类东西、你需要在变量中定义一个数组来保存它。 或者使其成为.cmd 文件中定义的自己的 RAM 区域、并确保它保持在该区域内。   

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

    感谢您的详细解释。

    我将使用 CCS 工具来测量内存分配。 我认为堆栈在这里不是问题。 让我来向您展示我如何无法刷写程序:

    1)正如我说过的、这是来自 CCS 内存分配工具:



    RAM 的内存分配为86%、我可以将程序刷写到 UCD:



    2) 2)当我将 uint32_t array[80]变量声明为全局变量时、您可以看到我仍然有 足够的 RAM 存储器(95%):



    但是、此时我无法将程序刷写到器件中。 看门狗复位可能会导致:

    我忘记了提到我在 UCD3138上使用 C++开发我的项目。 在某种程度上、C++对象分配的 RAM 空间可能比 CCS 存储器工具上的空间多。 我尝试按照您的建议增大 RAM 大小。 栈大小为 0x00000190、为400字节、我将其减小为200字节、即 C8:

    以前:

        RAM_PGM_AREA	(RW) : org = 0x00019000, len = 0x00000080
    	RAM       		(RW) : org = 0x00019080, len = 0x00000DF0
    	STACKS    		(RW) : org = 0x00019E70, len = 0x00000190


    之后:

        RAM_PGM_AREA	(RW) : org = 0x00019000, len = 0x00000080
    	RAM       		(RW) : org = 0x00019080, len = 0x00000EB8
    	STACKS    		(RW) : org = 0x00019F38, len = 0x000000C8


    编译器当时没有给出任何错误或警告、但我无法将程序刷写到 UCD 器件:



    简言之、我的 RAM 大小可能会在88%之后溢出、而 CCS 内存分配工具可能由于 C++而无法显示实际的分配率。  
    你怎么看? 还有其他方法可以尝试吗?  

    提前感谢您。

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

    我真的不推荐使用 C++。  与 UCD 相比、它适用于功耗更高、存储器更大且代码复杂度更高的处理器。  我强烈建议您从我们的 EVM 代码之一开始。   

    听起来您也在使用标准初始化程序、这一点我不熟悉。  它使用了大约4K 的代码、因此我取出并缩小了它、使它变得更小。   

    如果您认为是看门狗超时、我建议尝试禁用它并查看发生了什么。   

    通常、如果堆栈和变量发生冲突、堆栈会损坏、处理器最终会访问非法地址、这也会导致复位。   

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

    是的、但我更喜欢 C++、因为它提高了代码 可读性 、并且在诸如寄存器相关运算方面、C 和 C++的成本是相同的。  

    当我禁用看门狗时、我能够刷写 UCD。 正如您所说的、处理器可能会尝试访问一个亵渎地址、这就是 RAM 不足的原因。

    无论如何、我 优化了代码、现在它可以正常工作。 感谢您的支持。  

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

    好的、然后、我将关闭线程。