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.

[参考译文] TMS570LS0432:_dabort 错误

Guru**** 2482105 points
Other Parts Discussed in Thread: TMS570LS0432, CC3100

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/712901/tms570ls0432-_dabort-error

器件型号:TMS570LS0432
主题中讨论的其他器件: CC3100

您好!

我使用的是 TMS570LS0432微控制器、有时在从存储器读取数据时会出现"_dabort"错误。 在调试模式下、我在文件'sys_intvecs.asm'中设置断点、其中'_dabort'操作为(请参阅图片)。

前两个'_dabort'调用是在'System_selftest.c'中的函数 checkRAMECC (void)在这两行中执行的:

/*读取损坏的数据以生成双位错误*/
ramread = tcramA2bit;
ramread = tcramB2bit; 

这里调用了'ramErrorFound'、但随后未调用'ramErrorReal'、因此我假设没有 RAM 错误。 然后 CPU 被恢复并且程序继续运行(对于我来说、只要程序在'_dabort'调用后继续运行、这个运行方式不会引起任何问题。

启动后、我的程序正常运行几秒钟、但随后再次调用'_dabort'。 这一次'noRAMerror'被调用、CPU 在其中止的位置被恢复。 问题是、当 CPU 再次尝试执行命令行时、会再次调用'_dabort'、因此它最终会进入无限循环。 '_dabort'调用由以下函数引起:

uint32 spiTransmitData8Bit (/*... */ uint32长度、uint8 * srcbuff){

uint16 Tx_Data;

//...

while (length!= 0U){

//...

TX_Data =* srcbuff;<--- 尝试读取 scrbuff 时调用_dabort

//发送 TX_Data ...

srcbuff +;
length--;
}

//...
} 

奇怪的是、在出现'_dabort'错误之前、此函数已成功执行很多次。

我最后发现的是指针'scbuff '指向0x08008000、而调试器显示"Error:memory map prevented reading"(错误:内存映射阻止读取)(请参阅图片)。

现在我想知道:

  • 此错误消息意味着什么?
  • 如何阻止'_dabort'调用?
  • 我可能内存不足?

我已经在这些主题上阅读了:
https://e2e.ti.com/support/microcontrollers/hercules/f/312/t/301090?TMS570-abort-on-startup
https://e2e.ti.com/support/microcontrollers/hercules/f/312/p/301325/1050075

但我自己无法找到解决方案。 因此、我希望有人能帮助我解决这个问题。

感谢您的回答

此致、
米歇尔

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

    我认为我的第一张图片有问题、应该是这张图片:

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

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

    0x08008000超出 RAM 范围。 LS0432具有32KB 的内部 SRAM、范围为0x0800_0000至0x0800_7FFF。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您没有发布完整代码、但我要检查 srcbuff 是否为空。  

    在 spiTransmitData8Bit()开始时,请尝试:  

    ```μ A

    如果(!srcbuff){

      //闪烁 LED

      //打印错误!

      返回 ERR_code;

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

    您好 QJ、

    非常感谢您提供此信息。 这解释了为什么地址0x08008000始终出现错误。 我刚刚检查了 srcbuff 阵列的起始地址、它是0x08007DF4。 阵列长度为1460、采用十六进制代码0x05B4、因此结束地址为0x080083A8、超出 RAM 范围。  然后、我在 spiTransmit 函数的开头添加了以下内容:

    //如果 scrbuff 是 RAM 地址
    if (((((UINT32) srcbuff)& 0xFFFFFF0000)= 0x08000000){
    size += length;
    printInt ("arraSize:%4D、"、length);
    printInt ("addr:0x%08X、"、srcbuff);
    printInt ("总计:%7d\r\n"、总计);
    } 

    这是我的输出的末尾、在程序被中止之前:

    arraSize:1460、addr:0x08006CD8、total:23912
    arraSize:4、addr:0x0800150E、total:23916
    arraSize:4、adSize:0x08000FB4、total:23920
    arraSize:1460、addr:0x0800728C、total:25380
    total:4、adSize:0x08000FB4
    
    
    、0x08384、adrrrrrrrrrrr:0x086028C、adrrr、adrrrrrrr:0x08388、adrrr、adrrrrrr、am4:0x086028C、adrrrrrrrrrrrr:0x08388
    4、addr:0x08000FB4、Total:26856
    arraSize:1460、addr:0x08007DF4、total:28316 

    似乎为小尺寸阵列分配的内存在 RAM 开头的某个位置。 但是、Lange 阵列的存储器是在 RAM 的末尾分配的、地址持续增加。 如果将大数组的地址减去、则始终得到0x05B4、十进制的值分别为1460、以字节为单位的大数组大小(例如0x08007DF4 - 0x08007840 = 0x05B4)。 因此、释放分配的存储器显然存在问题。 我尝试在 SPI 传输函数的末尾调用 free()函数:

    uint32 spiTransmitData8Bit (/*... */ uint32长度、uint8 * srcbuff){
    
    uint16 Tx_Data;
    uint8 * startAddress = srcbuff;
    
    //...
    
    while (length!= 0U){
    
    //...
    
    TX_Data =* srcbuff;<--- 尝试读取 scrbuff 时调用_dabort
    
    //发送 TX_Data ...
    
    srcbuff +;
    length--;
    }
    
    //...
    
    FREE (startAddress);
    } 

    但地址仍会增加、直到 调用'_dabort'。 我知道您只能释放之前使用 malloc 分配的内存。

    现在、我必须解释我正在执行的操作的背景:我想将 TMS570与 CC3100 Wifi 模块配合使用。 TMS570接收 CAN 消息并通过中断将其存储在缓冲器中(缓冲器大小为1400字节)。 在我的主循环中、它使用 TCP 协议在 Wifi 上发送所有新接收到的 CAN 消息。 简单地说、我正在使用 CAN 转 Wifi 适配器。 TMS570和 CC3100之间的通信通过 SPI 完成。 CC3100驱动程序软件为 Wifi 模块生成 SPI 消息,这些消息与 spiTransmit()函数一起发送。 因此、我现在建议 CC3100驱动程序软件不会释放分配的内存。 由于我没有自己对该驱动程序进行编程(我只是通过编辑 user.h 文件来移植它)、我不知道它在哪个代码行中分配内存以及它为什么不释放分配的内存。 我尝试取消注释 user.h 中的'#define SL_MEMORY_Mgmt_DYNAMIC'行、以便驱动程序能够分配和释放内存本身、但它没有帮助。

    很抱歉、此信息有点复杂。 这可能属于 Simplelink 论坛。 不过、我真的希望有人能帮我多点一些忙。

    感谢您的进一步回答。

    此致
    米歇尔

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

    感谢您的回答。 我将代码的其余部分留给了更好的概述、并将其简化为与我的问题相关的内容。 由于调试器说地址为0x08008000、因此不能为空。 此外、我检查了地址是否为零、但它不是。

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

    您好、再说一次、

    我发现了问题的原因。 CC3100驱动程序软件未导致问题。 我已经想知道、当 RAM 范围之外的存储器被保留但未被保留时、没有错误。 我只需在 tcpSend 函数中输入错误的缓冲区长度。 由于我将两个索引混合在一起、我计算了一个长度为-1 的 int32、这个负长度被计算为 uint16、因此得到的长度为65535。 由于驱动程序软件将此缓冲区长度标识为单个 SPI 消息的长度、因此它被拆分为许多1460字节消息。 当然,我的 spimit()函数中的记忆地址一直在不断增加。 由于我使用 Java 编程语言的时间很长,我认为负值不像-1 casted 到无符号整数的最大值(Java 中没有无符号整数)。 所以我走错路了一点,但是你生活和学习。 从现在开始、我将始终检查我的函数参数!

    此致
    米歇尔