搜索
查看: 3653|回复: 9

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

[复制链接]

该用户从未签到

60

主题

2111

帖子

31

蝴蝶豆

版主

最后登录
2023-6-21
发表于 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, 下载次数: 63)

评分

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

查看全部评分

回复

使用道具 举报

该用户从未签到

47

主题

3456

帖子

30

蝴蝶豆

版主

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

使用道具 举报

该用户从未签到

64

主题

809

帖子

23

蝴蝶豆

实习版主

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

使用道具 举报

  • TA的每日心情
    开心
    2018-2-6 09:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    1182

    主题

    4967

    帖子

    1

    蝴蝶豆

    论坛元老

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

    使用道具 举报

    该用户从未签到

    60

    主题

    2111

    帖子

    31

    蝴蝶豆

    版主

    最后登录
    2023-6-21
     楼主| 发表于 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

    主题

    1276

    帖子

    0

    蝴蝶豆

    论坛元老

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

    使用道具 举报

    该用户从未签到

    1

    主题

    2

    帖子

    0

    蝴蝶豆

    初级会员

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

    使用道具 举报

  • TA的每日心情
    开心
    2018-2-6 09:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    1182

    主题

    4967

    帖子

    1

    蝴蝶豆

    论坛元老

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

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

    使用道具 举报

    该用户从未签到

    14

    主题

    726

    帖子

    29

    蝴蝶豆

    金牌会员

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

    使用道具 举报

    该用户从未签到

    3

    主题

    571

    帖子

    2

    蝴蝶豆

    金牌会员

    最后登录
    2021-4-24
    发表于 2019-9-13 20:13:09 | 显示全部楼层
    谢谢分享!!
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

    GMT+8, 2024-4-20 00:26 , Processed in 0.215646 second(s), 47 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表