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.

[参考译文] TMS320F280025:UL1998 RAM 测试

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1258491/tms320f280025-ul1998-ram-testing

器件型号:TMS320F280025

您好

我将为 UL1998编写 RAM 测试。 下面是我的代码...

     

       X++;
       如果(pattern_index < 12)
       {
           ramR1_Copy =* ramR1Address_pr;
           ramR1_NextCopy = * ramR1AddressNext_pr;
           * ramR1AddressNext_pr = 0x00;
           * ramR1Address_pr = pattern_array[pattern_index];
           error_r1 =(* ramR1Address_pr!= pattern_array[pattern_index])? 对:错;
           error_r1 =(* ramR1AddressNext_pr!= 0x00)? 对:错;
           * ramR1Address_pr = 0x00;
           * ramR1AddressNext_pr = pattern_array[pattern_index];
           error_r1 =(* ramR1AddressNext_pr!= pattern_array[pattern_index])? 对:错;
           error_r1 =(* ramR1Address_pr!= 0x00)? 对:错;
           * ramR1Address_pr = ramR1_Copy;
           * ramR1AddressNext_pr = ramR1_NextCopy;
           pattern_index++;
       }
       否则
       {
           如果(x > 4000)
           {
               if (ramR1Address_pr ==(uint32_t *) 0x000007F2)//指针必须是偶数,因为指针增加2
               {
                   ramR1Address_pr =(uint32_t *) 0x0000A000;
                   ramR1AddressNext_pr =(uint32_t *) 0x0000A002;
               }否则、如果(ramR1Address_pr =(uint32_t *) 0x0000C7B2)
               {
                   ramR1Address_pr =(uint32_t *) 0x00000128;
                   ramR1AddressNext_pr =(uint32_t *) 0x000012A;

               }
               否则
               {

                   ramR1AddressNext_pr++;
                   ramR1Address_pr++;
               }
               pattern_index = 0;
               X = 0;
           }
       }

其中 ramR1_Copy/ramR1_NextCopy /pattern_index 是在无需测试的 RAM 范围内定义的。

它在主循环中运行没问题。 但是,如果 illegalOperationHandler()在 ISR 函数中运行,它将被触发。

有什么建议吗?

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

    您好!

    您是否验证了它进入非法操作处理程序的确切指令是什么? 您是否已确保当前或附近发生的数组索引和地址访问有效?  当您到达非法操作处理程序时、您能看到  CPU 中的返回地址寄存器指向了哪个函数吗?

    此致、

    阿米尔·奥马尔

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

    您好

    • 将 值从临时存储器恢复到原始地址期间触发非法操作处理程序  
    • 从地址0x128到0xAA??可以正常运行代码。 非法操作处理程序始终在地址0xAA 的某个值处触发??
    • 供参考…在主循环中运行代码时禁用中断…之所以将移至 ISR、是因为我们的数字电源降压转换器像主循环中的 RAM 测试一样停止响应。 这并不好。
    • 您提到了"CPU 中的返回地址寄存器指向了哪些函数?"、我不知道如何进行检查
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    将 值从临时存储恢复回原始地址期间触发非法操作处理程序

    您的代码中的这一行是什么? 我不 知道这是在您上面的代码中还是在您的程序中的其他位置。

    从地址0x128到0xAA 的代码是否正常工作? 非法操作处理程序始终触发地址0xAA?
    的某个值

    这话具体是什么意思? 您是否在至中 使用指针或数组来访问0x128至0xAA 处的存储器?

    您提到"CPU 中的返回地址寄存器指向了什么函数?",我不知道如何检查它

    此返回地址存储在 RPC (返回程序计数器)中。 您可以在调试会话的"Registers"窗口中找到此信息。

    上面的屏幕截图来自 C28x 指令集。

    此致、

    阿米尔·奥马尔

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

    您好

    我的代码会将测试 RAM 的内容复制到0xC7B2后面的临时 RAM 中。 该区域不通过代码进行测试。 下面是测试 RAM 中内容的代码副本、

               ramR1_Copy =* ramR1Address_pr;
               ramR1_NextCopy = * ramR1AddressNext_pr;

    其中 ramR1_Copy 和 ram_NextCopy 是在0xC7B2后面定义的、ramR1Address_pr/ramR1AddressNext_pr 是指向测试 RAM 地址的指针。

    指针用以下代码定义、Ram_Temp 2在0xC782后面。

    #pragma DATA_SECTION (ramR1Address_pr、"pragma Ram_Temp 2002");
       uint32_t * ramR1Address_pr =(uint32_t *) 0x00000128;
    #pragma DATA_SECTION (ramR1AddressNext_pr、" Ram_Temp 452");
       uint32_t * ramR1AddressNext_pr =(uint32_t *) 0x0000012A;

    在 March 测试(使用12个模式写入/读取到测试地址)之后、内容被从临时区域恢复到测试地址。

               * ramR1Address_pr = ramR1_Copy;
               * ramR1AddressNext_pr = ramR1_NextCopy;

    ramR1Address_pr 和 ramR1AddressNext_pr、增加了1

               如果(x > 4000)
               {
                   if (ramR1Address_pr ==(uint32_t *) 0x000007F2)//指针必须是偶数,因为指针增加2
                   {
                       ramR1Address_pr =(uint32_t *) 0x0000A000;
                       ramR1AddressNext_pr =(uint32_t *) 0x0000A002;
                   }否则、如果(ramR1Address_pr =(uint32_t *) 0x0000C7B2)
                   {
                       ramR1Address_pr =(uint32_t *) 0x00000128;
                       ramR1AddressNext_pr =(uint32_t *) 0x000012A;

                   }
                   否则
                   {

                       ramR1AddressNext_pr++;
                       ramR1Address_pr++;
                   }
                   pattern_index = 0;
                   X = 0;
               }
           }

    您会发现代码将跳过某个地址、因为链接器信息表明不应访问跳过的地址、它不是 RAM 的地址。

    关于"0x0128"至"0xAA"的含义?" 正常工作。 这意味着代码执行从0x128到0xAA 的指针的测试? 正确配置。 在这里、"??" 指针的最后2位。 该值在不同的编译中没有固定值。

       

    我在亚洲。 是否有可能让一些来自亚洲的 FAE 来支持这个问题。 这是因为它非常紧迫。 安全代理等待我们为应用解决此问题。

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

    您好!

    我位于亚洲。 是否可能有一些来自亚洲的 FAE 来支持这个问题。

    FAE 很可能也会针对这种问题通过 E2E、因此问题也会以同样的速度解决。

    在 March 测试(使用12个模式写入/读取到测试地址)之后、内容被从临时区域恢复到测试地址。

               * ramR1Address_pr = ramR1_Copy;
               * ramR1AddressNext_pr = ramR1_NextCopy;

    [/报价]

    根据您之前所说的、执行此代码时好像会发生非法操作处理程序、是这样吗? 如果是这样、您是否介意单步执行这里的代码以查看是否有任何 CPU 寄存器被错误地更改? 另请查看"Disassembly"窗口和"Memory Browser"、以便您验证所发生的更改符合预期。

    此致、

    阿米尔·奥马尔

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

    1.内容是内存浏览器正确。  

    我不熟悉汇编代码。

    3.我们是否可以通过在线电话核实问题?

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

    我在 CCS 中使用"Disassembly"功能时发现了一些奇怪的地方。

    我在反汇编过程中捕获了以下代码、该代码在程序运行时未出现任何问题

     437               *ramR1AddressNext_pr = ramR1_NextCopy;
    00AA37:  0638       MOVL        ACC、@0x38
    00aa38:  761F031E   MOVW        DP、#0x31e
    00aa3a:  1EC5       MOVL        *+ XAR5[0]、ACC
     438               * ramR1Address_pr = ramR1_Copy;
    00aa3b:  0636       MOVL        ACC、@0x36
    00aa3c:  1EC6       MOVL        *+ XAR6[0]、ACC

    我在触发非法操作的情况下运行程序时在反汇编中捕获了代码

     437               *ramR1AddressNext_pr = ramR1_NextCopy;
    00AA37:  0F0F       Cmpl        ACC、@0xF
    00aa38:  0000       ITRAP0       
    00aa39:  0000       ITRAP0       
    00aa3a:  1EC5       MOVL        *+ XAR5[0]、ACC
     438               * ramR1Address_pr = ramR1_Copy;
    00aa3b:  0636       MOVL        ACC、@0x36
    00aa3c:  1EC6       MOVL        *+ XAR6[0]、ACC

    您可以找到* ramR1AddressNext_pr = ramR1_NextCopy;已充电的程序集。

    有任何意见吗?

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

    您好!

    我之前在您的帖子中看到了存储器地址、如果非法操作处理程序仅发生在地址0xAA__中、这可能必须对链接器命令文件执行某些操作、您可以在此处附加它吗? 0xAA00-0xAAFF 是在 LS5 RAM 中、所以访问应该没有问题、但我可能遗漏了其他东西。

    此致、

    阿米尔·奥马尔