主题中讨论的其他器件:HALCOGEN、 CCStudio、 TMDSRM48HDK、 SEGGER
您好!
很抱歉发帖很长、但问题很复杂...
我们发现、如果"Moon 在执行测试时正确对齐 mars"、VIM RAM 矢量在 VIM RAM 奇偶校验测试期间/之后会损坏"...
测试是 SafeTI-test (sl_SelfTest_VIM (VIM_SRAM_parity Check ())还是 HalCoGen 测试(vimParityCheck ()),这一点无关紧要
2.可以在 IAR 和 CCStudio 中重新生成行为,并在 while 循环中运行 main()中的代码,因此操作系统活动/实际应用程序无关紧要
3.这对时序/配置非常敏感,例如,在启动 VIM PBIST 和 VIM 奇偶校验未被启用的情况下,附加的 CCStudio 项目不会失败(没有单独测试这些测试),而当前项目在 main ()中的571次测试(u32TestCnt =571)后总是失败。
4.被测向量被破坏、看起来至少较低字节一直被转换为0x00或0x01 (奇怪的是 IAR 显示只有最低字节被改变、但 CCStudio 显示整个向量被改变)。 无论测试的矢量是0xFFF82000还是0xFFF82008、都无关紧要。
5.您似乎还需要一些其他中断活动/源(如 RTI)来禁用测试中断-如果没有中断、也不会使我们的 IAR 主循环测试仪崩溃。
其他通知:
a) VIM_FBPARERR 函数被调用很多-几乎每次测试都被调用、但并非每次都被调用(通常为 PAR_FLG = 0、因此这是"重影调用")。 即使设置为 VIM RAM 不会损坏、也会调用此函数
这也很奇怪
b)有时只有 VIM 矢量被破坏、如果你将它修复在"之后"分支中、一切都正常。 但有时它也会在 FLG = 1时触发 VIM_FBPARERR、在这种情况下、您还会像这样获得 ESM 错误
状态(984599651|1|1|1007999222)
之后:VIM_RAM 不同:0x1与0x53bec 之间- 1007999431 //粗体为当前测试编号
VIM_FBPARERR:修正通道:2 -- 1007999431 //粗体为当前测试编号,因此测试后 FLG = 1
ESM:1、CH:15 P1:0xFF82008、P2:0x0、P3:0x0 @ 0ms //这是 ESM 低电平中断处理程序
ESM:已激活失效防护:G:1通道:15
状态(1002149607|2|2|1025999160)
有时您只会遇到矢量损坏-这毫无意义。 我们的打印缓冲区非常大,当时经过全面测试,我确信在这种情况下打印不会丢失99999999%
状态(2054919|0|0|2099865)
之后:VIM_RAM 不同:0x0与0x53bec 之间- 2099909
状态(2347396|1|0|2399839)
我们的 IAR-project main()看起来与 CCStudio 相似(决定进行 OS 依赖测试,但在运行时操作系统处于活动状态时可以看到非常类似的"行为"):
/////////////////////////////////// 代码//////////////////////////////////
#define vimRAMLoc ((volatile UINT32 *) 0xFFF82008U)
uint32 u32Address =* vimRAMLoc;
布尔 bFail = false;
uint32 u32Time = 0U;
while (bFail == false)
{
u32Temppi++;
if (* vimRAMLoc!= u32Address)
{
DBG_PRINT(“条目: VIM_RAM 分配不同: 0x%x 与0x%x\r\n”,*vimRAMLoc, u32Address );
}
SL_VIM_FailInfo failInfoVIM ={.stResult = ST_FAIL};/*错误注入测试可能根本无法设置此值*//*lint !e785 */*仅初始化一个实例*/
disable_IRQ_interrupt_();
#if 0
布尔 bRetVal = sl_SelfTest_VIM (VIM_SRAM_paratiation_test,&failInfoVIM);
sl_SelfTest_Result failInfo = failInfoVIM.stResult;
其他
vimParityCheck();
布尔 bRetVal = true;
SL_SelfTest_Result failInfo = ST_PASS;
#endif
if (* vimRAMLoc!= u32Address)
{
DBG_PRINT ("之后:VIM_RAM 不同:0x%x 与0x%x --%u\r\n",* vimRAMLocc,u32Address,u32Temppi);
//bFail = true;//强制停止
u32VIMRAM_Corr.++;
* vimRAMLoc = u32地址;
}
if ((!bRetVal)||(failInfo!= ST_PASS))
{
DBG_PRINT ("VIM 测试失败:%u\r\n",failInfoVIM.failInfo);
}
_enable_interrupt_();
if (HAL_u32TimeGet ()-u32Time >60U*1000U*1000U)
{
u32Time = HAL_u32TimeGet ();
外部 uint32 u32Calls;
extern uint32 u32 Fix;
DBG_PRINT ("状态(%u|%u|%u|%u|%u)\r\n"、u32连体 工作、u32VIMRAM_Corr、u32Fiux、u32Temppi);
}
}
while (1);
/////////////////////////////////// 代码结束//////////////////////////////////////////////////////////////
在 Hercules RM48 MCU 演示套件(TMDSRM48HDK)中失败的 CCStudio 项目:
-这个项目使用纯粹的 HalCoGen 文件、对任何东西进行0手动修改
-在此项目中、中断未"正确"禁用(I 位状态不会保留在禁用中、并且在启用时使用)、但由于中断禁用和启用在该 CCStudio 项目中的2个位置使用、这是正常的、因此由于嵌套禁用-禁用-启用-启用模式、IRQ 无法启用。
e2e.ti.com/.../6886.VIM_5F00_RAM_5F00_TEST.zip
请注意、此处的"调试打印"也得到了极大简化、它将在输入调试打印时触发1个"foo\r\n"打印-这足以导致故障。 如果您请求打印更多内容,它将始终触发相同的 foo\r\n,尽管您将其作为参数提供。 使用 DMA 完成打印。 当进行571次测试时,它会进入“测试后 RAM 矢量损坏”分支,这样也启动 DMA 的初始打印“设置”就不会改变 VIM RAM 内容,因为570次测试可以进行而不会损坏....
认为在 CCStudio 代码中、应用程序将写入 VIM RAM 的可能性是零、在我们的实际应用中、变化了0.0001%。
-在 IAR 中,我已经用 SEGGER 观察点检查了没有人写入该 VIM RAM 矢量 (在将矢量校正回已检测到损坏的 if-sentece 内部时、观察点在测试后触发-这也证明观察点有效、它还应证明我们的实际 IAR 应用不会写入该 VIM RAM 区域)。
此外、VIM RAM 测试受中断禁用/启用保护、因此任何人都无法写入该寄存器、 唯一的可能性是 DMA、但由于我们只有1个通道在使用中、它会写入 UART、并且您会在 UART 中看到文本、因此 DMA 不可能写入 VIM RAM (不知道/尚未测试观察点是否也能够看到 DMA 写入)...
在我们的实际 IAR 应用程序和 main()测试循环中,VIM RAM 故障的可能性在很大程度上取决于调试打印活动您打印的 VIM RAM 损坏错误越多, 此外、RTI 周期似乎具有效果1ms 周期产生的误差小于100us 周期、而10us 周期产生的误差小于100us。。。
-通过5秒的测试间隔,我们可以在数小时到数天内运行实际应用程序代码,直到该损坏在4小时到一周内随机发生,这表明出现的错误需要一些神奇的事件和时间来匹配,以实现 VIM RAM 损坏...
在这里,我每60秒打印一次主 while 循环中的状态,说明只发生了一些错误:
状态(1546199563|2|2|1583998758)
格式为: 测试完成后 FB_PARERR |检测到的 RAM 损坏总量| FB_PARERR FLG == 1次调用|进行的测试
因此、几乎每次测试都会触发这些 FLG =0调用、RAM 只损坏2次、两次也会触发 FLG =1调用
在同一主 while 循环中打印相同的状态、但每1秒打印一次、错误比率会大得多
状态(17815128|1155|29|780321957)
之后:VIM_RAM 不同:0x51300与0x513f8 -- 780322779
状态(17819918|1156|29|780531940)
之后:VIM_RAM 不同:0x51300与0x513f8 -- 780532761
状态(17824708|1157|29|780741923)
之后:VIM_RAM 不同:0x51300与0x513f8 -- 780742218
状态(17829498|1158|29|780951906)
之后:VIM_RAM 不同:0x51301与0x513f8 -- 780952137
VIM_FBPARERR:修正通道:2 -- 780952137 /这不会检查向量值是否有效、它只是从备份表将值写入给定的向量
ESM:1、CH:15 P1:0xFF82008、P2:0x0、P3:0x0 @ 0ms
ESM:已激活失效防护:G:1通道:15
之后:VIM_RAM 不同:0x51300与0x513f8 -- 780953681
状态(17834280|1160 | 30|781161858) //请注意,现在它从29变为30,因为我们也得到了 FLG=1 FBPARERR 调用
在实验过程中、还注意到以下情况:
-如果在 VIM 初始化之后和 main ()之前、您将被测试的"保留"矢量至少设置为0x1或0x0、而不是该"phantomInterrupt" 、则 SafeTI VIM RAM 测试偶尔会开始失败、而失败的原因是 ESM 通道未激活 (未使用 HalCoGen-test 对其进行测试)。
状态(7892|0|0|3367759)
状态(9473|0|0|3579331)
之后:VIM_RAM 不同:0x1与0x0之间- 3579770 //此处我们已手动将 vector 设置为0x0,因此在测试完成后它已更改为0x1,只需将其修复
状态(11046|1|0|3790893)
状态(11046|1|0|4000888)
VIM 测试失败:5. //Now actual VIM test failed after 400 manned test, 5== ESM channel has not activated during the test/* Check if ESM group1 channel 15 is not flagged */ anned branch in sl_selftest.c //此后会出现更多故障,因此这不是唯一的故障
VIM_FBPARERR:修正通道:2 -- 4001073 //无“打印后 RAM 上下文正常,但在 SafeTI 测试之后进入实际的 FB_PARERR 处理程序//我们有自己的函数,只有在 FLG = 1时才会打印此函数
ESM:1、CH:15 P1:0xFF82008、P2:0x0、P3:0x0 @ 0ms //并且也得到 ESM 错误
ESM:已激活失效防护:G:1通道:15
状态(12622|1|1|4212427)
状态(14201|1|1|4424000)
因此、在这种情况下、RAM 内容未损坏、但仍设置了 FLG = 1、但 SafeTI 无法看到 ESM 错误...
最初、我们注意到了这个问题、因为我们的测试偶尔失败、检查了 VIM RAM 内容(VIM RAM 上的 CRC)、 然后我们减少了测试、以便我们只进行 VIM 奇偶校验测试和 VIM RAM 内容测试、并加快了测试间隔->开始更频繁地失败->然后开始在 CRC 失败期间打印 VIM RAM 的内容->注意到第二个矢量的值错误-> 在每个测试前后添加了校验、该校验是正确值的矢量。 之后、我花了~4天时间来测试 IAR 的不同组合、最近从头开始构建 CCStudio 项目、并评估了需要在那里做些什么才能使它同样失败、现在我得到了...
但我仍然无法准确地说这失败的原因、基本上需要启动和 RTI&DMA 中的某些 VIM PBIST 和一些 DMA 活动来获得该故障、如果您删除1个项目、您很可能不会遇到任何故障、但在我们的实际应用中、每个元素都在使用中。 对我来说、这看起来是 CPU 问题、无法防止...
我们需要了解发生了什么以及原因、猜测从运行时测试中删除 VIM RAM 奇偶校验测试(不提供任何适合的优势)可以消除此问题。 但这只是解决了问题、而不是问题背后的问题。同样的问题是否也会以其他方式出现->如果是、那么我们的 VIM RAM CRC 测试再次失败、系统跳闸...
-当执行 VIM_FBPARERR 处理程序 以使用 SafeTI ESM 矢量并恢复正确的内容时 (向量在 vimInit()之后被修改)我注意到那些“幽灵”FLG =0调用,但当时决定忽略这些调用,因为发生的次数相当小,我们有 FLG =0防护装置,以防止任何有效的处理,那些只消耗少量 CPU 时间的调用。 但现在想这些 FLG =0调用是更严重问题的症状、而那些 FLG =0调用也存在于纯 HalCoGen 项目中、当执行 HalCoGen 的 vimrampar奇 偶校验时...
问题1:CPU VIM_RAM 处理中是否存在一些错误/问题、这些错误/问题会导致奇偶校验测试期间发生损坏、勘误表中应记录这些错误/问题?
问题2:为什么在矢量不是"phantominterrupt"的情况下 SafeTI 测试开始失败、或者应该询问 ESM 通道为何在这种情况下不总是做出反应(由于发出错误信号、SafeTI 测试看起来工作正常)?
-现在在这些加速实验中使用"phantominterrupt"中断时、尚未收到任何 SafeTI-failures (在我们的实际应用中、我们总共看到过 Vim ram 奇偶校验测试失败2倍、但由于默认情况下测试不会说出失败的原因、我们不知道原因、 很可能是由于推测取指令而触发了 nERROR、或者发生了相同的 ESM 通道未激活问题-向 SafeTI 添加了原因、但之后没有得到该错误)
问题3:为什么这些 FBPARERR 调用会伴随 FLG = 0、这些调用不应该出现、因为中断被禁用了为什么进行测试、而是使 FLG 消失-而这些调用为什么不会出现在_evas_测试中?