OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3975|回复: 4

STM32F7+FreeRTOS(多任务)+LWIP 多任务后ping不通

[复制链接]

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-4-15
在线时间
12 小时
发表于 2021-3-29 10:13:56 | 显示全部楼层 |阅读模式
1金钱
各位大佬,您好!
目前我用的是STM32F767 + FreeRTOS + LWIP 用CubeMX+CubeIDE去开发多线程的工程,目前有MainTask任务,CANTask任务 + Net收发任务。所有任务内,都为空,没有具体处理逻辑。
每个任务抢占式,执行周期为定时器周期释放对应相关信号量,不存在任务内超周期运行。
目前遇到的问题是
1. 当工程仅存在一个Net任务时(Net任务为手写, 内部逻辑仅存在点灯,其他任何逻辑没有,周期为10ms一次),正常ping通没问题,Net任务正常。
2. 当工程存在两个任务,一个Net任务同上,另一个MainTask任务开启,(内部逻辑仅点灯,周期10ms一次或者20ms都可以),这个时候,Net本身任务和Main任务都可以正常跑,数据打印很正常。
    但是!!!!!!!!无法ping通!!!!!!
3. 中断优先级Net 5 > 其他中断(CAN 8,定时器10等)
4. 任务优先级 Net > 其他任务。
5. 打断点之后进去相互比较,发现能ping通的任务可以进到这里。while (((heth->RxDesc->Status & ETH_DMARXDESC_OWN) == (uint32_t)RESET) && (descriptorscancounter < ETH_RXBUFNB)),可以进去内部。
    但是不能ping通的,无法满足while成立条件,进不去内部。所以,小弟是在想不明白为什么会这样。请各位大佬指导一下!万分感谢!!!QQ 809485914!!!!x谢谢!!!

  此文件API位置:Drivers\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_eth.c
    HAL_StatusTypeDef HAL_ETH_GetReceivedFrame_IT(ETH_HandleTypeDef *heth)
{
  uint32_t descriptorscancounter = 0;

  /* Process Locked */
  __HAL_LOCK(heth);

  /* Set ETH HAL State to BUSY */
  heth->State = HAL_ETH_STATE_BUSY;

  /* Scan descriptors owned by CPU */
  while (((heth->RxDesc->Status & ETH_DMARXDESC_OWN) == (uint32_t)RESET) && (descriptorscancounter < ETH_RXBUFNB))
  {
    /* Just for security */
    descriptorscancounter++;

    /* Check if first segment in frame */
    /* ((heth->RxDesc->Status & ETH_DMARXDESC_FS) != (uint32_t)RESET) && ((heth->RxDesc->Status & ETH_DMARXDESC_LS) == (uint32_t)RESET)) */  
    if((heth->RxDesc->Status & (ETH_DMARXDESC_FS | ETH_DMARXDESC_LS)) == (uint32_t)ETH_DMARXDESC_FS)
    {
      heth->RxFrameInfos.FSRxDesc = heth->RxDesc;
      heth->RxFrameInfos.SegCount = 1;   
      /* Point to next descriptor */
      heth->RxDesc = (ETH_DMADescTypeDef*) (heth->RxDesc->Buffer2NextDescAddr);
    }
    /* Check if intermediate segment */
    /* ((heth->RxDesc->Status & ETH_DMARXDESC_LS) == (uint32_t)RESET)&& ((heth->RxDesc->Status & ETH_DMARXDESC_FS) == (uint32_t)RESET)) */
    else if ((heth->RxDesc->Status & (ETH_DMARXDESC_LS | ETH_DMARXDESC_FS)) == (uint32_t)RESET)
    {
      /* Increment segment count */
      (heth->RxFrameInfos.SegCount)++;
      /* Point to next descriptor */
      heth->RxDesc = (ETH_DMADescTypeDef*)(heth->RxDesc->Buffer2NextDescAddr);
    }
    /* Should be last segment */
    else
    {
      /* Last segment */
      heth->RxFrameInfos.LSRxDesc = heth->RxDesc;

      /* Increment segment count */
      (heth->RxFrameInfos.SegCount)++;

      /* Check if last segment is first segment: one segment contains the frame */
      if ((heth->RxFrameInfos.SegCount) == 1)
      {
        heth->RxFrameInfos.FSRxDesc = heth->RxDesc;
      }

      /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */
      heth->RxFrameInfos.length = (((heth->RxDesc)->Status & ETH_DMARXDESC_FL) >> ETH_DMARXDESC_FRAMELENGTHSHIFT) - 4;

      /* Get the address of the buffer start address */
      heth->RxFrameInfos.buffer =((heth->RxFrameInfos).FSRxDesc)->Buffer1Addr;

      /* Point to next descriptor */      
      heth->RxDesc = (ETH_DMADescTypeDef*) (heth->RxDesc->Buffer2NextDescAddr);

      /* Set HAL State to Ready */
      heth->State = HAL_ETH_STATE_READY;

      /* Process Unlocked */
      __HAL_UNLOCK(heth);

      /* Return function status */
      return HAL_OK;
    }
  }

  /* Set HAL State to Ready */
  heth->State = HAL_ETH_STATE_READY;

  /* Process Unlocked */
  __HAL_UNLOCK(heth);

  /* Return function status */
  return HAL_ERROR;
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-4-15
在线时间
12 小时
 楼主| 发表于 2021-3-29 10:27:29 | 显示全部楼层
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3583
金钱
3583
注册时间
2019-8-14
在线时间
1052 小时
发表于 2021-3-29 12:08:58 | 显示全部楼层
帮顶~~
回复

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-4-15
在线时间
12 小时
 楼主| 发表于 2021-3-29 13:48:06 | 显示全部楼层

能给点建议嘛?万分感谢呀~
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2021-3-31 11:53:15 | 显示全部楼层
我用的stm32f407的时候,是串口2有引脚与网口冲突了,导致的这个问题,你可能需要查一下是否有引脚重用了
茵茵猪头
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 12:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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