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.

[参考译文] TMS320VC5502:写入 sprintf 缓冲器导致固件崩溃

Guru**** 2473650 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1461341/tms320vc5502-writing-to-sprintf-buffer-crashes-firmware

器件型号:TMS320VC5502

工具与软件:

当缓冲区位于地址0x0004'9C40时、以下代码是否会根据需要写入 m_logBuffer、或者它是否也会写入到其他地方(如0x0000'9C40)?

当我写入该缓冲区时、我的系统会崩溃、但不会立即崩溃。  调试程序显示正在将正确的内容写入缓冲区、但我不确定、因为如果我注释掉 vsnprintf 调用、系统不会崩溃。

下面是一个折叠版本的代码--我没有显示 printf()函数的 va_list 和 va_start 宏。

#pragma DATA_SECTION ("ExtPgm3")
char m_logBuffer[1024]={ 0 };

char * put_ptr = m_logBuffer


int bytesAvail = sizeof (m_logBuffer)-(put_ptr - m_logBuffer);
int bytesPrinted = vsnprintf (put_ptr、bytesAvail、fmt、args);
put_ptr +=(字节打印>字节 Avail)? bytesAvail : bytesPrinted;

存储器配置

文件夹 原点长度 全波整流 未使用属性填充
(字节)(字节)(字节)(字节)
----- --- --- --- --- ---
MMR 00000000 000000c0 00000000 000000c0 RWIX
VECT 00000200 00000100 00000100 00000000 RWIX
DARAM 00000400 0000cc00 0000caee 00000112 RWINX
DMABuffers 0000d000 00003000 00002acc 00000534 Rwix
ExtPgm 00010000 00040000 0002d490 00012b70 RWIX
ExtMgm1. 00050000 00010000 0000bdce 00004232 RWIX
ExtPgm2 00060000 00020000 00020000 00000000 RWIX
ExtMgm3. 00080000 00020000 00014088 0000bf78 RWIX NCISFrameBuf
000a0000 00020000 00000000 00020000 RWIX
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Dean:

    请记住、所有 C55xx 器件对数据均可进行16位寻址(不可按字节寻址)。 当您指定 char 类型数组时、它会为每个字节元素分配16位字。   0x0004'9C40必须是字地址、因为  ExtPgm3从0x00080000 (字节地址)和0x00040000 (字地址)开始。

    关于崩溃,我将  在单步执行代码时监控 bytesAvail 和 bytesPrinted。 代码段在我看来是可以的、除了 fmt 和 args 是未知的。

    此致、

    Ming

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

    尊敬的 Ming:

    感谢您帮助我了解问题不是什么。  :)   

    我发现问题在于任务堆栈上的堆栈溢出、正是在这个堆栈中调用了我的 vsnprintf 函数。  它设置得太小了。

    我必须将任务堆栈从 DARAM 移动到外部存储器、以便为其找到足够大的空间。

    关于 C5502上的两个堆栈指针(堆栈和 sysstack)--它们是否需要具有相同的大小?  sysstack 上有什么内容或者我应该如何确定其大小?

    谢谢!

    -dean

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

    您好、Dean:

    我还记得、sysstack 是针对 DSP/BIOS、而堆栈是针对用户应用程序代码。 您可以首先为堆栈分配大容量、用0xA5A5填充它们、然后在程序运行一段时间后、您检查未使用的堆栈存储器(仍为0xA5A5)。 这样、您可以更好地估算实际的堆栈大小。

    此致、

    Ming