环境搭建可以参考http://blog.sina.com.cn/s/blog_ed2e19900102xi2j.html
1. 先从mcsdk导入工程,helloworld例程
2. 提示有错误,估计是库找不到的原因。
3. 打开CCS的配置页面,add加入需要的库,分别是NDK,PDK,其中NDK就是网络Network Developer's Kit开发包,如果CCS添加NDK失败的话,可能是NDK的版本太旧了,去下载个新的,下载地址:http://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/ndk/index.html,自己选个版本即可
4. 看下工程源码,其实想找个简单的入门例程研究,可惜找了个网络TCP/IP协议栈的,研究研究吧
/* * helloWorld_bios6.c * TCP/IP Stack 'Hello World!' Example ported to use BIOS6 OS. */ //-------------------------------------------------------------------------- // IP Stack 'Hello World!' Example // To test it as is, use with helloWorld.exe from winapps directory // #include <stdio.h> #include <ti/ndk/inc/netmain.h> /* BIOS6 include */ #include <ti/sysbios/BIOS.h> /* Platform utilities include */ #include "ti/platform/platform.h" #include "ti/platform/resource_mgr.h" /* Platform Information - we will read it form the Platform Library */ platform_info gPlatformInfo; //--------------------------------------------------------------------------- // Title String // char *VerStr = " TCP/IP Stack 'Hello World!' Application "; // Our NETCTRL callback functions static void NetworkOpen(); static void NetworkClose(); static void NetworkIPAddr( IPN IPAddr, uint IfIdx, uint fAdd ); // Fun reporting function static void ServiceReport( uint Item, uint Status, uint Report, HANDLE hCfgEntry ); // External references extern int dtask_udp_hello(); //--------------------------------------------------------------------------- // Configuration // char *HostName = "tidsp"; char *LocalIPAddr = "192.168.2.100"; char *LocalIPMask = "255.255.255.0"; // Not used when using DHCP char *GatewayIP = "192.168.2.101"; // 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 /************************************************************************* * @b EVM_init() * * @n * * Initializes the platform hardware. This routine is configured to start in * the evm.cfg configuration file. It is the first routine that BIOS * calls and is executed before Main is called. If you are debugging within * CCS the default option in your target configuration file may be to execute * all code up until Main as the image loads. To debug this you should disable * that option. * * @param[in] None * * @retval * None ************************************************************************/ void EVM_init() { int i; platform_init_flags sFlags; platform_init_config sConfig; /* Status of the call to initialize the platform */ Int32 pform_status; /* Platform Information - we will read it form the Platform Library */ platform_info sPlatformInfo; /* * You can choose what to initialize on the platform by setting the following * flags. We will initialize everything. */ memset( (void *) &sFlags, 0, sizeof(platform_init_flags)); memset( (void *) &sConfig, 0, sizeof(platform_init_config)); sFlags.pll = 0; sFlags.ddr = 0; sFlags.tcsl = 0; /* Time stamp counter */ sFlags.phy = 1; /* Ethernet */ sFlags.ecc = 0; sConfig.pllm = 0; pform_status = platform_init(&sFlags, &sConfig); /* If we initialized the platform okay */ if (pform_status == Platform_EOK) { /* Get information about the platform so we can use it in various places */ memset( (void *) &sPlatformInfo, 0, sizeof(platform_info)); (void) platform_get_info(&sPlatformInfo); } else { /* Intiialization of the platform failed... die */ printf("Platform failed to initialize. Error code %d ", pform_status); printf("We will die in an infinite loop... "); while (1) { (void) platform_led(1, PLATFORM_LED_ON, (LED_CLASS_E) PLATFORM_USER_LED_CLASS); (void) platform_delay(50000); (void) platform_led(1, PLATFORM_LED_OFF, (LED_CLASS_E) PLATFORM_USER_LED_CLASS); (void) platform_delay(50000); }; } platform_write_configure(PLATFORM_WRITE_PRINTF); platform_uart_init(); platform_uart_set_baudrate(19200); /* Check to see that we are running on the Master Core */ if (platform_get_coreid() != 0) { /* We are not on the Master Core... die */ printf("You must run this application on Core 0. "); printf("We will die in an infinite loop... "); while (1) { (void) platform_led(1, PLATFORM_LED_ON, (LED_CLASS_E) PLATFORM_USER_LED_CLASS); (void) platform_delay(50000); (void) platform_led(1, PLATFORM_LED_OFF, (LED_CLASS_E) PLATFORM_USER_LED_CLASS); (void) platform_delay(50000); }; } /* Clear the state of the LEDs to OFF */ for (i=0; i < sPlatformInfo.led[1].count; i++) { platform_led(i, PLATFORM_LED_OFF, (LED_CLASS_E) PLATFORM_USER_LED_CLASS); } return; } //--------------------------------------------------------------------- // Main Entry Point //--------------------------------------------------------------------- int main() { /* Start the BIOS 6 Scheduler */ BIOS_start (); } // // Main Thread // int StackTest() { int rc; int i; HANDLE hCfg; // // THIS MUST BE THE ABSOLUTE FIRST THING DONE IN AN APPLICATION before // using the stack!! // rc = NC_SystemOpen( NC_PRIORITY_LOW, NC_OPMODE_INTERRUPT ); if( rc ) { platform_write("NC_SystemOpen Failed (%d) ",rc); for(;;); } // Print out our banner platform_write(VerStr); // // Create and build the system configuration from scratch. // // Create a new configuration hCfg = CfgNew(); if( !hCfg ) { platform_write("Unable to create configuration "); goto main_exit; } // We better validate the length of the supplied names if( strlen( DomainName ) >= CFG_DOMAIN_MAX || strlen( HostName ) >= CFG_HOSTNAME_MAX ) { printf("Names too long "); goto main_exit; } // 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 ); // If the IP address is specified, manually configure IP and Gateway if (!platform_get_switch_state(1)) { CI_IPNET NA; CI_ROUTE RT; IPN IPTmp; // Setup manual IP address bzero( &NA, sizeof(NA) ); NA.IPAddr = inet_addr(LocalIPAddr); NA.IPMask = inet_addr(LocalIPMask); strcpy( NA.Domain, DomainName ); NA.NetType = 0; // Add the address to interface 1 CfgAddEntry( hCfg, CFGTAG_IPNET, 1, 0, sizeof(CI_IPNET), (UINT8 *)&NA, 0 ); // Add the default gateway. Since it is the default, the // destination address and mask are both zero (we go ahead // and show the assignment for clarity). bzero( &RT, sizeof(RT) ); RT.IPDestAddr = 0; RT.IPDestMask = 0; RT.IPGateAddr = inet_addr(GatewayIP); // Add the route CfgAddEntry( hCfg, CFGTAG_ROUTE, 0, 0, sizeof(CI_ROUTE), (UINT8 *)&RT, 0 ); // Manually add the DNS server when specified IPTmp = inet_addr(DNSServer); if( IPTmp ) CfgAddEntry( hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_DOMAINNAMESERVER, 0, sizeof(IPTmp), (UINT8 *)&IPTmp, 0 ); } // Else we specify DHCP 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; CfgAddEntry( hCfg, CFGTAG_SERVICE, CFGITEM_SERVICE_DHCPCLIENT, 0, sizeof(dhcpc), (UINT8 *)&dhcpc, 0 ); } // // Configure IPStack/OS Options // // We don't want to see debug messages less than WARNINGS rc = DBG_WARN; CfgAddEntry( hCfg, CFGTAG_OS, CFGITEM_OS_DBGPRINTLEVEL, CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 ); // // This code sets up the TCP and UDP buffer sizes // (Note 8192 is actually the default. This code is here to // illustrate how the buffer and limit sizes are configured.) // // UDP Receive limit rc = 8192; CfgAddEntry( hCfg, CFGTAG_IP, CFGITEM_IP_SOCKUDPRXLIMIT, CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 ); // // Boot the system using this configuration // // 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 ); // Delete Configuration CfgFree( hCfg ); // Close the OS main_exit: NC_SystemClose(); return(0); } // // System Task Code [ Server Daemon Servers ] // static HANDLE hHello=0; // // NetworkOpen // // This function is called after the configuration has booted // static void NetworkOpen() { // Create our local server hHello = DaemonNew( SOCK_DGRAM, 0, 7, dtask_udp_hello, OS_TASKPRINORM, OS_TASKSTKNORM, 0, 1 ); } // // NetworkClose // // This function is called when the network is shutting down, // or when it no longer has any IP addresses assigned to it. // static void NetworkClose() { DaemonFree( hHello ); } // // NetworkIPAddr // // This function is called whenever an IP address binding is // added or removed from the system. // static void NetworkIPAddr( IPN IPAddr, uint IfIdx, uint fAdd ) { IPN IPTmp; if( fAdd ) printf("Network Added: "); else printf("Network Removed: "); // Print a message IPTmp = ntohl( IPAddr ); printf("If-%d:%d.%d.%d.%d ", IfIdx, (UINT8)(IPTmp>>24)&0xFF, (UINT8)(IPTmp>>16)&0xFF, (UINT8)(IPTmp>>8)&0xFF, (UINT8)IPTmp&0xFF ); } // // 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 ", TaskName[Item-1], StatusStr[Status], ReportStr[Report/256], Report&0xFF ); // // Example of adding to the DHCP configuration space // // When using the DHCP client, the client has full control over access // to the first 256 entries in the CFGTAG_SYSINFO space. // // Note that the DHCP client will erase all CFGTAG_SYSINFO tags except // CFGITEM_DHCP_HOSTNAME. If the application needs to keep manual // entries in the DHCP tag range, then the code to maintain them should // be placed here. // // Here, we want to manually add a DNS server to the configuration, but // we can only do it once DHCP has finished its programming. // 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 ); } }
5. 刚开始这些代码看的不是很明白。main函数里面为啥只有一个BIOS_start();函数?不是应该创建任务之类的?
1 int main() 2 { 3 /* Start the BIOS 6 Scheduler */ 4 BIOS_start (); 5 }
6. 下面函数怎么运行的?
1 int StackTest()
7. 是不是BIOS的图形配置界面搞定的?去看下图形配置界面。图形配置界面应该有个.tcf文件,但是工程没找到?
8. 下面的是使用协议栈必须首先调用的函数
1 rc = NC_SystemOpen( NC_PRIORITY_LOW, NC_OPMODE_INTERRUPT );
9. 接着是配置网络参数的函数
CfgAddEntry( hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_HOSTNAME, 0, strlen(HostName), (UINT8 *)HostName, 0 );
10. 这次疑问很多,RTSC是德州仪器提出的嵌入式组件,我理解就是把代码模块化,这个模块化的工作交给CCS去管理,比如需要一个ADC模块,在CCS里面配置就可以,CCS会把代码加入你的工程,XDCTools 是完成上面的工具,RTSC是一种理念。