你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【F769IDISCOVERY评测】UCSOIII+LwIP 移植

[复制链接]
creep 提问时间:2017-8-20 18:18 /
       前段时间论坛搞网络的培训移植过LwIP到STM32F769-DISCO,当时的移植并没有添加RTOS,在ST的开发包里面有几个lwip + freertos 的例子,下面分享一个LwIP+UCOSIII 移植的例子,需要的同学可以测试下。


1、硬件初始化的部分


和不带RTOS 相比较,添加了RTOS之后,LAN8742A的接收模式从之前的轮询模式修改为中断接收模式。
  1. <font face="微软雅黑" size="3">EthHandle.Instance = ETH;
  2.     EthHandle.Init.MACAddr = macaddress;
  3.     EthHandle.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE;
  4.     EthHandle.Init.Speed = ETH_SPEED_100M;
  5.     EthHandle.Init.DuplexMode = ETH_MODE_FULLDUPLEX;
  6.     EthHandle.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII;
  7.     EthHandle.Init.RxMode = ETH_RXINTERRUPT_MODE;                       //中断接收模式
  8.     EthHandle.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE;
  9.     EthHandle.Init.PhyAddress = LAN8742A_PHY_ADDRESS;

  10.     /* configure ethernet peripheral (GPIOs, clocks, MAC, DMA) */
  11.     if(HAL_ETH_Init(&EthHandle) == HAL_OK)
  12.     {
  13.         /* Set netif link flag */
  14.         netif->flags |= NETIF_FLAG_LINK_UP;
  15.     }</font>
复制代码


相应的网卡的接收数据也使用一个任务来处理,在这个任务里面我们pend一个任务信号量来处理接收的数据,
  1. <font face="微软雅黑" size="3">void ethernetif_input(void  * p_arg)
  2. {
  3.      OS_ERR   err;
  4.     struct pbuf *p;
  5.     struct netif *netif = (struct netif *) p_arg;
  6.     for(;;)
  7.     {
  8.         OSTaskSemPend(0,OS_OPT_PEND_BLOCKING,0,&err);        
  9.         do
  10.         {
  11.             p = low_level_input(netif);

  12.             if(p != NULL)
  13.             {
  14.                 if(netif->input(p, netif) != ERR_OK)
  15.                 {
  16.                     pbuf_free(p);
  17.                 }
  18.             }
  19.         }
  20.         while(p != NULL);        
  21.     }
  22. }</font>
复制代码
然后在网卡接收中断中post这个任务信号量,这样能高效实时的处理接收的网络数据,这也是RTOS的优势所在。
  1. <font face="微软雅黑" size="3">void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth)
  2. {
  3.     OS_ERR err;
  4.    OSTaskSemPost(ÐRXTASKTCB,OS_OPT_POST_NONE,&err);
  5. }</font>
复制代码
2、软件的移植


  带RTOS 的LWIP 使用的时候要移植一个sys_arch.c 文件中几个函数,这个主要是用于lwip 的信号量转化为ucosiii的信号量。还有一个是用于创建lwip的主线程使用,这里调用的sys_thread_new需要在sys_arch.c中实现。
  1. <font face="微软雅黑" size="3">/**
  2. * @ingroup lwip_os
  3. * Initialize this module:
  4. * - initialize all sub modules
  5. * - start the tcpip_thread
  6. *
  7. * @param initfunc a function to call when tcpip_thread is running and finished initializing
  8. * @param arg argument to pass to initfunc
  9. */
  10. void
  11. tcpip_init(tcpip_init_done_fn initfunc, void *arg)
  12. {
  13.   lwip_init();

  14.   tcpip_init_done = initfunc;
  15.   tcpip_init_done_arg = arg;
  16.   if (sys_mbox_new(&mbox, TCPIP_MBOX_SIZE) != ERR_OK) {
  17.     LWIP_ASSERT("failed to create tcpip_thread mbox", 0);
  18.   }
  19. #if LWIP_TCPIP_CORE_LOCKING
  20.   if (sys_mutex_new(&lock_tcpip_core) != ERR_OK) {
  21.     LWIP_ASSERT("failed to create lock_tcpip_core", 0);
  22.   }
  23. #endif /* LWIP_TCPIP_CORE_LOCKING */

  24.   sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);
  25. }</font>
复制代码


总的来说也就是必须创建2个任务 一个网卡的接收任务,一个是lwip内核的处理任务。


3、添加几个测试任务


为了测试移植的效果我添加4个通信任务:
1) TCP任务:电脑作为服务器,开发板作为客户端。开发板连上服务器后主动循环发送测试数据。
2)UDP任务: 开发板连上电脑后,将电脑通过UDP发送给开发板的数据原封不动的返回给电脑。
3)开发板高速虚拟串口:连上电脑后主动发送数据数据到电脑
4)stlink虚拟串口:将开发板的串口通过stlink发送数据给电脑


几个任务代码:
  1. <font face="微软雅黑" size="3">  //USB_VCP
  2.            OSTaskCreate((OS_TCB         * )&USBVCPTASKTCB,               
  3.                 (CPU_CHAR        * )"USB_VCP_task",                
  4.                  (OS_TASK_PTR )USB_VCP_Test,                        
  5.                  (void                * )0,                                       
  6.                  (OS_PRIO          )USB_VCP_TASK_PRIO,            
  7.                  (CPU_STK   * )&USB_VCP_TASK_STK[0],       
  8.                  (CPU_STK_SIZE)USB_VCP_STK_SIZE/10,       
  9.                  (CPU_STK_SIZE)USB_VCP_STK_SIZE,               
  10.                  (OS_MSG_QTY  )0,                                       
  11.                  (OS_TICK          )0,                                       
  12.                  (void           * )0,                               
  13.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP,
  14.                  (OS_ERR         * )&err);  
  15.                  
  16.    //eth_rx
  17.                  
  18.            OSTaskCreate((OS_TCB         * )ÐRXTASKTCB,               
  19.                 (CPU_CHAR        * )"ETH_RX_task",                
  20.                  (OS_TASK_PTR )ethernetif_input,                        
  21.                  (void                * )&gnetif,                                       
  22.                  (OS_PRIO          )ETH_RX_TASK_PRIO,            
  23.                  (CPU_STK   * )Ð_RX_TASK_STK[0],       
  24.                  (CPU_STK_SIZE)ETH_RX_STK_SIZE/10,       
  25.                  (CPU_STK_SIZE)ETH_RX_STK_SIZE,               
  26.                  (OS_MSG_QTY  )0,                                       
  27.                  (OS_TICK          )0,                                       
  28.                  (void           * )0,                               
  29.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP,
  30.                  (OS_ERR         * )&err);  


  31.     tcpip_init(NULL, NULL);

  32.    
  33.            OSTaskCreate((OS_TCB         * )&TCPCLIENTTASKTCB,               
  34.                 (CPU_CHAR        * )"tcp_client_task",                
  35.                  (OS_TASK_PTR )tcp_client_thread,                        
  36.                  (void                * )0,                                       
  37.                  (OS_PRIO          )TCP_CLIENT_TASK_PRIO,            
  38.                  (CPU_STK   * )&TCP_CLIENT_TASK_STK[0],       
  39.                  (CPU_STK_SIZE)TCP_CLIENT_STK_SIZE/10,       
  40.                  (CPU_STK_SIZE)TCP_CLIENT_STK_SIZE,               
  41.                  (OS_MSG_QTY  )0,                                       
  42.                  (OS_TICK          )0,                                       
  43.                  (void           * )0,                               
  44.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP,
  45.                  (OS_ERR         * )&err);     

  46.   //´
  47.              OSTaskCreate((OS_TCB         * )&UDPSERVERASKTCB,               
  48.                 (CPU_CHAR        * )"udp_server_task",                
  49.                  (OS_TASK_PTR )udp_server_thread,                        
  50.                  (void                * )0,                                       
  51.                  (OS_PRIO          )UDP_SERVER_TASK_PRIO,            
  52.                  (CPU_STK   * )&UDP_SERVER_TASK_STK[0],       
  53.                  (CPU_STK_SIZE)UDP_SERVER_STK_SIZE/10,       
  54.                  (CPU_STK_SIZE)UDP_SERVER_STK_SIZE,               
  55.                  (OS_MSG_QTY  )0,                                       
  56.                  (OS_TICK          )0,                                       
  57.                  (void           * )0,                               
  58.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP,
  59.                  (OS_ERR         * )&err);  </font>
复制代码
运行是下面的这样子:


TIM截图20170820153801.png


4个通信任务动态运行如下:


test.gif




关于UCOSIII的移植和LwIP的详细使用可以参考之前的帖子。测试代码非常简陋,不合理的地方在所难免,实际使用时请完善。
  


测试代码:
UCOSIII LwIP.rar (5.73 MB, 下载次数: 68)

评分

参与人数 1 ST金币 +20 收起 理由
zero99 + 20

查看全部评分

收藏 2 评论9 发布时间:2017-8-20 18:18

举报

9个回答
Paderboy 回答时间:2017-8-20 19:07:44
学习了。。。。顶起
Stm32McuLover 回答时间:2017-8-20 20:51:51
学习了。。。。顶起
zero99 回答时间:2017-8-21 08:51:19
creep 回答时间:2017-8-21 09:15:00
zero99 发表于 2017-8-21 08:51
谢谢支持,加到汇总贴了  https://www.stmcu.org.cn/module/forum/thread-609491-1-1.html

风子 回答时间:2017-8-21 09:44:41
大神的帖子含精量妥妥的
辉常可乐 回答时间:2017-8-21 10:35:25
谢谢分享
zero99 回答时间:2017-8-21 13:46:26
风子 发表于 2017-8-21 09:44
大神的帖子含精量妥妥的

难得冒个泡啊
jcx0324 回答时间:2017-8-22 10:02:23
好贴,赞一个            
w014017 回答时间:2019-9-13 20:13:09
谢谢分享!!

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版