硬汉嵌入式论坛

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

[ThreadX全家桶] 移植了NetXDUO后能ping通但是很神奇创建不了socket。进debug看到它获取不到互斥锁

[复制链接]

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2022-3-3 13:09:24 | 显示全部楼层 |阅读模式
      就像标题说的,我感到很神奇。按照文档的步骤去移植的,不过物理层用的LAN8720跟文档用的不一样,最后还是整成了至少是一半吧,起码ping通了,神奇的是它在创建socket的时候会在内部调用tx_mutex_get()时无法获得互斥锁,直接把线程给挂起了。测试程序直接就是例程的只是改了文件名,其他没动。事实上碰到的问题其实不止这么一个。还有一个就是

image.png



这里边划了线的一个调用,它进去的时候会在第一个判断是否是空指针直接return错误代码了。尝试更改成普通的控制块传进去,这会它就在第二个判断直接又是return错误了。手头上没有文档里的板子我没法直接测试程序的效果来看看这个调用是否如第二个调用那样正常走到最后。我觉得它这连socket都创建不了,那后边的什么UDP,SNTP这些玩意怕是也不行,搞不好又是获取不到互斥锁之类的问题。在创建socket前得先创建IP,那玩意我认为应该没问题,ping这个IP是通的。
       呃,也许超纲了至少是跟标题问的不一样,这玩意跟SD卡有关,挂载fatfs文件系统超级慢,大概要等四五分钟,有时候很快但最起码三分钟,能创建文件但是写不进数据,扫描文件那也是不行。这是之前碰到的问题,不止一次,拿标准库搞的那会它是挺正常的,学用HAL库整的时候它就这样了,想着把threadx跟它的网络组件整好以后用文件系统组件试试,结果在网络组件就完蛋了。

429_HAL.zip

27.49 MB, 下载次数: 4

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115863
QQ
发表于 2022-3-3 15:15:29 | 显示全部楼层
感觉是你的ThreadX内核移植有点问题,你用你的这个工程简单的测试互斥信号量什么的成功吗
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2022-3-3 15:30:33 | 显示全部楼层
eric2013 发表于 2022-3-3 15:15
感觉是你的ThreadX内核移植有点问题,你用你的这个工程简单的测试互斥信号量什么的成功吗

测试程序的主函数文件拿的例程里边的改了按键那里。我看到printf输出信息封装的任务用得到互斥锁,那个没见到有问题。刚刚移植了threadx跑了一次看到led在闪也可以输出调试信息就直接开始移植网络栈了。
不过我还是试下看看,也不确定有没有问题。
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2022-3-3 16:13:15 | 显示全部楼层
eric2013 发表于 2022-3-3 15:15
感觉是你的ThreadX内核移植有点问题,你用你的这个工程简单的测试互斥信号量什么的成功吗

试了一下,互斥锁没看到什么问题。我设置两个线程互相争取一个变量的修改用来控制蜂鸣器。测试看到其中一个线程获得锁的时候另一个线程就阻塞直到锁被放掉。可就是创建socket时获得锁就不行,很奇怪。
回复

使用道具 举报

1

主题

75

回帖

78

积分

初级会员

积分
78
发表于 2022-3-4 17:48:34 | 显示全部楼层
这个示例可以跑跑看,如果thread_n_counter (n从0-7)每秒都有变化的话说明ThreadX移植基本上没问题
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2022-3-8 12:12:07 | 显示全部楼层
      摸鱼了几天。今天再尝试的时候找到问题了.....呃,原来是并不能ping通的,我搞错IP了结果ping的是电脑自己..很低级的错误..
      问题在它事实上并没有成功地进入到中断里边去,是链路层搞得不对,找到ST的lan8720驱动看到跟例程里边用的那个驱动程序几乎是一样的,照搬了这个过来加了硬件复位的程序把原本的驱动换掉重新移植了一下,最后ping通了。 原先的lan8720驱动是在正点原子的程序里边拿来的,对比了两个驱动看到,原本用的那个在获取链路状态函数是读取31号寄存器,能够读出一个正常速度的状态,其他状态判断为错误,从这点来看这个程序按照文档的方式移植只要把驱动程序调用的部分修改一下通常是可行的,然而因为并没有看过nx_stm32_driver.c文件内函数的原型,忽略了一个细节导致了失败。
      文件开头定义了一个ETH_HandleTypeDef变量EthHandle,这个变量将在_nx_driver_hardware_enable()函数内传递给HAL_ETH_Start()用来开启以太网外设的收/发以及DMA,原本的程序里边对这个结构体的赋值在lan8720的驱动里边完成了,而nx_stm32_driver.c文件内对它的赋值我删掉了,所以EthHandle是个空结构体,这个情况下传递给HAL_ETH_Start()就会失败得很彻底。它的结果就是不会进入到以太网中断去。  这个结构体在_nx_driver_hardware_disable()里边也会被使用。

    总结就是如果移植时的nx_stm32_driver.c文件跟我附件里的那个类似并且像我原本的程序那样对ETH_HandleTypeDef结构体的赋值在驱动函数里边已经完成了,一定要记得把_nx_driver_hardware_enable()里边的HAL_ETH_Start()给删掉或者注释掉!或者在nx_stm32_driver.c文件里完成,总之不要让它是空结构体的时候被用。不然会失败得很彻底!!!
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2022-4-30 09:07:02 来自手机 | 显示全部楼层
又是一次孤独的调试过程
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-23 12:25 , Processed in 0.501616 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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