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

我真的不推荐使用 C++。 与 UCD 相比、它适用于功耗更高、存储器更大且代码复杂度更高的处理器。 我强烈建议您从我们的 EVM 代码之一开始。
听起来您也在使用标准初始化程序、这一点我不熟悉。 它使用了大约4K 的代码、因此我取出并缩小了它、使它变得更小。
如果您认为是看门狗超时、我建议尝试禁用它并查看发生了什么。
通常、如果堆栈和变量发生冲突、堆栈会损坏、处理器最终会访问非法地址、这也会导致复位。