TI的集成开发环境中的实时操作系统是DSP/BIOS,它并不包含网络功能。为了解决这个问题,TI结合其C6000系列推出了NDK(Network Developer’s Kit),该开发包可以用较少的资源消耗支持TCP/IP。NDK仅用200~250kB程序空间和95kB数据空间即可支持常规的TCP/IP服务,包括应用层的telnet,DHCP,HTTP等。所以,NDK很适合目前嵌入式系统的硬件环境,是实现DSP上网的重要支撑工具。
在BIOS里创建一个静态的任务,取名network_main。在network_main()里打开系统,配置好IP和子网掩码,然后创建一个动态的任务,完成数据的发送或接收。假设发送函数名为taskNetworkTx,任务优先级是5,创建的语句是:hSend = TaskCreate (tskNetworkTx, "NetTx", 5, 0x2000, 0, 0, 0);接收端为tskNetworkRx,创建的语句是:hRecv = TaskCreate (tskNetworkRx, "NetRx", 5, 0x2000, 0, 0, 0);tskNetworkTx和tskNetworkRx两个函数内部是具体的套接口(socket)编程,根据实际需要可以采用TCP或UDP协议。以发送端为例,采用UDP协议,代码如下:
void tskNetworkTx () {
……...//声明socket,打开SCOM
//打开任务
fdOpenSession (TaskSelf ());
//sudp是数据报套接口
sudp = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//配置目标IP地址和端口号
bzero (&sin1, sizeof (struct sockaddr_in));
sin1.sin_family = AF_INET;
sin1.sin_len = sizeof( sin1 );
sin1.sin_port = htons (7);
sin1.sin_addr.s_addr = inet_addr ("192.168.0.7");
for ( ; ;){
//等待编码器将数据指针发送过来
pMsgBuf = SCOM_getMsg (EnctoNet, SYS_FOREVER);
//将数据指针存到mpg_buf里
mpg_buf = pMsgBuf->bufChannel;
//发送以mpg_buf开始的1KB数据
sendto (sudp, (UINT8 *) mpg_buf, 1000, 0, &sin1, sizeof (sin1));
//将SCOM还给编码器
SCOM_putMsg (NettoEnc, pMsgBuf);
}
}
添加网络收发模块后的系统流程如图3所示。