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.

【求助】DaemonNew 及回调函数相关问题

工程师好,我现在遇到一些问题,希望工程师能够帮助一下。

背景介绍:我使用 6678EVM 开发板平台上做NDK的相关实验,参考的例子的NSP中的HelloWorld,我在HelloWorld.c文件NetworkOen()函数中设置回调函数相关参数(采用TCP协议,端口号为6350,回调函数名为dtask_tcp_echo),见下图:

   且我设置的TCP发送缓冲区大小rc8192字节,如下所示:

  在udpHello.c里,dtask_tcp_echo( SOCKET s, UINT32 unused ) 函数主要实现向上位机发送数组数据,我采取的是中断触发方式,即设置每2ms向上位机发送一次数据(每组数据27字节),主要程序见下图:

问题如下:

      1. 当我执行程序时,程序可以向上位机发送数据,但是当发送的字节数超过8192(原来设置的rc大小)后,回调函数dtask_tcp_echo的send函数就不再执行了。

      2. 之前工程师说”可能是发送太快,描述符来不及回收,有可能导致描述符资源耗尽,进而导致数据堵塞。“  我按照这个解答去更改了发送间隔为2s,但是问题依旧。请问是不是我设置的发送间隔时间是否合适呢?

      3. 我后来使用UDP协议来进行发送和接收,则不出现超过rc的问题,能够持续发送数据,但是会出现约30S的数据延时。是否是因为UDP不存在发送缓冲区的问题呢?

      4. 我去看了”TI Network Developer's Kit(NDK) v2.21 API Reference Guide.pdf“ ,其中5.4.1节介绍了DaemonNew函数,

对于TCP协议而言,当连接建立时,socket session 就打开了。这时是否还需要用fdOpensession()函数来分配描述符呢?

       5.文档中DaemonNew()中介绍的这两句话如何理解呢?

对于TCP:

The callback function can keep the socket and task thread for as long as necessary. It returns from the callback once it is
done with the connection.

对于UDP:

The callback function can keep the socket and task thread for as long as necessary. It returns from the callback only when it is done with the data. (While the callback function holds the UDP socket, the daemon will ignore further activity on it.)

       6.工程师能否提供一些测试现有TCP工程的思路呢?已经做了很长时间了,希望有所进展!

     

        请工程师帮助解答一下,非常感谢!

happy dog

        

   

  • 请工程师帮助解答一下,非常感谢!

  • 请工程师帮助解答一下,非常感谢!

  • hi,dodge:

    想请教下你一个问题,

    helloworld程序中, NetworkOpen()函数中有个hHello = DaemonNew( SOCK_DGRAM, 0, 1000, dtask_udp_hello,OS_TASKPRINORM, OS_TASKSTKNORM, 0, 1 ),我修改了 dtask_udp_hello()所在的udphello.c程序发现并没有执行,所以,关于这个DaemonNew(),我查了些论坛帖子,说“DaemonNew发起的是一个Thread,如果你的回调函数dtask_udp_hello 没有收到socket肯定无法进入,在ndk##\packages\ti\ndk\winapps 下有不少发UDP socket的可执行文件,跑代码的时候发一个socket断点就可以停了”,我尝试用winapps目录下的helloworld.c,利用VS2010将其编译,但是我不知道如何将这个目录下的上位机程序和dsp中helloworld例程联系起来,也就是,怎么利用这个目录下的上位机程序,给dtask_udp_hello 发一个socket,让程序进入到DaemonNew()函数中去。

    谢谢。

  • hi,mao chen.

    DaemonNew()函数确实是发起的一个Thread,需要你的上位机配置好协议名称及端口号。具体请参看NDK-API文档,其中有详细介绍。

    另外,我的上位机采用的是Labview语言编写的,在上位机中需要先建立TCP连接,待与下位机连接后(此时已进入DaemonNew函数新建的进程),即可实现双机通信。

    不知你的上位机语言是怎样的,不过上位机程序结构应当是一致的。

    祝好!