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.

6670

Other Parts Discussed in Thread: SYSBIOS

#include <stdio.h>

#include <ti/ndk/inc/netmain.h>

//#include <ti/ndk/inc/_stack.h>
//#include<ti/bios/include/sys.h>
#include <ti/ndk/inc/tools/console.h>
#include <ti/ndk/inc/tools/servers.h>
#include "ti/platform/platform.h"
#include <ti/sysbios/knl/Task.h>
#include <ti/sysbios/knl/Clock.h>
#include <ti/sysbios/knl/Semaphore.h>
#include <ti/csl/csl.h>
#include <ti/csl/csl_chip.h>

//#include <ti/csl/csl_dat.h>
#include <ti/csl/csl_cache.h>
/* Resource manager for QMSS, PA, CPPI */
#include "ti/platform/resource_mgr.h"
// When USE_OLD_SERVERS set to zero, server daemon is used
#define USE_OLD_SERVERS 0
/* BIOS6 include */
#include <ti/sysbios/BIOS.h>
#include <xdc/runtime/Error.h>

char *VerStr = "\nTCP/IP Stack Application\n\n";
//NETCTRL
static void NetworkOpen();
static void NetworkClose();
static void NetworkIPAddr( IPN IPAddr, uint IfIdx, uint fAdd );
//static void SendData();
//static void RecvData();
static void tsk_udp();
//static void StackTest();
static void ServiceReport( uint Item, uint Status, uint Report, HANDLE hCfgEntry );//使用NETTOOLS库时,追踪服务状态
platform_info gPlatformInfo;

// 配置主机名、IP地址等

char *HostName = "tidsp";
//char *LocalIPAddr = "0.0.0.0"; // Set to "0.0.0.0" for DHCP
char *LocalIPAddr = "49.123.80.51"; // Set to "0.0.0.0" for DHCP

char *LocalIPMask = "255.255.255.0"; // Not used when using DHCP

char *GatewayIP = "49.123.80.253"; // Not used when using DHCP
char *DomainName = "demo.net"; // Not used when using DHCP
char *DNSServer = "0.0.0.0"; // Used when set to anything but zero
Uint8 clientMACAddress [6] = {0x08, 0x60, 0x6E, 0xC7, 0xE6, 0xD2}; /* MAC address for my PC */
UINT8 DHCP_OPTIONS[] = { DHCPOPT_SERVER_IDENTIFIER, DHCPOPT_ROUTER };//DHCP(动态主机配置协议)可以给网络内主机提供配置参数。

#undef TEST_RAW_NC
#undef TEST_RAW_SEND
#undef TEST_RAW_RECV

#define PACKET_SIZE 1000
#define PACKET_COUNT 1

#ifdef TEST_RAW_SEND
static HANDLE hSendRaw = 0;
static void SendRawEth();
#endif

#ifdef TEST_RAW_RECV
static HANDLE hRecvRaw = 0;
static void RecvRawEth();
#endif


/*void EVM6670_init()//EVM平台初始化
{
#define CACHE_L2ALL 256
#define CACHE_EMIFA_CEOO 128
#define CACHE_EMIFA_CEO1 129
void CSL_init(void);
CACHE_clean(CACHE_L2ALL,0,0);
CACHE_setL2Mode(CACHE_128KCACHE);
CACHE_enableCaching(CACHE_EMIFA_CEOO);//允许外存CEOO作为缓存
CACHE_enableCaching(CACHE_EMIFA_CEO1);//允许外存CEO1作为缓存

platform_init_flags sFlags;
platform_init_config sConfig;

int32_t pform_status;


memset( (void *) &sFlags, 0, sizeof(platform_init_flags));
memset( (void *) &sConfig, 0, sizeof(platform_init_config));

sFlags.pll = 0; // PLLs(锁相环) for clocking
sFlags.ddr = 0; // External memory
// sFlags.tcsl = 1; Time stamp counter
#ifdef _SCBP6618X_
sFlags.phy = 0; // Ethernet
#else
sFlags.phy = 1; // Ethernet
#endif
sFlags.ecc = 0; //Memory ECC (错误检查与纠错)

sConfig.pllm = 0; // Use libraries default clock divisor

pform_status = platform_init(&sFlags, &sConfig);


if (pform_status != Platform_EOK) {

while (1) {
(void) platform_led(1, PLATFORM_LED_ON, PLATFORM_USER_LED_CLASS);
(void) platform_delay(50000);
(void) platform_led(1, PLATFORM_LED_OFF, PLATFORM_USER_LED_CLASS);
(void) platform_delay(50000);
}
}

}*/
// Main Entry Point
int main()
{
/* Start the BIOS 6 Scheduler */
BIOS_start ();
}

//Void task1(UArg arg0, UArg arg1);
//Void task2(UArg arg0, UArg arg1);

//Int resource = 0;
//Semaphore_Handle sem;
//Task_Handle tsk1;
//Task_Handle tsk2;

//Int finishCount = 0;

/*
* ======== main ========
*/
/*void main()
{
//InitPeriphral();
//Himalaya_PLL1_Init(20);
Task_Params taskParams;


Task_Params_init(&taskParams);
taskParams.priority = 1;
tsk1 = Task_create (StackTest, &taskParams, NULL);
if (tsk1 == NULL)
{
printf("Task_create() failed!\n");
BIOS_exit(0);
}
Task_Params_init(&taskParams);
taskParams.priority = 2;
tsk2 = Task_create (RecvData, &taskParams, NULL);
if (tsk2 == NULL)
{
printf("Task_create() failed!\n");
BIOS_exit(0);
}
BIOS_start();
}
*/
// ======== task1 ========
// Main Thread
void StackTest()
{
int rc;
HANDLE hCfg;
int i;
QMSS_CFG_T qmss_cfg;
CPPI_CFG_T cppi_cfg;
/* Get information about the platform so we can use it in various places */
memset( (void *) &gPlatformInfo, 0, sizeof(platform_info));
(void) platform_get_info(&gPlatformInfo);

(void) platform_uart_init();
(void) platform_uart_set_baudrate(115200);
(void) platform_write_configure(PLATFORM_WRITE_ALL);

/* Clear the state of the User LEDs to OFF */
for (i=0; i < gPlatformInfo.led[PLATFORM_USER_LED_CLASS].count; i++) {
(void) platform_led(i, PLATFORM_LED_OFF, PLATFORM_USER_LED_CLASS);
}

/* Initialize the components required to run this application:
* (1) QMSS
* (2) CPPI
* (3) Packet Accelerator
*/
/* Initialize QMSS */
if (platform_get_coreid() == 0)
{
qmss_cfg.master_core = 1;
}
else
{
qmss_cfg.master_core = 0;
}
qmss_cfg.max_num_desc = MAX_NUM_DESC;
qmss_cfg.desc_size = MAX_DESC_SIZE;
qmss_cfg.mem_region = Qmss_MemRegion_MEMORY_REGION0;
if (res_mgr_init_qmss (&qmss_cfg) != 0)
{
platform_write ("Failed to initialize the QMSS subsystem \n");
return;
}
else
{
platform_write ("QMSS successfully initialized \n");
}

/* Initialize CPPI */
if (platform_get_coreid() == 0)
{
cppi_cfg.master_core = 1;
}
else
{
cppi_cfg.master_core = 0;
}
cppi_cfg.dma_num = Cppi_CpDma_PASS_CPDMA;
cppi_cfg.num_tx_queues = NUM_PA_TX_QUEUES;
cppi_cfg.num_rx_channels = NUM_PA_RX_CHANNELS;
if (res_mgr_init_cppi (&cppi_cfg) != 0)
{
platform_write ("Failed to initialize CPPI subsystem \n");
return;
}
else
{
platform_write ("CPPI successfully initialized \n");
}


if (res_mgr_init_pass()!= 0) {
platform_write ("Failed to initialize the Packet Accelerator \n");
return;
}
else
{
platform_write ("PA successfully initialized \n");
}

//int NC_SystemOpen( int Priority, int OpMode );//NC_SystemOpen(); //netctrl打开网络系统
rc = NC_SystemOpen( NC_PRIORITY_LOW, NC_OPMODE_INTERRUPT );
if( rc )
{
platform_write("NC_SystemOpen Failed (%d)\n",rc);
for(;;);
}
platform_write(VerStr);

//System_printf(VerStr); // Print out our banner第一个显示

hCfg = CfgNew(); //新配置;
if( !hCfg )
{
printf("Unable to create configuration\n");
return ;
}

// 检验域名和主机名的长度
if( strlen( DomainName ) >= CFG_DOMAIN_MAX ||
strlen( HostName ) >= CFG_HOSTNAME_MAX )
{
printf("Names too long\n");
return ;
}

// Add our global hostname to hCfg (to be claimed in all connected domains)
CfgAddEntry( hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_HOSTNAME, 0,
strlen(HostName), (UINT8 *)HostName, 0 );

// 如果是指定的IP地址,手动配置IP和网关
if( inet_addr(LocalIPAddr) )
{
CI_IPNET NA;
CI_ROUTE RT;
IPN IPTmp;

// 设置手动IP地址
bzero( &NA, sizeof(NA) );
NA.IPAddr = inet_addr(LocalIPAddr);
NA.IPMask = inet_addr(LocalIPMask);
strcpy( NA.Domain, DomainName ); //(register char *dest, register const char *src);


NA.NetType = 0;

// Add the address to interface 1
CfgAddEntry( hCfg, CFGTAG_IPNET, 1, 0,
sizeof(CI_IPNET), (UINT8 *)&NA, 0 );

// 添加默认网关. 由于是默认的,因此目的地址和掩码都置0
bzero( &RT, sizeof(RT) );
RT.IPDestAddr = 0;
RT.IPDestMask = 0;
RT.IPGateAddr = inet_addr(GatewayIP);

// 配置路由器;
CfgAddEntry( hCfg, CFGTAG_ROUTE, 0, 0,
sizeof(CI_ROUTE), (UINT8 *)&RT, 0 );

// 配置域名解析
IPTmp = inet_addr(DNSServer);
if( IPTmp )
CfgAddEntry( hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_DOMAINNAMESERVER,
0, sizeof(IPTmp), (UINT8 *)&IPTmp, 0 );
}
// 配置 DHCP协议动态获得IP
else
{
CI_SERVICE_DHCPC dhcpc;

// Specify DHCP Service on IF-1
bzero( &dhcpc, sizeof(dhcpc) );
dhcpc.cisargs.Mode = CIS_FLG_IFIDXVALID;
dhcpc.cisargs.IfIdx = 1;
dhcpc.cisargs.pCbSrv = &ServiceReport; ///这里用到ServiceReport函数!
CfgAddEntry( hCfg, CFGTAG_SERVICE, CFGITEM_SERVICE_DHCPCLIENT, 0,
sizeof(dhcpc), (UINT8 *)&dhcpc, 0 );
}
rc = DBG_WARN;//可以改变答应输出的调试信息的级别,如:不打印出警告信息,而可以打印出调试信息
CfgAddEntry( hCfg, CFGTAG_OS, CFGITEM_OS_DBGPRINTLEVEL,
CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 );
// UDP Receive limit
rc = 8192;
CfgAddEntry( hCfg, CFGTAG_IP, CFGITEM_IP_SOCKUDPRXLIMIT,
CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 );
// socket buffer size to 8704 bytes
rc = 8704;
int CFGITEM_IP_SOCKBUFMAX=1024; //新添加
CfgAddEntry( hCfg, CFGTAG_IP, CFGITEM_IP_SOCKBUFMAX,
CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 );


// 配置启动系统

// We keep booting until the function returns 0. This allows
// us to have a "reboot" command.
//启动网络任务
do
{
rc = NC_NetStart( hCfg, NetworkOpen, NetworkClose, NetworkIPAddr );
} while( rc > 0 );

//删除配置
CfgFree( hCfg );

//关闭系统
//main_exit:
NC_SystemClose();
return ;
}
static HANDLE htsk_udp=0;//hUdpSoc=0,
static void NetworkOpen()
{
//peer_addr="49.123.80.51";
Task_sleep(10);
htsk_udp =TaskCreate(tsk_udp,"udp_video",5,0x1000,0x22507B31,12345,12345);
}

/*
* ======== task2 ========
*/

//DaemonNew( SOCK_STREAMNC, 0, 7, dtsk_udp,OS_TASKPRINORM, OS_TASKSTKNORM, 0, 3 );
static void tsk_udp(IPN IPAddr,int PeerPort,int LocalPort)
{
int send_udp_count;//int i =0,ret;
SOCKET UdpSocket =0;
//UINT32 rawchannel_num;
struct sockaddr_in sin1;
char pBuf[1024];
HANDLE hBuffer;

//Bool flag=TRUE;
//int len = sizeof(struct sockaddr_in);
UdpSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);

if(UdpSocket==INVALID_SOCKET)
{
printf("socket open failure!\n");
return;
}

//配置要绑定IP地址和端口号
bzero(&sin1,sizeof(struct sockaddr_in));
sin1.sin_addr.s_addr = htonl(INADDR_ANY);
sin1.sin_family = AF_INET;
sin1.sin_len =sizeof(sin1);
sin1.sin_port = htons(8000);
//SrvAddr.sin_addr.s_addr=inet_addr("49.123.80.51");
fdOpenSession( TaskSelf()); //打开任务
if ( bind( UdpSocket, (PSA) &sin1, sizeof(sin1) ) < 0 )//把socket绑定到本地网卡
{
printf("bind failure!\n");
return;
}
//设置目的地址端口属性
bzero(&sin1,sizeof(struct sockaddr_in));
sin1.sin_addr.s_addr = htonl(INADDR_ANY);
sin1.sin_family = AF_INET;
sin1.sin_len =sizeof(sin1);
sin1.sin_port = htons(PeerPort);//2000);
sin1.sin_addr.s_addr=IPAddr;//("49.123.80.51");//inet_addr("49.123.80.51");

//分配工作缓冲区
if((pBuf!=mmBulkAlloc(1024)))
{
printf("erro");
}

for(;;)
{
*(int*)pBuf=send_udp_count++;


if(sendto(UdpSocket,pBuf,1000,0,(PSA)&sin1,sizeof(sin1))<0)
{
break;

}
recvncfree( hBuffer );
//清空数据区
mmZeroInit(pBuf, (uint)UdpSocket);
//设置发送数据率
TaskSleep(8);
TaskBlock( TaskSelf() );
fdClose(UdpSocket);
}


// This task is killed by the system - here, we will block

}

// NetworkClose
static void NetworkClose()
{
//fdCloseSession(hUdpSoc);
// TaskDestroy(hUdpSoc);

fdCloseSession(htsk_udp);
TaskDestroy(htsk_udp);
}

static void NetworkIPAddr( IPN IPAddr, uint IfIdx, uint fAdd )
{
static uint fAddGroups = 0;
IPN IPTmp;

if( fAdd )
printf("Network Added: ");
else
printf("Network Removed: ");

// Print a message
IPTmp = ntohl( IPAddr );
printf("If-%d:%d.%d.%d.%d\n", IfIdx,
(UINT8)(IPTmp>>24)&0xFF, (UINT8)(IPTmp>>16)&0xFF,
(UINT8)(IPTmp>>8)&0xFF, (UINT8)IPTmp&0xFF );

// This is a good time to join any multicast group we require
if( fAdd && !fAddGroups )
{
fAddGroups = 1;
// IGMPJoinHostGroup( inet_addr("224.0.0.2"), 1 );
}
}
// Service Status Reports
// Here's a quick example of using service status updates

static char *TaskName[] = { "Telnet","HTTP","NAT","DHCPS","DHCPC","DNS" };
static char *ReportStr[] = { "","Running","Updated","Complete","Fault" };
static char *StatusStr[] = { "Disabled","Waiting","IPTerm","Failed","Enabled" };
static void ServiceReport( uint Item, uint Status, uint Report, HANDLE h )
{
printf( "Service Status: %-9s: %-9s: %-9s: %03d\n",
TaskName[Item-1], StatusStr[Status],
ReportStr[Report/256], Report&0xFF );

// Example of adding to the DHCP configuration space
//当使用DHCP客户端,客户端已经完全控制访问第一个256条目CFGTAG SYSINFO空间。
//在这里,我们想要手动添加一个DNS服务器的配置,但是我们只能做一次DHCP完成编程。

if( Item == CFGITEM_SERVICE_DHCPCLIENT &&
Status == CIS_SRV_STATUS_ENABLED &&
(Report == (NETTOOLS_STAT_RUNNING|DHCPCODE_IPADD) ||
Report == (NETTOOLS_STAT_RUNNING|DHCPCODE_IPRENEW)) )
{
IPN IPTmp;

// Manually add the DNS server when specified
IPTmp = inet_addr(DNSServer);
if( IPTmp )
CfgAddEntry( 0, CFGTAG_SYSINFO, CFGITEM_DHCP_DOMAINNAMESERVER,
0, sizeof(IPTmp), (UINT8 *)&IPTmp, 0 );
}
}

所示工程出现的错误不知道是什么原因,工程里面明明定义了相关的函数,句柄什么的~~~新手求指导