使用C6657,利用tcp协议从pc传输图片数据给dsp,dsp端用一个数组接收数据。如果数组大小设置比较小的话可以正常接收,但是一张图片大概30万像素,我试图一次性传递过去,就把数组大小扩成了30万,然后运行报错:
ti.sysbios.knl.Task: line 370: E_spOutOfBounds: Task 0x80073c48 stack error, SP = 0x80076c30.
xdc.runtime.Error.raise: terminating execution
出现这种错误是因为栈的大小设置太小了吗?我相关的设置如下:
// TCP Transmit buffer size
rc = 8192;
CfgAddEntry( hCfg, CFGTAG_IP, CFGITEM_IP_SOCKTCPTXBUF,
CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 );
// TCP Receive buffer size (copy mode)
rc = 8192;
CfgAddEntry( hCfg, CFGTAG_IP, CFGITEM_IP_SOCKTCPRXBUF,
CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 );
// TCP Receive limit (non-copy mode)
rc = 8192;
CfgAddEntry( hCfg, CFGTAG_IP, CFGITEM_IP_SOCKTCPRXLIMIT,
CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 );
/*
** Create a Heap.*/
var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
var heapMemParams = new HeapMem.Params();
heapMemParams.size = 0x30000;
heapMemParams.sectionName = "systemHeap";
Program.global.heap0 = HeapMem.create(heapMemParams);
/*** Create the stack Thread Task for our application.
*/
var tskNdkStackTest = Task.create("&StackTest");
tskNdkStackTest.stackSize = 0x1000;
tskNdkStackTest.priority = 0x5;
我设置的数组是在由“htcp = TaskCreate( tcp_main, "PerformRawRX", OS_TASKPRIHIGH, 0x1400, 0, 0, 0 );”创建的任务中定义的,请问dsp可以一下子接收这么大的数据量吗?如果可以,应该怎么修改设置?
Allen35065:
stackSize太小,你把它改大一些试试看
yuxin yuan:
回复 Allen35065:
Allen Yin,
您好!根据您的建议,我修改了stackSize,但是出现了下列情况:
1.stackSize=0x70000及更小时,仍然会出现原来的错误;
2.stackSize=0x80000或0x90000时,运行没有退出,但是DHCP无法进行,感觉程序可能跑飞了,因为我暂停Core0它显示“no symbols are defined for 0x8006AF48”;
3.stackSize=0x100000时,编译无法通过,错误显示 ./configPkg/linker.cmd program will not fit into available memory. run placement with alignment fails for section ".far:taskStackSection" size 0x102800 . Available memory ranges: 。
另外,我希望NDK获得数据后将数据写到DDR中,地址为0x80000000,但是Core0运行起始位置总是0x8000D410,这个会不会有影响?我把写DDR的地址换为0x90000000上述问题仍然会出现。请问应该怎么改比较合适?
yuxin yuan:
回复 yuxin yuan:
急求解答!!
liang he2:
回复 yuxin yuan:
yuxin yuan 你好:
最近我也在纠结NDK工具箱的问题。可不可以问一下关于MCSDK中的例子hello world和client的问题?
1、这两个例子都是把C6657看成了服务器端的,而且是使用DaemonNew函数创建的socket任务?不过好像每次必须先收到socket才能进入回调函数,我想知道怎么样可以DSP端主动发送数据 —— 作为客户端?请问一下你有这方面的经历吗?
2、关于UDP接收到的数据——I = (int)recvnc( s, (void **)&pBuf, 0, &hBuffer );——是保存在pBuf指针指向的地址,可以告诉下我怎么样可以把这些数据保存在一片指定的内存吗——比如一张图片需要保存在一个数组里这样的到底怎么处理呢?
非常感谢。
yuxin yuan:
回复 liang he2:
liang he2,
你好!
1.关于DaemonNew我不是很懂,之前也说过我都是依葫芦画瓢的,这个无法解答你。主动发送数据的话即使是服务器端也是可以的,用send函数就行(tcp协议)。要设置成客户端的话我是参考的linux下socket编程,当然具体API还是用的ti提供的函数。之前好像成功过,但后来还是换成了服务器模式,代码也没有保留,所以只能说一下当时是怎么做的,不能提供具体代码。
2.我用的是tcp协议,想写到指定内存的话我试过直接用memcpy把数据存到ddr3中,地址自己指定就行。用数组保存的话当时遇到了stack大小不够的情况,也一直没解决,所以后来就放弃数组改用指针了,所以我也不知道怎样存到数组中,抱歉不能帮到你。
说到底我也只是个新手,诸多问题还没能解决,这里提供的意见也不能确保正确,还是咨询TI工程师比较妥当。希望能帮到你!
liang he2:
回复 yuxin yuan:
yuxin yuan 谢谢你的回答,是比你还新的新手(/ □ \)……
liang he2:
回复 yuxin yuan:
yuxin yuan你好,请问一下你这个问题最后怎么解决的?可以告诉我一下吗?谢谢、