请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: eric2013
收起左侧

[ThreadX全家桶] ThreadX NetXDUO网络协议栈教程更新记录贴,前11章已经发布(2022-01-03)

  [复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2022-5-27 10:22:40 | 显示全部楼层
硬汉哥!什么时候能出NetX连物联网的教程
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105914
QQ
 楼主| 发表于 2022-5-28 10:29:09 | 显示全部楼层
Caifeiyu 发表于 2022-5-27 10:22
硬汉哥!什么时候能出NetX连物联网的教程

后面就安排,当前先把基础章节更新完毕。
回复

使用道具 举报

1

主题

75

回帖

78

积分

初级会员

积分
78
发表于 2022-5-28 22:27:01 | 显示全部楼层
Caifeiyu 发表于 2022-5-27 10:22
硬汉哥!什么时候能出NetX连物联网的教程

可以参考这里的示例工程:https://github.com/azure-rtos/samples
如有任何连接到Azure云的问题,欢迎发邮件咨询:azure-rtos-support@microsoft.com
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2022-5-29 11:08:15 | 显示全部楼层
好的,谢谢
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
发表于 2022-5-31 15:29:50 | 显示全部楼层
我用定时查询LAN8720状态寄存器的方法检测到了网线的插拔,问题是网线拔出时应该做哪些处理?(保证释放内存资源,并且程序不会锁死),网线插入后又应该做哪些处理使通信继续呢?谢谢
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
发表于 2022-5-31 15:36:08 | 显示全部楼层
请问,我读PHY芯片的寄存器可以发现网线的插拔,那么,相应地应该做哪些处理,才能保证程序不死机,网线插入后通讯能够恢复呢?谢谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105914
QQ
 楼主| 发表于 2022-5-31 18:43:54 | 显示全部楼层
zxljack 发表于 2022-5-31 15:36
请问,我读PHY芯片的寄存器可以发现网线的插拔,那么,相应地应该做哪些处理,才能保证程序不死机,网线插 ...

可以参考此贴玩法。

【实战经验分享】一劳永逸的解决网线随意热插拔问题
https://www.armbbs.cn/forum.php? ... 5386&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2022-9-8 15:44:52 | 显示全部楼层
TCP socket 服务器做到了客户端的连接,断开和数据收发。
也做了两个客户端一个连接,然后另一个连接,然后断开第一个,第二个可以自动连接。
但是一个连接了直接强×掉,不发送断开连接,这时候服务器就一直保持着之前的连接,释放不掉了。

我想做成有新连接就自动释放旧连接然后接受新连接,这个好像不好搞啊。
我的思路是非连接状态下就永远等待新连接,已连接状态下就查询是否有新连接,有就释放旧的并接受新的。
但是 nx_tcp_server_socket_accept 函数不能传入已连接的 socket,不然会破坏他的数据。
如果传入一个新的 socket,这两个 socket 能监听同一个 端口吗?
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2022-9-8 18:28:28 | 显示全部楼层
搞定了 TCP 新连接挤掉旧连接,防止客户端未主动断开连接,导致服务器一直处于连接中,其他客户端不能再连接的问题。
1、创建两个 socket,先用一个监听。
2、连接成功后,用另一个监听。
3、如果有新的连接,正在监听的那个连上,并主动关闭之前的那个旧连接。

下面代码中的 poll 函数在任务中循环调用就行了

/*
    TCP Socket
*/
#define TCP_SOCKET_SERVER_PORT                  (7)
#define TCP_SOCKET_SERVER_LISTEN_LIST_SIZE      (2)
static NX_TCP_SOCKET socket_server[TCP_SOCKET_SERVER_LISTEN_LIST_SIZE];
static uint8_t curr_socket_server = 0;

/**
* @brief TCP 服务器初始化
*
* @return UINT
*/
static UINT net_tcp_socket_server_init(void)
{
    UINT status;

    /* Create the TFTP server.  */
    for(int i=0; i<TCP_SOCKET_SERVER_LISTEN_LIST_SIZE; i++)
    {
        status = nx_tcp_socket_create(&ip, &socket_server[i], "Server socket",
                                    NX_IP_NORMAL, NX_DONT_FRAGMENT, NX_IP_TIME_TO_LIVE, 100,
                                    NX_NULL, NX_NULL);
        if (status != NX_SUCCESS)
        {
            log_e("Create TCP socket server %d failed. status = 0x%02X.", i, status);
            return status;
        }
    }

    /* 开启当前 socket 监听.  */
    curr_socket_server = 0;
    status = nx_tcp_server_socket_listen(&ip, TCP_SOCKET_SERVER_PORT, &socket_server[curr_socket_server], TCP_SOCKET_SERVER_LISTEN_LIST_SIZE, NX_NULL);
    if(status != NX_SUCCESS)
    {
        log_e("TCP socket server %d listen failed. status = 0x%02X.", curr_socket_server, status);
        nx_tcp_socket_delete(&socket_server[curr_socket_server]);
        return status;
    }

    log_i("TCP socket server start OK.");

    return status;
}

static UINT net_tcp_socket_server_poll(void)
{
    UINT       status = NX_SUCCESS;
    NX_PACKET *packet_ptr;
    ULONG      soc_sta;

    /* 获取当前 socket 的连接状态 */
    nx_tcp_socket_info_get(&socket_server[curr_socket_server], NX_NULL, NX_NULL, NX_NULL, NX_NULL, NX_NULL, NX_NULL, NX_NULL, &soc_sta, NX_NULL, NX_NULL, NX_NULL);
    if(soc_sta != NX_TCP_ESTABLISHED)
    {
        /* 当前 socket 未连接则尝试连接 */
        status = nx_tcp_server_socket_accept(&socket_server[curr_socket_server], 200);
        if(status)
        {
            nx_tcp_server_socket_unaccept(&socket_server[curr_socket_server]);
            nx_tcp_server_socket_relisten(&ip, TCP_SOCKET_SERVER_PORT, &socket_server[curr_socket_server]);
        }
        else
        {
            /* 连接成功,则用备用 socket 继续监听端口 */
            log_i("TCP socket server %d connected.", curr_socket_server);
            nx_tcp_server_socket_relisten(&ip, TCP_SOCKET_SERVER_PORT, &socket_server[curr_socket_server^0x01]);
        }
    }
    else
    {
        /* 当前 socket 已连接,则接收处理数据 */
        status = nx_tcp_socket_receive(&socket_server[curr_socket_server], &packet_ptr, 200);
        if((status != NX_SUCCESS) && (status != NX_NO_PACKET))
        {
            /* 产生 NX_NO_PACKET 错误则继续尝试接收,其他错误则断开连接 */
            log_i("TCP socket server %d disconnected.", curr_socket_server);
            nx_tcp_socket_disconnect(&socket_server[curr_socket_server], 200);
            nx_tcp_server_socket_unaccept(&socket_server[curr_socket_server]);

            /* 备用端口正在监听,互换备用 socket 和 当前 socket */
            curr_socket_server ^= 1;
        }
        else
        {
            if(status == NX_SUCCESS)
            {
                status = nx_tcp_socket_send(&socket_server[curr_socket_server], packet_ptr, 200);
                if(status)
                {
                    log_e("TCP socket server %d send packet failed. status = 0x%02X", curr_socket_server, status);
                    nx_packet_release(packet_ptr);
                }
            }

            /* 尝试备用 socket 是否有连接 */
            status = nx_tcp_server_socket_accept(&socket_server[curr_socket_server^0x01], 0);
            if(status == NX_SUCCESS)
            {
                /* 连接成功,则断开当前 socket 连接,并用当前 socket 继续监听端口 */
                log_i("TCP socket server %d disconnected.", curr_socket_server);
                nx_tcp_socket_disconnect(&socket_server[curr_socket_server], 200);
                nx_tcp_server_socket_unaccept(&socket_server[curr_socket_server]);
                nx_tcp_server_socket_relisten(&ip, TCP_SOCKET_SERVER_PORT, &socket_server[curr_socket_server]);

                /* 互换备用 socket 和 当前 socket */
                curr_socket_server ^= 1;
                log_i("TCP socket server %d connected.", curr_socket_server);
            }
        }
    }

    return status;
}



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105914
QQ
 楼主| 发表于 2022-9-9 12:24:02 | 显示全部楼层
ihavedone 发表于 2022-9-8 18:28
搞定了 TCP 新连接挤掉旧连接,防止客户端未主动断开连接,导致服务器一直处于连接中,其他客户端不能再连 ...

这里有个问题,怎么知道是客户端未主动断开,貌似你的玩法是一直处理最新的连接即可。
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2022-9-9 12:51:42 | 显示全部楼层
eric2013 发表于 2022-9-9 12:24
这里有个问题,怎么知道是客户端未主动断开,貌似你的玩法是一直处理最新的连接即可。

两个 socket,一个连上了就用另一个去监听。
如果主动断开了,就把当前 socket 切换到正在监听的那个,等待连接。
如果当前连接没有主动断开的情况下,正在监听的那个 socket 得到新的连接,就接受新连接,并断开之前的连接,并用刚断开的 socket 继续监听端口。

我这么做主要是为了解决客户端不主动断开连接,服务器又没做超时自动断连(或者超时时间很长),就会导致新客户端连不上的问题。
这个实现就可以让新连接挤占旧连接,每次链接都一定能连上。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105914
QQ
 楼主| 发表于 2022-9-9 13:09:55 | 显示全部楼层
ihavedone 发表于 2022-9-9 12:51
两个 socket,一个连上了就用另一个去监听。
如果主动断开了,就把当前 socket 切换到正在监听的那个, ...

总感觉你这个处理哪里有点问题。这个搞的有点麻烦了。
也行,能解决你的项目问题即可。
回复

使用道具 举报

0

主题

21

回帖

21

积分

新手上路

积分
21
发表于 2022-10-28 13:17:08 | 显示全部楼层
硬汉,你发布的V5-2402_ThreadX NetXDUO TCP Server.7z, 是不是采用的ST官方示例包修改了一点点? 总感觉ST增加的驱动那部分代码,相比MS的NX代码包,代码设计水平与可读性明显降了好大一个层次。我自己水平不够,真心希望有大佬能好好重构一下这部分代码,造福广大码农。 主要就是这个文件 nx_stm32_eth_driver.c中,收、发过程的几个函数。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105914
QQ
 楼主| 发表于 2022-10-28 14:26:51 | 显示全部楼层
guohuimao 发表于 2022-10-28 13:17
硬汉,你发布的V5-2402_ThreadX NetXDUO TCP Server.7z, 是不是采用的ST官方示例包修改了一点点? 总感觉S ...

对,我们修改成了我们自己的PHY芯片驱动。

nx_stm32_eth_driver.c的这个代码框架确实可以再整理规范下,方便大家一目了然就可以修改驱动接口函数。否者换芯片都不知道修改哪里。
回复

使用道具 举报

0

主题

21

回帖

21

积分

新手上路

积分
21
发表于 2022-10-28 16:35:45 | 显示全部楼层
eric2013 发表于 2022-10-28 14:26
对,我们修改成了我们自己的PHY芯片驱动。

nx_stm32_eth_driver.c的这个代码框架确实可以再整理规范下 ...

我看你修改的地方,也是我阅读时感觉别扭的地方,改了更合理一些; 但是关于DMA描述符收发的处理,要是大改一下就好了,将ST增加的变量再精减掉一些更好。我水平不够,改不了....
你为了保持原有工程的变量作用范围,把phy合在eth文件中,个人感觉搅和在一起并不太好。可否建议后面出新版本,还是将phy独立成一个文件。 我感觉ST增加的代码,有些地方逻辑上似乎也有问题(或是bug), 希望有机会进一步交流探讨....
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105914
QQ
 楼主| 发表于 2022-10-28 16:48:12 | 显示全部楼层
guohuimao 发表于 2022-10-28 16:35
我看你修改的地方,也是我阅读时感觉别扭的地方,改了更合理一些; 但是关于DMA描述符收发的处理,要是大 ...

这个确实有必要再规划规划。
回复

使用道具 举报

0

主题

21

回帖

21

积分

新手上路

积分
21
发表于 2022-10-29 16:19:30 | 显示全部楼层
本帖最后由 guohuimao 于 2022-10-30 20:09 编辑

暂时不研究,放一放。不懂的地方太多了
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2022-11-18 15:16:01 | 显示全部楼层
您好,我现在在向 ARM9移植 ThreadX的协议栈 NetX,使用的是 GNU编译链,参考了您的帖子,但是我自己编译出来的 bin文件特别大,加了 -O3的优化还是有 387KB,请问我是忽略了什么选项么?或者您有什么建议可以优化一下二进制文件的大小么?  非常感谢!
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2023-6-21 16:00:43 | 显示全部楼层
请问 STM32 的网卡驱动哪里也找到呢? 对应不同系列的 nx_stm32_eht_driver 文件
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2023-6-21 16:07:57 | 显示全部楼层
nx_stm32_eth_driver 这个驱动有没有其他芯片系列的,在哪里可以找到呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105914
QQ
 楼主| 发表于 2023-6-22 11:31:15 | 显示全部楼层
lyricpoem 发表于 2023-6-21 16:00
请问 STM32 的网卡驱动哪里也找到呢? 对应不同系列的 nx_stm32_eht_driver 文件

这个是ST提供的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105914
QQ
 楼主| 发表于 2023-6-22 11:32:18 | 显示全部楼层
lyricpoem 发表于 2023-6-21 16:07
nx_stm32_eth_driver 这个驱动有没有其他芯片系列的,在哪里可以找到呢?

其他厂家的,这里有整理:
https://github.com/azure-rtos/getting-started
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105914
QQ
 楼主| 发表于 2023-6-22 11:33:23 | 显示全部楼层
stu_Leo 发表于 2022-11-18 15:16
您好,我现在在向 ARM9移植 ThreadX的协议栈 NetX,使用的是 GNU编译链,参考了您的帖子,但是我自己编译出 ...

大概率是attr属性配置导致的,可以看看bin文件中间区域是不是有填充的一批0xFF/0X00数据。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-12-24 15:42:33 | 显示全部楼层
你好,开发板V6的TCP_client,我这边为什么平不通。
我调试软件时发现是调用nx_tcp_client_socket_connect函数(例程注释是连接远程服务器那一步)时返回值错误,我这边打印返回值是0x38。
关于这个返回值,我在手册的函数API返回值中也没有找到。
有人出现这样的问题吗?怎么解决?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105914
QQ
 楼主| 发表于 2023-12-25 09:05:27 | 显示全部楼层
青衫倚剑 发表于 2023-12-24 15:42
你好,开发板V6的TCP_client,我这边为什么平不通。
我调试软件时发现是调用nx_tcp_client_socket_connect ...

务必看教程里面操作说明。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2024-1-6 15:47:35 | 显示全部楼层
硬汉哥,手上有块芯驰的Cortex-R5开发板,跑的demo是LWIP的,想移植NETX,从哪里下手好点呢,需要掌握哪些方面?要学习LWIP吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105914
QQ
 楼主| 发表于 2024-1-7 10:43:21 | 显示全部楼层
kayeYip 发表于 2024-1-6 15:47
硬汉哥,手上有块芯驰的Cortex-R5开发板,跑的demo是LWIP的,想移植NETX,从哪里下手好点呢,需要掌握哪些 ...

那得参考这里的Port文件修改了,得花些时间研究了。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-1-23 23:40:31 | 显示全部楼层
gck 发表于 2022-3-22 16:11
同一局域网下,可以拼通

关系统防火墙
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2024-2-29 11:52:19 | 显示全部楼层
硬汉哥,使用cubemx加载的stm32h7xx_hal_eth.c与教程里面的不一样,有的函数和结构体里面的参数没有,比如HAL_StatusTypeDef HAL_ETH_DescAssignMemory(ETH_HandleTypeDef *heth, uint32_t Index, uint8_t *pBuffer1, uint8_t *pBuffer2)就没有。为什么会有这些差异啊
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
发表于 2024-3-11 10:00:47 | 显示全部楼层
NetXDUO 能用在其他RTOS么,比如FreeRTOS, 我看网上都是threadX的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105914
QQ
 楼主| 发表于 2024-3-12 09:20:11 | 显示全部楼层
zbq 发表于 2024-3-11 10:00
NetXDUO 能用在其他RTOS么,比如FreeRTOS, 我看网上都是threadX的

NETXDUO应该还没有提供裸机适配版。
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
发表于 2024-3-12 09:58:32 | 显示全部楼层
eric2013 发表于 2024-3-12 09:20
NETXDUO应该还没有提供裸机适配版。

是的,我看了下,协议栈和TX耦合挺紧的
回复

使用道具 举报

2

主题

8

回帖

14

积分

新手上路

积分
14
发表于 2024-3-15 13:11:35 | 显示全部楼层
硬汉哥,我想咨询一个问题   if(status == LAN8742_STATUS_OK)    {      tickstart =  pObj->IO.GetTick();            /* Wait for 2s to perform initialization */      while((pObj->IO.GetTick() - tickstart) <= LAN8742_INIT_TO)      {      }     pObj->Is_Initialized = 1;    }
回复

使用道具 举报

2

主题

8

回帖

14

积分

新手上路

积分
14
发表于 2024-3-15 13:12:32 | 显示全部楼层
硬汉哥您好,我想咨询一个问题就是我的LAN8742_Init()函数会卡住这一句出不来   if(status == LAN8742_STATUS_OK)    {      tickstart =  pObj->IO.GetTick();            /* Wait for 2s to perform initialization */      while((pObj->IO.GetTick() - tickstart) <= LAN8742_INIT_TO)      {      } //           tx_thread_sleep(2000);      pObj->Is_Initialized = 1;    }
回复

使用道具 举报

2

主题

8

回帖

14

积分

新手上路

积分
14
发表于 2024-3-15 13:14:38 | 显示全部楼层
eric2013 发表于 2024-3-12 09:20
NETXDUO应该还没有提供裸机适配版。

硬汉哥您好,我想咨询一个问题就是我的LAN8742_Init()函数会卡在   if(status == LAN8742_STATUS_OK)
   {
     tickstart =  pObj->IO.GetTick();
     /* Wait for 2s to perform initialization */
     while((pObj->IO.GetTick() - tickstart) <= LAN8742_INIT_TO)
     {
     }
     pObj->Is_Initialized = 1;
   }出不来,我想问一下是因为什么
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105914
QQ
 楼主| 发表于 2024-3-16 09:57:38 | 显示全部楼层
WSWSWSWS 发表于 2024-3-15 13:14
硬汉哥您好,我想咨询一个问题就是我的LAN8742_Init()函数会卡在   if(status == LAN8742_STATUS_OK)
...


有个重要的地方,当前硬件设计8720的复位是怎么设计的,和系统一个硬件复位还是单独的GPIO控制的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 19:35 , Processed in 0.277144 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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