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.

ndk传输图片

Other Parts Discussed in Thread: SYSBIOS

使用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可以一下子接收这么大的数据量吗?如果可以,应该怎么修改设置?

  • stackSize太小,你把它改大一些试试看

  • 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 你好:

    最近我也在纠结NDK工具箱的问题。可不可以问一下关于MCSDK中的例子hello world和client的问题?

    1、这两个例子都是把C6657看成了服务器端的,而且是使用DaemonNew函数创建的socket任务?不过好像每次必须先收到socket才能进入回调函数,我想知道怎么样可以DSP端主动发送数据 —— 作为客户端?请问一下你有这方面的经历吗?

    2、关于UDP接收到的数据——I = (int)recvnc( s, (void **)&pBuf, 0, &hBuffer );——是保存在pBuf指针指向的地址,可以告诉下我怎么样可以把这些数据保存在一片指定的内存吗——比如一张图片需要保存在一个数组里这样的到底怎么处理呢?

    非常感谢。

  • liang he2,

    你好!

    1.关于DaemonNew我不是很懂,之前也说过我都是依葫芦画瓢的,这个无法解答你。主动发送数据的话即使是服务器端也是可以的,用send函数就行(tcp协议)。要设置成客户端的话我是参考的linux下socket编程,当然具体API还是用的ti提供的函数。之前好像成功过,但后来还是换成了服务器模式,代码也没有保留,所以只能说一下当时是怎么做的,不能提供具体代码。

    2.我用的是tcp协议,想写到指定内存的话我试过直接用memcpy把数据存到ddr3中,地址自己指定就行。用数组保存的话当时遇到了stack大小不够的情况,也一直没解决,所以后来就放弃数组改用指针了,所以我也不知道怎样存到数组中,抱歉不能帮到你。

    说到底我也只是个新手,诸多问题还没能解决,这里提供的意见也不能确保正确,还是咨询TI工程师比较妥当。希望能帮到你!

  • yuxin yuan 谢谢你的回答,是比你还新的新手(/ □ \)......

  • yuxin yuan你好,请问一下你这个问题最后怎么解决的?可以告诉我一下吗?谢谢、