硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2468|回复: 18
收起左侧

[以太网] NUCLEO - H743ZI 网络问题 Niche Stack ucos ii Freertos

[复制链接]

9

主题

62

回帖

89

积分

初级会员

积分
89
发表于 2019-1-14 09:50:28 | 显示全部楼层 |阅读模式
本帖最后由 songwenshuai 于 2021-4-25 07:32 编辑

删帖
Ping TIME.png

ETH RCV.SVDat

649.83 KB, 下载次数: 1

回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
发表于 2019-1-14 20:58:40 | 显示全部楼层
直接使用 cubemx 生成就行,再参考一下挣点银子的 历程修改一下就可以了,st官方 也有 freertos + lwip 的例子
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2019-1-15 00:51:19 | 显示全部楼层
H7搞网络协议栈注意此问题:

特别注意,务必是SCB_CleanInvalidateDCache测试

STM32H7提供的一堆lwip例子,仅需在函数low_level_output发送前加个SCB_CleanInvalidateDCache就正常了
http://www.armbbs.cn/forum.ph ... id=89873&fromuid=58
(出处: 安富莱电子论坛)
回复

使用道具 举报

9

主题

62

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2019-1-15 14:10:40 | 显示全部楼层
eric2013 发表于 2019-1-15 00:51
H7搞网络协议栈注意此问题:

特别注意,务必是SCB_CleanInvalidateDCache测试

大佬好,你说的这个问题我注意到过,也加过没用的。还是刚开始是延时很小,后来就延时很高甚至跑不通。
有时候会一直都是好的。
我描述下我现在做的一些尝试和现象吧。
1.复位,ping 不通 延时高的时候按几次复位,不一定哪一次就好了。
2.ping 软件显示请求超时,但是抓包显示,每次 ping 都有回复 但是 回复的是之前的 ping 包。就是 每个 request 都要等下一个 request 才能 reply 。这个现象见图片。no response 过一会er就会变成 reply in ##。就是每次ping,回复了 ,但是 回复的不是现在的。
还有一个现象类似,我用串口的时候,单击 按键 A 任务打印 “单击” 双击按键 B任务打印 “双击”, 如果我先单击,在双击 就显示一条 双击,这个当时调没有在意,因为目前用不上按键。是不hi对这个问题有启发?
systemview 显示 接收是正常的,也有发送,抓包也佐证了。但是回复的不是目前 ping 的。
3.有意思的是 如果我打开三个以上的 ping 软件 同时ping 它 ,一点问题也没有。
回复

使用道具 举报

9

主题

62

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2019-1-15 14:11:49 | 显示全部楼层
eric2013 发表于 2019-1-15 00:51
H7搞网络协议栈注意此问题:

特别注意,务必是SCB_CleanInvalidateDCache测试

没法附图片 抱歉 希望我表述清楚
回复

使用道具 举报

9

主题

62

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2019-1-15 14:13:30 | 显示全部楼层
hpdell 发表于 2019-1-14 20:58
直接使用 cubemx 生成就行,再参考一下挣点银子的 历程修改一下就可以了,st官方 也有 freertos + lwip 的 ...

不行的 ,你试过吗?我就是在 自带的 例程上改的。
回复

使用道具 举报

9

主题

62

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2019-1-15 14:17:17 | 显示全部楼层
eric2013 发表于 2019-1-15 00:51
H7搞网络协议栈注意此问题:

特别注意,务必是SCB_CleanInvalidateDCache测试

/* Configure the MPU attributes asCacheable write through */
  MPU_InitStruct.Enable =MPU_REGION_ENABLE;                      //区域使能/禁止
  MPU_InitStruct.BaseAddress = 0x30020000;                        //配置区域基地址
  MPU_InitStruct.Size =MPU_REGION_SIZE_128KB;                   //区域容量
  MPU_InitStruct.AccessPermission =MPU_REGION_FULL_ACCESS;       //设置访问权限
  MPU_InitStruct.IsBufferable =MPU_ACCESS_NOT_BUFFERABLE;        //禁止/允许缓冲
  MPU_InitStruct.IsCacheable =MPU_ACCESS_CACHEABLE;              //禁止/允许缓存
  MPU_InitStruct.IsShareable =MPU_ACCESS_NOT_SHAREABLE;          //禁止/允许共享
  MPU_InitStruct.Number =MPU_REGION_NUMBER1;                     //区域编号
  MPU_InitStruct.TypeExtField =MPU_TEX_LEVEL0;                   //类型扩展级别
  MPU_InitStruct.SubRegionDisable = 0x00;                         //子 region 除能位段设置
  MPU_InitStruct.DisableExec =MPU_INSTRUCTION_ACCESS_ENABLE;     //允许/禁止取指
  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /* Enable the MPU */
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

我的所有任务堆栈,为网络heap 都在SDRAM2区域,MPU我是这样配置的。
应为我考虑到第一它不是一直时跑不通的 ,有的时候一个晚上也没问题。
还有就是我在 F107上有一个版本,也没问题,但是由于 107内存太小,所以转到了 H7上测试,网络和操作系统的代码什么也没改的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2019-1-15 14:18:40 | 显示全部楼层
songwenshuai 发表于 2019-1-15 14:10
大佬好,你说的这个问题我注意到过,也加过没用的。还是刚开始是延时很小,后来就延时很高甚至跑不通。
...

官方提供lwip有你说的这个ping问题,按照那个帖子里面说的就都可以解决了。

通过你的描述,Cache问题可能性比较大。

建议发送和接收统一都用SCB_CleanInvalidateDCache处理。
回复

使用道具 举报

9

主题

62

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2019-1-15 14:18:45 | 显示全部楼层
hpdell 发表于 2019-1-14 20:58
直接使用 cubemx 生成就行,再参考一下挣点银子的 历程修改一下就可以了,st官方 也有 freertos + lwip 的 ...

正点的例程我看过了 ,,没什么 ,它上面的 强制透写我也试过。。。
回复

使用道具 举报

9

主题

62

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2019-1-15 14:22:22 | 显示全部楼层
eric2013 发表于 2019-1-15 14:18
官方提供lwip有你说的这个ping问题,按照那个帖子里面说的就都可以解决了。

通过你的描述,Cache问题 ...

你好 我尝试过 ,不行

http://www.stmcu.org.cn/module/forum/thread-615089-1-3.html

也参考过这个帖子,关掉 cache  还是一样
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2019-1-15 14:23:45 | 显示全部楼层
裸机测试下,不要开RTOS了,屏蔽RTOS的影响。
回复

使用道具 举报

9

主题

62

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2019-1-15 14:30:54 | 显示全部楼层
eric2013 发表于 2019-1-15 14:23
裸机测试下,不要开RTOS了,屏蔽RTOS的影响。

好,不过我这部分代码,之前在 107上是好好的。整个复制过来的有关网络协议栈和操作系统的没有动。
有个问题 网络协议栈的 heap 必须放在 SDRAM 3 区域吗?我放在 SDRAM2没问题吧,任务的堆栈也在SDRAM2
回复

使用道具 举报

9

主题

62

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2019-1-15 17:58:16 | 显示全部楼层
eric2013 发表于 2019-1-15 14:18
官方提供lwip有你说的这个ping问题,按照那个帖子里面说的就都可以解决了。

通过你的描述,Cache问题 ...

发送 HAL 库初始化了 4 个描述符 我只需要一个 应该怎么改?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2019-1-15 18:09:47 | 显示全部楼层
songwenshuai 发表于 2019-1-15 17:58
发送 HAL 库初始化了 4 个描述符 我只需要一个 应该怎么改?

stm32h7xx_hal_conf.h

#define ETH_TX_DESC_CNT         4  /* number of Ethernet Tx DMA descriptors */
#define ETH_RX_DESC_CNT         4  /* number of Ethernet Rx DMA descriptors */
回复

使用道具 举报

9

主题

62

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2019-1-15 22:06:56 | 显示全部楼层
eric2013 发表于 2019-1-15 18:09
stm32h7xx_hal_conf.h

#define ETH_TX_DESC_CNT         4  /* number of Ethernet Tx DMA descriptor ...

我知道这个地方 改了 好像不行。。。。。这几天要疯了   啊啊啊
回复

使用道具 举报

9

主题

62

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2019-1-16 13:26:11 | 显示全部楼层
eric2013 发表于 2019-1-15 18:09
stm32h7xx_hal_conf.h

#define ETH_TX_DESC_CNT         4  /* number of Ethernet Tx DMA descriptor ...

外面发进来的数据可以进中断,但是接到的数据是之前发的,
比如我发五个ping 包,
每个包都有一个编码,
收到和发送我都打印出这个编码。
当我发完第五个时候 ,打印才显示收到第三个,发送第三个包。
我仿真在 live watch 里看 其实 第五个包确实收到了就在 Rx_Buff 里 但是
HAL_ETH_GetRxDataBuffer(&EthHandle, &RxBuff) 这句话给我的却是之前数据。
#pragma location=0x30040200
uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE]; /* Ethernet Receive Buffers */

比如最新的包 仿真看 放在 Rx_Buff 的第一个 但是 AL_ETH_GetRxDataBuffer(&EthHandle, &RxBuff) 得到的地址 RxBuff.buffer 却是第三个。

我把
/* ########################### Ethernet Configuration ######################### */
#define ETH_TX_DESC_CNT         2  /* number of Ethernet Tx DMA descriptors */
#define ETH_RX_DESC_CNT         2  /* number of Ethernet Rx DMA descriptors */
从 4 改成 2
好了
但是我觉得这不是真正的好

之前you 四个时候 后面的数据包不容易把之前的挤出去,2 的话 容易挤出去看着ping 正常了

之所以没考虑是cache  mpu 的原因,是因为数据是对的 就在内存里,不是乱的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2019-1-16 13:39:06 | 显示全部楼层
songwenshuai 发表于 2019-1-16 13:26
外面发进来的数据可以进中断,但是接到的数据是之前发的,
比如我发五个ping 包,
每个包都有一个编码 ...

帮不上了
回复

使用道具 举报

9

主题

62

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2019-1-16 13:45:06 | 显示全部楼层

好吧 还是谢谢您了 怀疑人生,,就照着官方给的例程改的,,肯定是我的问题,但是就是不知道问题在哪。。。原子的例程 官方的例程 对着看了好多遍了。。。。
回复

使用道具 举报

9

主题

62

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2019-1-17 13:32:26 | 显示全部楼层


问题解决了
这个地方
void HAL_ETH_IRQHandler(ETH_HandleTypeDef *heth)
{
  /* Packet received */
  if (__HAL_ETH_DMA_GET_IT(heth, ETH_DMACSR_RI))
  {
    if(__HAL_ETH_DMA_GET_IT_SOURCE(heth, ETH_DMACIER_RIE))
    {      
      /* Call this function to update handle fields */
      //if(HAL_ETH_IsRxDataAvailable(heth) == 1)
      //{
        /* Receive complete callback */
        HAL_ETH_RxCpltCallback(heth);
      //}
      
      /* Clear the Eth DMA Rx IT pending bits */
      __HAL_ETH_DMA_CLEAR_IT(heth, ETH_DMACSR_RI | ETH_DMACSR_NIS);
    }
  }


屏蔽掉 //if(HAL_ETH_IsRxDataAvailable(heth) == 1)

在用的时候
    if (HAL_ETH_IsRxDataAvailable(&EthHandle))
    {
      if (HAL_ETH_GetRxDataBuffer(&EthHandle, &RxBuff) == HAL_OK)
      {
        HAL_ETH_GetRxDataLength(&EthHandle, &framelength);
再更新  不明原因。。。。 仿真器也看了 没有什么区别。。。。但是就是好了。。。不知道为什么 好像在中断中更新 出来就没了。。。。不知道怎么表达了
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 10:41 , Processed in 0.377542 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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