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

查看: 2439|回复: 9

[STM32F769-DISC] 【F769IDISCOVERY评测】UCSOIII+LwIP 移植

[复制链接]

60

主题

2051

回帖

31

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2017-8-20 18:18:15 | 显示全部楼层 |阅读模式
       前段时间论坛搞网络的培训移植过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, 下载次数: 57)

评分

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

查看全部评分

<
回复

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
发表于 2017-8-20 19:07:44 | 显示全部楼层
学习了。。。。顶起
回复 支持 反对

使用道具 举报

64

主题

744

回帖

23

蝴蝶豆

实习版主

最后登录
2020-12-8
发表于 2017-8-20 20:51:51 | 显示全部楼层
学习了。。。。顶起
回复 支持 反对

使用道具 举报

1182

主题

3785

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-3-17
发表于 2017-8-21 08:51:19 | 显示全部楼层
回复 支持 反对

使用道具 举报

60

主题

2051

回帖

31

蝴蝶豆

版主

最后登录
2020-12-9
 楼主| 发表于 2017-8-21 09:15:00 | 显示全部楼层
zero99 发表于 2017-8-21 08:51
谢谢支持,加到汇总贴了  https://www.stmcu.org.cn/module/forum/thread-609491-1-1.html

回复 支持 反对

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
发表于 2017-8-21 09:44:41 | 显示全部楼层
大神的帖子含精量妥妥的
回复 支持 反对

使用道具 举报

1

主题

1

回帖

0

蝴蝶豆

初级会员

最后登录
2017-11-28
发表于 2017-8-21 10:35:25 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

1182

主题

3785

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-3-17
发表于 2017-8-21 13:46:26 | 显示全部楼层
风子 发表于 2017-8-21 09:44
大神的帖子含精量妥妥的

难得冒个泡啊
回复 支持 反对

使用道具 举报

14

主题

712

回帖

29

蝴蝶豆

金牌会员

最后登录
2020-4-19
发表于 2017-8-22 10:02:23 | 显示全部楼层
好贴,赞一个            
回复 支持 反对

使用道具 举报

3

主题

488

回帖

2

蝴蝶豆

金牌会员

最后登录
2020-12-9
发表于 2019-9-13 20:13:09 | 显示全部楼层
谢谢分享!!
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版