• dsp6657的helloworld例程测试-第一篇


    环境搭建可以参考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是一种理念。

  • 相关阅读:
    容器虚拟化之LXC(LinuX Container)
    Twemproxy+Keepalived+Redis
    Haproxy+Keepalived+Nginx
    Redis-sentinel集群
    Server2008r2 指定默认用户自动登录--注册表
    .Net Core应用框架Util介绍(二) 转
    .Net Core应用框架Util介绍(一)转
    一分钟教你知道乐观锁和悲观锁的区别
    设置DataTable行属性
    js中的内置对象
  • 原文地址:https://www.cnblogs.com/429512065qhq/p/8080165.html
Copyright © 2020-2023  润新知