硬汉嵌入式论坛

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

[NetX] NX停止在SCB_InvalidateDCache_by_Addr过不去

[复制链接]

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2022-11-18 17:45:28 | 显示全部楼层 |阅读模式
求助,非常神奇的问题
先说说硬件平台,使用的是银杏科技的 H750IB 核心板和开发板,开发板上的 PHY 芯片是 LAN8720,之前用 LWIP 都是好好的
先在上面移植了 TX,这个没什么说的,因为一直使用 uCOS,基本上大同小异,运行得也很好

接下来移植 NXD,使用 ST 的例程 en.x-cube-azrtos-h7_v2-1-0 做为模板,参考里面的 STM32H735G-DK 中的 Nx_UDP_Echo_Server
版本 TX NX 都是 6.1.12,STM32H735G-DK 使用的是 LAN8742
因为 MCU 和 PHY 都不同,所以做了些改变。LAN8742 只需要把 42 改成 20 就能运行
在我的 TX 基础上加了三个线程:ip, udp, link,都是参考例程弄的,开始运行得很好,udp 传输和 ping 都没问题

但转折在关机后,只要一断电就死活运行不起来,经检查当运行到 stm32h7xx_hal_eth.c 中的 HAL_ETH_RxAllocateCallback 函数后就会进入
HardFault_Handler 异常。HAL_ETH_RxAllocateCallback 这个函数在 nx_stm32_eth_driver.c 中重新实现,里面调用了 SCB_InvalidateDCache_by_Addr
就是在执行 SCB_InvalidateDCache_by_Addr 时挂掉了。

但只要把以前 LWIP 的程序运行一遍,或者在 HardFault_Handler 中把死循环去掉后运行一遍,就一切正常运行了,当然断电后故障依旧
怀疑是有什么初始化工作没有做好造成的,跳过去后做了此工作后就好了,但是找不到这点,不知道有没有哪位高人遇到过类似问题
帮忙分析一下,非常感谢!

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2022-11-21 09:19:12 | 显示全部楼层
1、上电后不要立即初始化网络,等待两秒后操作。
2、然后就是LAN系列芯片一般上电后,要么之前有硬件上电复位,要么GPIO引脚控制的话,引脚控制一次复位。或者软件命令控制。之后再操作。
3、最后这个函数SCB_InvalidateDCache_by_Addr修改成SCB_CleanInvalidateDCache试试
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2022-11-21 16:48:52 | 显示全部楼层
非常感谢您的回复,这两天一直在试这个东西,刚才也把您的方法试了下,也不行。
刚刚通过试验得到的结论是
在执行   MX_ETH_Init(); 之前
必须执行 SCB_EnableDCache();
否则就会开机进入 HardFault_Handler。
执行 SCB_EnableDCache(); 后不会进入 HardFault_Handler,都能跑起来。但是 ping 不通
最后试验在 MX_ETH_Init(); 之前执行 SCB_EnableDCache,此行后面运行 SCB_DisableDCache,一切OK。
但这显然不是我想要的结果,我知道这肯定和 MPU、Cache那一套东西有关,但问题在哪里呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2022-11-22 10:12:02 | 显示全部楼层
ssdlw 发表于 2022-11-21 16:48
非常感谢您的回复,这两天一直在试这个东西,刚才也把您的方法试了下,也不行。
刚刚通过试验得到的结论是 ...

这个应该是网络所涉及到RAM的Cache配置有问题。

建议专门配置下以太网发送接收描述符,发送缓存和接收缓存的MPU Cache配置。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2022-11-23 09:15:31 | 显示全部楼层
您说的非常对,我昨天按您的说法验证了一下,基本得出了结论:
执行 ST 自动生成的代码  MX_ETH_Init(); 之前,必须要执行 SCB_EnableDCache,否则  nx_stm32_eth_driver 这一步就过不去。
我想这可能和 MX_ETH_Init 本身无关,只有与 nx_stm32_eth_driver 配合时才有这种情况
但是打开 DCache 必然会影响 ETH 的 DMA,所以之前我运行 SCB_DisableDCache 就 OK 了
后来我仔细研究了一下 MPU,把 ETH 用到的 DMA 内存全部设置成禁用 DCache,就正常运行了
虽然许多细节说不清楚,但至少可以把现象解释得通了
再一次感谢硬汉的提示
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2022-11-23 16:52:12 | 显示全部楼层
ssdlw 发表于 2022-11-23 09:15
您说的非常对,我昨天按您的说法验证了一下,基本得出了结论:
执行 ST 自动生成的代码  MX_ETH_Init();  ...

回复

使用道具 举报

7

主题

36

回帖

57

积分

初级会员

积分
57
发表于 2024-3-15 10:06:39 | 显示全部楼层
很奇怪,我也遇到相同问题了,再NUCLEO_H 743ZI2开发板上,用X-CUBE-AZRTOS-H7 3.2.0包,H7 HAL库1.11.1.代码用CUBE生成
MPU_Config()后,调用SCB_EnableICache(),SCB_EnableDCache(),无法ping通,当我把SCB_EnableICache(),SCB_EnableDCache()删除掉以后,可以ping通了,也不会出现楼上的死机问题。后面又按照硬汉的方法,SCB_EnableICache(),SCB_EnableDCache()开启,把SCB_InvalidateDCache_by_Addr修改成SCB_CleanInvalidateDCache,也能ping通了。
回复

使用道具 举报

7

主题

36

回帖

57

积分

初级会员

积分
57
发表于 2024-3-18 09:17:18 | 显示全部楼层
好像找到问题了,发现用CUBE生成的代码app_netxduo.c中MX_NetXDuo_Init里面协议栈相关的内存是用tx_byte_allocate分配的内存,修改成静态的内存上面的问题就好了,SCB_EnableICache(),SCB_EnableDCache()开启SCB_InvalidateDCache_by_Addr不用修改也可以正常ping通,
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2024-3-18 15:50:36 | 显示全部楼层
zbq 发表于 2024-3-18 09:17
好像找到问题了,发现用CUBE生成的代码app_netxduo.c中MX_NetXDuo_Init里面协议栈相关的内存是用tx_byte_al ...

谢谢分享。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 05:11 , Processed in 0.173751 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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