W5500使用ioLibrary库创建TCP客户端

1、WIZnet全硬件TCP/IP协议栈

WIZnet全硬件TCP/IP协议栈,支持TCP,UDP,IPv4,ICMP,ARP,IGMP以及PPPoE协议。
以太网:支持BSD和WIZCHIP(W5500/W5300/W5200/W5100/W5100S)的SOCKET APIs驱动程序。
互联网:
DHCP客户端
DNS客户端
FTP客户端
FTP服务器
SNMP代理/陷阱
SNTP客户端
TFTP客户端
HTTP服务器
MQTT客户端
其他功能将陆续添加。

ioLibrary库下载地址: https://gitcode.com/gh_mirrors/io/ioLibrary_Driver?utm_source=csdn_github_accelerator&isLogin=1

案例:项目首页 - MINISTM32移植W5500ioLiberary:MINISTM32 移植W5500 ioLiberary项目为开发者提供了在MINISTM32平台上移植W5500网络芯片的完整解决方案。该项目包含移植所需的库文件和示例代码,帮助开发者快速上手并实现网络通信功能。通过详细的移植说明和步骤,开发者可以轻松完成配置和调试,节省开发时间。无论是初学者还是有经验的工程师,都可以利用该项目在STM32F103RCT6平台上高效集成W5500,实现稳定的网络连接。项目资源丰富,文档清晰,是嵌入式网络开发的理想选择。 - GitCode

internet文件夹

W5500文件夹

2、W5500芯片

W5500是一款全硬件TCP/IP以太网控制器。W5500集成了TCP/IP协议栈,10/100M以太网数据链路
层(MAC)及物理层(PHY),使得用户使用单芯片就能够在他们的应用中拓展网络连接。
支持8个独立端口(Socket)同时通讯,每一个 Socket 的发送 缓存区都在一个 16KB 的物理发送内存中,初始化分配为 2KB。每一个 Socket 的接收缓 存区都在一个 16KB 的物理接收内存中,初始化分配为 2KB
W5500提供了SPI接口,最大支持80MHz速率,W5500支持SPI模式0和模式3。

3、配置使能W5500驱动

添加wizchip_conf.c,w5500.c和socket.c到工程中。打开wizchip_conf.H,找到_WIZCHIP_宏定义,修改如下:

 #ifndef _WIZCHIP_
   // NOTE_LIHAN: Some sections of this code are not yet fully defined.
   #define _WIZCHIP_                      W5500   // W5100, W5100S, W5200, W5300, W5500, 6300
     //将_WIZCHIP_宏设置为W5500,2025年5月15日修改
 #endif

4、添加SPI1驱动程序

//函数功能:
//初始化SPI1_SCL为PA5,SPI1_MISO为PA6,SPI1_MOSI为PA7,SPI1_CS为PA3;
//设置SPI1的工作模式

void W5500_SPI_Init(void)
{
    GPIO_InitTypeDef     GPIO_InitStructure;
    SPI_InitTypeDef   SPI_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA的外设时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);  //使能SPI1的外设时钟

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;         //选择PIN5,是SPI1的SCL
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      //选择引脚为复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚的最高工作速率为50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);  //根据GPIO_InitStructure结构指针所指向的参数配置PA5引脚    

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;         //选择PIN6,是SPI1的MISO
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;      //选择引脚为输入悬浮
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚的最高工作速率为50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);  //根据GPIO_InitStructure结构指针所指向的参数配置PA6引脚

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;         //选择PIN7,是SPI1的MOSI
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      //选择引脚为复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚的最高工作速率为50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);  //根据GPIO_InitStructure结构指针所指向的参数配置PA7引脚

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;         //选择PIN3,是W5500的片选脚CS
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //选择引脚为推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚的最高工作速率为50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);  //根据GPIO_InitStructure结构指针所指向的参数配置PA3引脚

//设置SPI1的工作模式
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    //SPI设置为双线双向全双工
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;     //设置为主SPI
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI发送接收为8位帧结构
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;        //设置SCK空闲时钟为低电平
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;      //数据捕获于第1个时钟沿
    //SCK空闲时钟为低电平,数据捕获于第1个时钟沿,这样就设置了SPI从机在下降沿采集数据了
    //SPI从机在下降沿采集数据,这要求CPU必须在SCK上升沿输出位值,在SCK为高电平时达到稳定,为数据采集做好准备
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;  //设置NSS输出由SSI位控制
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
    //设置波特率预分频值为2
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  //设置数据传输先从MSB位开始
  SPI_InitStructure.SPI_CRCPolynomial = 7;            //使用CRC7校验
  SPI_Init(SPI1, &SPI_InitStructure);

  SPI_Cmd(SPI1, ENABLE); //使能SPI外设
}

#define    W5500_CS_high()   GPIO_SetBits(GPIOA,GPIO_Pin_4)   //W5500片选引脚
#define    W5500_CS_low()    GPIO_ResetBits(GPIOA,GPIO_Pin_4) //W5500片选引脚

//函数功能:选择W5500
void SPI_CS_Select(void)
{
    W5500_CS_low();
}

//函数功能:不选择W5500
void SPI_CS_Deselect(void)
{
    W5500_CS_high();
}

//函数功能:从W5500读取一个字节
uint8_t SPI_ReadByte(void)
{
    uint8_t byte;

    byte=SPI_I2S_ReceiveData(SPI1);//虚读一次
    SPI_I2S_SendData(SPI1,0x00);//通过外设SPI1发送0x00为的是发送8个移位时钟
    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    //检查SPI1标志位,是否设置"发送缓存空标志位",等待数据寄存器空
    byte=SPI_I2S_ReceiveData(SPI1);//读取1个字节数据

    return byte;
}

//函数功能:将byte发送给W5500
void SPI_WriteByte(uint8_t byte)
{
    SPI_I2S_SendData(SPI1,byte);//通过外设SPI1发送一个数据
    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    //检查SPI1标志位,是否设置"发送缓存空标志位",等待数据寄存器空
}

//函数功能:关闭总中断
void SPI_CrisEnter(void)
{
    __set_PRIMASK(1);//关闭总中断
}

//函数功能:使能总中断
void SPI_CrisExit(void)
{
    __set_PRIMASK(0);//开放总中断
}

5、TCP客户端应用程序W5500_HD_Driver.c

#include "W5500_HD_Driver.h"		
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "socket.h"	// Just include one header for WIZCHIP
#include "SPI1.h"//下载地址: https://gitcode.com/gh_mirrors/io/ioLibrary_Driver?utm_source=csdn_github_accelerator&isLogin=1
//W5500的网络参数
//本地物理地址:00 08 DC 11 11 11
//本地IP地址:192.168.1.199
//本地子网掩码:	255.255.255.0
//本地网关:192.168.1.1
//DNS服务器IP地址:8.8.8.8
//通过手动配置静态IP地址,Static IP configuration by manually.
wiz_NetInfo gWIZNETINFO = { {0x00, 0x08, 0xdc,0x11, 0x11, 0x11},{192, 168, 1, 199},{255,255,255,0},{192, 168, 1, 1},{8,8,8,8},NETINFO_STATIC };//端口0的网络参数
uint16_t LocalPort0=5000;	               //端口0的本地端口号(5000)
uint8_t  DstIP_Port0[4]={192,168,1,190}; //端口0的远程IP地址:192.168.1.190
uint16_t DstPort_Port0=6000;             //端口0的远程端口号:6000uint8_t gDATABUF[DATA_BUF_SIZE];//STM32接收/发送W5500的数据缓冲区void W5500_Initialization(void);//函数功能:装载W5500的本地网络参数和端口0的网络参数
void W5500_Load_Net_Parameters(void)
{
//本地物理地址:00 08 DC 11 11 11gWIZNETINFO.mac[0]=0x00;gWIZNETINFO.mac[1]=0x08;gWIZNETINFO.mac[2]=0xdc;gWIZNETINFO.mac[3]=0x11;gWIZNETINFO.mac[4]=0x11;gWIZNETINFO.mac[5]=0x11;//本地IP地址:192.168.1.199gWIZNETINFO.ip[0]=192;gWIZNETINFO.ip[1]=168;gWIZNETINFO.ip[2]=1;gWIZNETINFO.ip[3]=199;//本地子网掩码:	255.255.255.0gWIZNETINFO.sn[0]=255;gWIZNETINFO.sn[1]=255;gWIZNETINFO.sn[2]=255;gWIZNETINFO.sn[3]=0;//本地网关:192.168.1.1gWIZNETINFO.gw[0]=192;gWIZNETINFO.gw[1]=168;gWIZNETINFO.gw[2]=1;gWIZNETINFO.gw[3]=1;//DNS服务器IP地址:8.8.8.8gWIZNETINFO.dns[0]=8;gWIZNETINFO.dns[1]=8;gWIZNETINFO.dns[2]=8;gWIZNETINFO.dns[3]=8;//DHCP模式gWIZNETINFO.dhcp=NETINFO_STATIC;//告诉ioLibrary库,当前使用"静态IP地址"配置//通过手动配置静态IP地址,Static IP configuration by manually.//端口0的本地端口号LocalPort0=5000;//端口0的远程IP地址:192.168.1.190DstIP_Port0[0]=192;DstIP_Port0[1]=168;DstIP_Port0[2]=1;DstIP_Port0[3]=190;//端口0的远程端口号DstPort_Port0=6000;
}/*** @brief  Intialize the network information to be used in WIZCHIP* @retval None*/
//函数功能:设置本地网络参数:MAC地址,GW网关,SN子网掩码,本地IP地址,DNS服务器IP地址,DHCP
void network_init(void)
{uint8_t tmpstr[6];ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO);//设置本地网络参数:MAC地址,GW网关,SN子网掩码,本地IP地址,DNS服务器IP地址,DHCP//设置MAC地址,将gWIZNETINFO.mac写入W5500;//设置网关,将gWIZNETINFO.gw写入W5500;//设置子网掩码,将gWIZNETINFO.sn写入W5500//设置本地IP地址,将gWIZNETINFO.ip写入W5500//将gWIZNETINFO.dns[]拷贝到_DNS_[]中//将gWIZNETINFO.dhcp保存到_DHCP_中ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO);//读本地网络参数:MAC地址,GW网关,SN子网掩码,本地IP地址,DNS服务器IP地址,DHCP//读MAC地址,保存到gWIZNETINFO.mac//读网关,保存到gWIZNETINFO.gw//读子网掩码,保存到gWIZNETINFO.sn//读本地IP地址,保存到gWIZNETINFO.ip//将_DNS_[]拷贝到gWIZNETINFO.dns[]中//将_DHCP_保存到gWIZNETINFO.dhcp中ctlwizchip(CW_GET_ID,(void*)tmpstr);//读W5500的ID,保存到tmpstr[6]中,"W5500\0",这是ioLibrary驱动定义的ID;//在wizchip_conf.h中定义_WIZCHIP_ID_为"W5500\0"printf("\r\n=== %s NET CONF ===\r\n",(char*)tmpstr);//串口输出W5500的IDprintf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",gWIZNETINFO.mac[0],gWIZNETINFO.mac[1],gWIZNETINFO.mac[2],gWIZNETINFO.mac[3],gWIZNETINFO.mac[4],gWIZNETINFO.mac[5]);//串口输出W5500的MAC地址printf("SIP: %d.%d.%d.%d\r\n", gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]);//串口输出W5500的IP地址printf("GAR: %d.%d.%d.%d\r\n", gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]);//串口输出W5500的网关地址printf("SUB: %d.%d.%d.%d\r\n", gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]);//串口输出W5500的子网掩码printf("DNS: %d.%d.%d.%d\r\n", gWIZNETINFO.dns[0],gWIZNETINFO.dns[1],gWIZNETINFO.dns[2],gWIZNETINFO.dns[3]);//串口输出W5500的DNS服务器IP地址printf("======================\r\n");
}//函数功能:
//1.初始化SPI接口
//2.注册相关函数
//3.设置W5500每个端口的发送缓冲区和接收缓冲区的大小均为2K字节
//4.等待"以太网"连接完成
//5.装载本地网络参数
//6.设置本地网络参数:MAC地址,GW网关,SN子网掩码,本地IP地址,DNS服务器IP地址,DHCP
void W5500_Initialization(void)
{uint8_t memsize[2][8] = {{2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}};//W5500发送和接收各有8个端口,这里定义每个端口的发送缓冲区和接收缓冲区的大小均为2K字节uint8_t tmp;W5500_SPI_Init();   //W5500 SPI初始化配置reg_wizchip_cris_cbfunc(SPI_CrisEnter, SPI_CrisExit);	//注册临界区函数reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect);//注册SPI片选信号函数reg_wizchip_spi_cbfunc(SPI_ReadByte, SPI_WriteByte);	//注册读写函数if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1){//W5500发送和接收各有8个端口,这里初始化每个端口的发送缓冲区和接收缓冲区的大小均为2K字节printf("WIZCHIP Initialized fail.\r\n");}//等待"以太网"连接完成, PHY link status checkdo{if(ctlwizchip(CW_GET_PHYLINK, (void*)&tmp) == -1){//读PHYCFGR寄存器bit0,若为1,则表示网络已经连接printf("Unknown PHY Link stauts.\r\n");}}while(tmp == PHY_LINK_OFF);W5500_Load_Net_Parameters();//装载W5500的本地网络参数和端口0的网络参数network_init();//设置本地网络参数:MAC地址,GW网关,SN子网掩码,本地IP地址,DNS服务器IP地址,DHCP
}//函数功能:端口0发送"I am W5500\r\n"
void SOCKET0_Send_Data(void)
{char buf[20];uint16_t len=0;memset(gDATABUF,'\0',sizeof(gDATABUF));strcpy(buf,"I am W5500\r\n");strcat((char*)gDATABUF,buf);len=strlen( (char*)gDATABUF );send(SOCK_TCPS,gDATABUF,len);//发送数据
}void SOCKET0_Work(void)
{uint16_t len=0;switch(getSn_SR(SOCK_TCPS))//获取W5500端口0的状态寄存器{case SOCK_INIT://W5500端口0已经初始化connect(SOCK_TCPS,DstIP_Port0,DstPort_Port0);//将W5500端口0连接到远程IP地址DstIP_Port0和远程端口DstPort_Port0上break;case SOCK_ESTABLISHED://W5500端口0已经连接成功if(getSn_IR(SOCK_TCPS) & Sn_IR_CON){//读端口0的Sn_IR中断标志寄存器的bit0setSn_IR(SOCK_TCPS, Sn_IR_CON);//回写清除中断标志}len=getSn_RX_RSR(SOCK_TCPS);//读端口0接收缓冲区的数据长度if(len){recv(SOCK_TCPS,gDATABUF,len);//读"W5500端口0"的数据,长度为len个字节,保存到gDATABUFprintf("%s\r\n",gDATABUF);send(SOCK_TCPS,gDATABUF,len);//将gDATABUF的前len个字节通过"W5500端口0"发送出去}SOCKET0_Send_Data();break;case SOCK_CLOSE_WAIT://W5500端口0处于等待关闭状态disconnect(SOCK_TCPS);//关闭端口0的连接break;case SOCK_CLOSED://W5500端口0处于关闭状态socket(SOCK_TCPS,Sn_MR_TCP,LocalPort0,0x00);//打开Socket0,打开一个本地端口break;}
}

6、TCP客户端应用程序W5500_HD_Driver.h头文件

#ifndef	_W5500_HD_Driver_H_
#define	_W5500_HD_Driver_H_#include "stm32f10x.h"//使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t
#include "wizchip_conf.h"extern wiz_NetInfo gWIZNETINFO;//W5500的网络参数#define SOCK_TCPS        0     //端口0
extern uint16_t LocalPort0;	   //端口0的端口号
extern uint8_t DstIP_Port0[4]; //端口0的远程IP地址
extern uint16_t	DstPort_Port0; //端口0的远程端口号#define DATA_BUF_SIZE   2048
extern uint8_t gDATABUF[DATA_BUF_SIZE];#define	W5500_CS_high()   GPIO_SetBits(GPIOA,GPIO_Pin_4)   //W5500片选引脚
#define	W5500_CS_low()    GPIO_ResetBits(GPIOA,GPIO_Pin_4) //W5500片选引脚extern void W5500_Initialization(void);
extern void SOCKET0_Work(void);
#endif

7、main.c程序

#include "stm32f10x.h"//使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "string.h" //使能strcpy(),strlen(),memset()
#include "delay.h"
#include "USART4.h"#include "LED.h"
#include "W5500_HD_Driver.h"//#include "W5500_Variable.h"const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";
int main(void)
{//	SCB->VTOR = 0x8000000;//中断向量表重定义//	SystemInit();delay_init();//延时函数初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4USART4_Serial_Interface_Enable(115200);printf("%s",CPU_Reset_REG);//调试串口输出"\r\nCPU reset!\r\n"W5500_Initialization();//1.初始化SPI接口//2.注册相关函数//3.设置W5500每个端口的发送缓冲区和接收缓冲区的大小均为2K字节//4.等待"以太网"连接完成//5.装载本地网络参数//6.设置本地网络参数:MAC地址,GW网关,SN子网掩码,本地IP地址,DNS服务器IP地址,DHCPLED_Init();LED0_ON();while(1){LED0=!LED0;delay_ms(1000);SOCKET0_Work();//W5500端口0工作}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

管理Oracle Data Guard的最佳实践

Oracle Data Guard的中文名字叫数据卫士,顾名思义,它是生产库的一道保障。所以管理Data Guard是DBA的一项重要工作之一,管理Data Guard时主要有以下几个注意点需要引起重视。 备份库的归档日志积压 一般情况下,生产库的归档日志是…

BootCDN介绍(Bootstrap主导的前端开源项目免费CDN加速服务)

文章目录 BootCDN前端开源项目CDN加速服务全解析什么是BootCDN技术原理与架构CDN技术基础BootCDN架构特点1. 全球分布式节点网络2. 智能DNS解析系统3. 高效缓存管理机制4. 自动同步更新机制5. HTTPS和HTTP/2协议支持 BootCDN的核心优势速度与稳定性开源免费资源丰富度技术规范遵…

2025 Java 微信小程序根据code获取openid,二次code获取手机号【工具类】拿来就用

一、controller调用 /*** 登录** author jiaketao* since 2024-04-10*/ RestController RequestMapping("/login") public class LoginController {/*** 【小程序】登录获取session_key和openid** param code 前端传code* return*/GetMapping("/getWXSessionKe…

软件架构风格系列(3):管道 - 过滤器架构

文章目录 前言一、从生活场景到架构原理,看懂管道 - 过滤器的核心逻辑(一)什么是管道 - 过滤器架构?(二)核心组件拆解 二、架构设计图:一图看懂管道 - 过滤器架构全貌三、Java 示例代码&#xf…

【VIM】vim 常用命令

文章目录 插入模式光标移动拷贝/粘贴/删除/撤销块操作分屏代码缩进命令组合使用其他PowerVim 前言:本文内容大部分摘抄自酷壳和博客园   –   CoolShell – 陈皓   博客园 – 易先讯 插入模式 a → 在光标后插入o → 在当前行后插入一个新行O → 在当前行前插…

polarctf-web-[简单rce]

考点&#xff1a; (1)RCE(eval函数) (2)执行函数(passthru函数) (3)/顶级(根)目录查看 (4)sort排序查看函数 题目来源&#xff1a;Polarctf-web-[简单rce] 解题&#xff1a; 代码审计 <?php/*​PolarD&N CTF​*/highlight_file(__FILE__);function no($txt){ # …

HarmonyOs开发之———使用HTTP访问网络资源

谢谢关注&#xff01;&#xff01; 前言&#xff1a;上一篇文章主要介绍HarmonyOs开发之———Video组件的使用:HarmonyOs开发之———Video组件的使用_华为 video标签查看-CSDN博客 HarmonyOS 网络开发入门&#xff1a;使用 HTTP 访问网络资源 HarmonyOS 作为新一代智能终端…

Vue 图片预览功能(含缩略图)

众所周知&#xff0c;常见的组件库如Element、Ant Design&#xff0c;自带的图片预览功能都没有缩略图&#xff0c;所以 需要单独封装一个图片预览的服务。 第三方库&#xff1a;v-viewer 安装&#xff1a; npm install v-viewer viewerjs 若使用报错&#xff0c;可安装指定…

手写tomcat:基本功能实现(4)

逻辑架构 HTTP 请求与 Socket&#xff1a; 左侧的 “HTTP 请求” 箭头指向 “socket”&#xff0c;表示客户端发送的 HTTP 请求通过 socket 传输到服务器。Socket 负责接收请求&#xff0c;并提取出其中的 请求路径&#xff08;如 /first&#xff09;和 请求方法&#xff08;如…

jvm安全点(一)openjdk17 c++源码垃圾回收安全点信号函数处理线程阻塞

1. 信号处理入口​​ ​​JVM_HANDLE_XXX_SIGNAL​​ 是 JVM 处理信号的统一入口&#xff0c;负责处理 SIGSEGV、SIGBUS 等信号。​​javaSignalHandler​​ 是实际注册到操作系统的信号处理函数&#xff0c;直接调用 JVM_HANDLE_XXX_SIGNAL。 ​​2. 安全点轮询页的识别​​ …

微信小程序:封装表格组件并引用

一、效果 封装表格组件,在父页面中展示表格组件并显示数据 二、表格组件 1、创建页面 创建一个components文件夹,专门用于存储组件的文件夹 创建Table表格组件 2、视图层 (1)表头数据 这里会从父组件中传递表头数据,这里为columns,后续会讲解数据由来 循环表头数组,…

【FMC216】基于 VITA57.1 的 2 路 TLK2711 发送、2 路 TLK2711 接收 FMC 子卡模块

产品概述 FMC216 是一款基于 VITA57.1 标准规范的 2 路 TLK2711 接收、2 路 TLK2711 发送 FMC 子卡模块。该板卡支持 2 路 TLK2711 数据的收发&#xff0c;支持线速率 1.6Gbps&#xff0c;经过 TLK2711 高速串行收发器&#xff0c;可以将 1.6Gbps 的高速串行数据解串为 16 位并…

K8S Gateway API 快速开始、胎教级教程

假设有如下三个节点的 K8S 集群&#xff1a; ​​ k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、Gateway 是什么 背景和目的 入口&#xff08;Ingress&#xff09;目前已停止更新。新的功能正在集成至网关 API 中。在 Kubernetes …

时序数据库IoTDB分布式架构解析与运维指南

一、IoTDB分布式架构概述 分布式系统由一组独立的计算机组成&#xff0c;通过网络通信&#xff0c;对外表现为一个统一的整体。IoTDB的原生分布式架构将服务分为两个核心部分&#xff1a; ‌ConfigNode&#xff08;CN&#xff09;‌&#xff1a;管理节点&#xff0c;负责管理…

Ubuntu 20.04 LTS 中部署 网页 + Node.js 应用 + Nginx 跨域配置 的详细步骤

Ubuntu 20.04 LTS 中部署 网页 Node.js 应用 Nginx 跨域配置 的详细步骤 一、准备工作1、连接服务器2、更新系统 二、安装 Node.js 环境1、安装 Node.js 官方 PPA&#xff08;用于获取最新稳定版&#xff09;&#xff1a;2、安装 Node.js 和 npm&#xff08;LTS 长期支持版本…

3DVR制作的工具或平台

3DVR&#xff08;三维虚拟现实&#xff09;是利用三维图像技术和虚拟现实技术&#xff0c;将真实场景进行三维扫描并转换成计算机可识别的三维模型&#xff0c;使用户能够在虚拟空间中自由漫游&#xff0c;体验身临其境的感觉。3DVR技术结合了全景拍摄和虚拟现实&#xff0c;提…

垂直智能体:企业AI落地的正确打开方式

在当前AI浪潮中&#xff0c;许多企业急于跟进&#xff0c;推出自己的AI智能体解决方案。然而&#xff0c;市场上大量出现的"万能型"智能体却鲜有真正解决实际问题的产品。本文将探讨为何企业应该专注于开发垂直领域智能体&#xff0c;而非追求表面上的全能&#xff0…

软件工程各种图总结

目录 1.数据流图 2.N-S盒图 3.程序流程图 4.UML图 UML用例图 UML状态图 UML时序图 5.E-R图 首先要先了解整个软件生命周期&#xff1a; 通常包含以下五个阶段&#xff1a;需求分析-》设计-》编码 -》测试-》运行和维护。 软件工程中应用到的图全部有&#xff1a;系统…

王者荣耀游戏测试场景题

如何测试一个新英雄&#xff1a;方法论与实践维度 测试一个新英雄不仅仅是“打打打”&#xff0c;而是一套完整的测试流程&#xff0c;包括设计文档验证、功能验证、数值验证、性能验证、交互验证等。可以从以下多个角度展开&#xff1a; &#x1f50d; 1. 方法论维度 ✅ 测试…

第四天的尝试

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 很抱歉的说一下&#xff0c;我昨天看白色巨塔电视剧&#xff0c;看的入迷了&#xff0c;同时也看出一些道理&#xff0c;学到东西&#xff1b; 但是把昨天的写事情给忘记了&#xff0c;今天…