查看: 1810|回复: 0

CCS+C6678LE以太网接口测试示例代码

[复制链接]

该用户从未签到

发表于 2020-11-16 19:44:36 | 显示全部楼层 |阅读模式
分享到:

为了方便贴代码,将原始实例的代码做了精简;

为了探索其原理,修改/添加了少量代码。

主要代码如下#include <stdio.h>

  1. <p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "=""></font></font></p><p style="line-height: 28px;"><font color="rgb(51, 51, 51)"><font face="" "="">#include <ti/ndk/inc/netmain.h>
  2. #include <ti/sysbios/BIOS.h>
  3. #include <ti/sysbios/knl/Task.h>
  4. #include <xdc/runtime/Error.h>
  5. #include <xdc/runtime/System.h>
  6. #include "ti/platform/platform.h"
  7. #include "ti/platform/resource_mgr.h"

  8. static int counter=0;
  9. static HANDLE hHello=0;
  10. char *HostName    = "TMS320C6678";
  11. char *LocalIPAddr = "169.254.11.119";   // My PC Local IP
  12. char *LocalIPMask = "255.255.255.0";    // Not used when using DHCP
  13. char *GatewayIP   = "192.168.2.101";    // Not used when using DHCP
  14. char *DomainName  = "demo.net";         // Not used when using DHCP
  15. char *DNSServer   = "0.0.0.0";          // Used when set to anything but zero
  16. Uint8 clientMACAddress[6] = {0x01, 0x02, 0x03, 0x04, 0x0C, 0xEF}; /* MAC Addr */


  17. static void   NetworkOpen();
  18. static void   NetworkClose();
  19. static void   NetworkIPAddr(IPN IPAddr, uint IfIdx, uint fAdd);
  20. extern int    dtask_udp_hello();

  21. void EVM_init()
  22. {
  23.     printf("\nEVM_Init()\n");
  24.     platform_init_flags   sFlags;
  25.     platform_init_config  sConfig;
  26.     memset( (void *) &sFlags,  0, sizeof(platform_init_flags));
  27.     memset( (void *) &sConfig, 0, sizeof(platform_init_config));
  28.     sFlags.pll  = 0;  /* PLLs for clocking  */
  29.     sFlags.ddr  = 0;  /* External memory    */
  30.     sFlags.tcsl = 1;  /* Time stamp counter */
  31.     sFlags.phy  = 1;  /* Ethernet           */
  32.     sFlags.ecc  = 0;  /* Memory ECC         */
  33.     sConfig.pllm = 0; /* Use libraries default clock divisor */
  34.     platform_init(&sFlags, &sConfig);
  35. }

  36. Void Hello(UArg arg0, UArg arg1)
  37. {
  38.     while(1)
  39.     {
  40.         printf("Hello\n");
  41.         Task_sleep(2000);
  42.         if(counter>=3) break;
  43.     }
  44. }

  45. Void Test(UArg arg0,UArg arg1);

  46. int main()
  47. {
  48.     Task_Handle task1 = Task_create(Test, NULL, NULL);
  49.     Task_Handle task2 = Task_create(Hello, NULL, NULL);
  50.     if (task1==NULL || task2==NULL)
  51.     {
  52.         printf("Task_create() failed!\n");
  53.         BIOS_exit(0);
  54.     }
  55.     BIOS_start();
  56. }

  57. Void Test(UArg arg0,UArg arg1)
  58. {
  59.         QMSS_CFG_T qmss_cfg;
  60.         CPPI_CFG_T cppi_cfg;

  61.         uint32_t coreID = platform_get_coreid();
  62.         uint32_t master=(coreID==0)?1:0;

  63.         qmss_cfg.master_core = master;
  64.         qmss_cfg.max_num_desc = MAX_NUM_DESC;
  65.         qmss_cfg.desc_size = MAX_DESC_SIZE;
  66.         qmss_cfg.mem_region = Qmss_MemRegion_MEMORY_REGION0;

  67.         cppi_cfg.master_core = master;
  68.         cppi_cfg.dma_num = Cppi_CpDma_PASS_CPDMA;
  69.         cppi_cfg.num_tx_queues = NUM_PA_TX_QUEUES;
  70.         cppi_cfg.num_rx_channels = NUM_PA_RX_CHANNELS;

  71.         res_mgr_init_qmss(&qmss_cfg);
  72.         res_mgr_init_cppi(&cppi_cfg);
  73.         res_mgr_init_pass();


  74.         int rc = NC_SystemOpen( NC_PRIORITY_LOW, NC_OPMODE_INTERRUPT );
  75.         if( rc!=0 )
  76.         {
  77.             NC_SystemClose();
  78.             return;
  79.         }

  80.         HANDLE hCfg = CfgNew();
  81.         if( !hCfg )
  82.         {
  83.             NC_SystemClose();
  84.             return;
  85.         }
  86.         CfgAddEntry( hCfg,CFGTAG_SYSINFO,CFGITEM_DHCP_HOSTNAME,0,strlen(HostName),(UINT8*)HostName,0);

  87.     CI_IPNET NA;
  88.     bzero( &NA, sizeof(NA) );
  89.     NA.IPAddr  = inet_addr(LocalIPAddr);
  90.     NA.IPMask  = inet_addr(LocalIPMask);
  91.     strcpy( NA.Domain, DomainName );
  92.     NA.NetType = 0;
  93.         CfgAddEntry( hCfg, CFGTAG_IPNET, 1, 0,sizeof(CI_IPNET), (UINT8 *)&NA, 0 );

  94.     CI_ROUTE RT;
  95.     bzero( &RT, sizeof(RT) );
  96.     RT.IPDestAddr = 0;
  97.     RT.IPDestMask = 0;
  98.     RT.IPGateAddr = inet_addr(GatewayIP);
  99.     CfgAddEntry( hCfg, CFGTAG_ROUTE, 0, 0,sizeof(CI_ROUTE), (UINT8 *)&RT, 0 );

  100.     IPN IPTmp = inet_addr(DNSServer);
  101.     if( IPTmp )
  102.     {
  103.         CfgAddEntry( hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_DOMAINNAMESERVER,0, sizeof(IPTmp), (UINT8 *)&IPTmp, 0 );
  104.     }

  105.         rc = DBG_WARN;
  106.         CfgAddEntry(hCfg,CFGTAG_OS,CFGITEM_OS_DBGPRINTLEVEL,CFG_ADDMODE_UNIQUE, sizeof(uint),(UINT8 *)&rc,0);

  107.         rc = 8192;
  108.         CfgAddEntry(hCfg,CFGTAG_IP,CFGITEM_IP_SOCKUDPRXLIMIT,CFG_ADDMODE_UNIQUE,sizeof(uint),(UINT8 *)&rc,0);

  109.         do
  110.         {
  111.             rc = NC_NetStart( hCfg, NetworkOpen, NetworkClose, NetworkIPAddr );
  112.         } while( rc > 0 );

  113.         CfgFree( hCfg );

  114.         NC_SystemClose();
  115. }

  116. static void NetworkOpen()
  117. {
  118.         hHello = DaemonNew( SOCK_DGRAM,0,7,dtask_udp_hello,OS_TASKPRINORM,OS_TASKSTKNORM,0,1);
  119. }

  120. static void NetworkClose()
  121. {
  122.         DaemonFree( hHello );
  123. }

  124. static void NetworkIPAddr( IPN IPAddr, uint IfIdx, uint fAdd )
  125. {
  126.         IPN IPTmp;
  127.         if( fAdd )  printf("Network Added: ");
  128.         else  printf("Network Removed: ");
  129.         IPTmp = ntohl( IPAddr );
  130.         printf("If-%d:%d.%d.%d.%d\n", IfIdx,
  131.             (UINT8)(IPTmp>>24)&0xFF,(UINT8)(IPTmp>>16)&0xFF,
  132.             (UINT8)(IPTmp>>8)&0xFF, (UINT8)IPTmp&0xFF );
  133. }

  134. int dtask_udp_hello( SOCKET s, UINT32 unused )
  135. {
  136.     printf("TASK execution %d\n",++counter);

  137.         (void)unused;

  138.         struct timeval tv;
  139.         tv.tv_sec  = 3;
  140.         tv.tv_usec = 0;
  141.         setsockopt(s,SOL_SOCKET,SO_SNDTIMEO,&tv,sizeof(tv));
  142.         setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv));

  143.         struct sockaddr_in sin1;
  144.         int sz=sizeof(sin1);
  145.         int recvSize;
  146.         HANDLE hBuffer;
  147.         unsigned char* pBuf;
  148.         while(1)
  149.         {
  150.             recvSize=recvncfrom( s, (void**)&pBuf, 0, (PSA)&sin1, &sz, &hBuffer );
  151.             if(recvSize<=0) break;
  152.             sendto( s, pBuf, recvSize, 0, (PSA)&sin1, sz );
  153.             recvncfree( hBuffer );
  154.         }

  155.         // Since the socket is still open, return "1"
  156.         // (we need to leave UDP sockets open)
  157.         return 1;
  158. }</font></font></p>
复制代码

其中EVM_init()函数被设置为在main()函数之前执行,具体设置在一个*.cfg文件中,

部分内容如下

  1. var Memory  =   xdc.useModule('xdc.runtime.Memory');
  2. var BIOS    =   xdc.useModule('ti.sysbios.BIOS');
  3. var Task    =   xdc.useModule('ti.sysbios.knl.Task');
  4. var HeapBuf =   xdc.useModule('ti.sysbios.heaps.HeapBuf');
  5. var Log     =   xdc.useModule('xdc.runtime.Log');
  6. //...省略...
  7. Program.sectMap["sharedL2"] = "DDR3";
  8. Program.sectMap["systemHeap"] = "DDR3";
  9. Program.sectMap[".sysmem"]  = "DDR3";
  10. Program.sectMap[".args"]    = "DDR3";
  11. Program.sectMap[".cio"]     = "DDR3";
  12. Program.sectMap[".far"]     =     "DDR3";
  13. Program.sectMap[".rodata"]     =     "DDR3";
  14. Program.sectMap[".neardata"]     =     "DDR3";
  15. //...省略...
  16. Startup.lastFxns.$add('&EVM_init');
  17. BIOS.taskEnabled            =   true;

  18. Ecm.eventGroupHwiNum[0] = 7;
  19. Ecm.eventGroupHwiNum[1] = 8;
  20. Ecm.eventGroupHwiNum[2] = 9;
  21. Ecm.eventGroupHwiNum[3] = 10;
  22. Global.IPv6 = true;
复制代码

注意其中的

  1. Startup.lastFxns.$add('&EVM_init');
复制代码


在主函数中执行BIOS_start()会完成一些主动操作

(似乎是因为main函数在DSP中的地位和在PC上不一样)

总之,在执行完EVM_init()完成基本的初始化后,创建我们的主要任务:

  1. Task_Handle task1 = Task_create(Test, NULL, NULL);
  2. Task_Handle task2 = Task_create(Hello, NULL, NULL);
复制代码


其中Hello任务只是为了演示一下,每隔2秒(sleep(2000))打印一个“Hello”字样
而Test任务则执行了QMSS、CPPI、PA等等的初始化,完成了基本网络配置

启动Network服务后,关联了dtask_udp_hello任务,等待以太网接口的连接

另一边使用PC执行测试,发送字符串进行交互。


因为我们的程序中设置了一个计数器counter

每次发送一个字符串,dtask_udp_hello()就执行一次,counter++

在Hello任务中,一旦发现条件counter>=3满足了就会退出while()循环,它的使命也就终结了

(注意并不是真的终结,因为没有执行KillTask这样的命令,只是Hello任务不再执行任何操作罢了)

这样只剩下Test任务独自运行了

某次测试如下

8.jpg


回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /1 下一条



手机版|小黑屋|与非网

GMT+8, 2024-6-12 03:53 , Processed in 0.103316 second(s), 15 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.