FPGA - 以太网UDP通信(二)

一,引言

前文链接:FPGA - 以太网UDP通信(一)

在上文章中介绍了以太网简介,以太网UDP通信硬件结构,以及PHY芯片RGMII接口-GMII接口转换逻辑,接下来介绍UDP通信结构框图以及数据链路层(MAC层)接受发送逻辑。

二,以太网UDP通信结构框图

在上一篇文章中介绍了以太网UDP通信组包过程图:

可以看到用户数据通过UDP层添加udp头部,然后经过IP层添加ip头部,在经过数据链路层(MAC层)添加mac头部,送到PHY芯片物理层。一步步完成组包发送过程。同样的,从PHT芯片输出的数据经过MAC层IP层UDP层一步步完成解包校验过程。因此根据此思路画出简易结构框图如下:

在上篇文章中实现了rgmii_interface(rgmii_receive和rgmii_send)模块,接下来实现mac_layermac_receivemac_send)模块。

三,数据链路层(MAC层)

MAC不是物理层,MAC层是数据链路层的两个子层之一。

以太网V2的MAC帧格式:

------------------------------------- mac数据包头  22byte  -------------------------------------      

|     前导码(前同步码) 7 byte                                                                           |  
|     8'h55             ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​                                              ​​​​​​​        ​​​​​​​   |

|     SFD(帧开始定结符)  1byte     ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​   |
|     8'hd5     ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​                                         |

|     目的mac地址 6byte     ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​            ​​​​​​​      |

|     源mac地址   6byte     ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​                    |

|     类型/长度   2byte     ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​            ​​​​​​​        ​​​​​​​   |
|     小于1536表示长度,     ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​            ​​​​​​​     |
|     大于1536表示类型 arp:16'h0806 , ip: 16'h0800     ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​|

|     数据 46-1500byte     ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​                      |

|     FCS(帧校验序列CRC) 4byte     ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​|

---------------------------------------------------------------------------------------------------------- 

四,MAC层代码设计

在上面的结构框图中,可以看到,mac_layer中包括mac_receivemac_send模块。

----------------------------------------------------------  思路 ------------------------------------------------------------

1,在MAC帧格式中,最后4byte 是FCS(帧校验序列CRC), 所以在接受和发送过程中必须把帧校验序列前面的数据存储(fifo)起来,等到CRC校验完成,再进行数据传输。

2,在以太网UDP通信中,用户端数据传输是在用户时钟下进行的,而PHY芯片数据传输是在PHY芯片的时钟下进行的。所以在这里我们要做一个跨时钟域的处理。

3,跨时钟域处理:在多bit信号跨时钟域中常常使用异步fifo来处理,但如何很好的设计这一处理过程呢?在这里我们进行双fifo跨时钟域(其实在之前文章中也用过这样的处理方式)。

首先第一个是数据fifo,缓存有效数据+last数据(用来指示有效数据的最后一个数据)

其次第二个是控制fifo,缓存数据对应的地址,长度,类型.....(在mac_layer中缓存的是帧类型和CRC校验结果)

然后判断fifo非空(rdemoty信号为低), 就把有效数据和控制信息从fifo里面读出来,

控制fifo的读使能rden只需要拉高一拍,数据fifo读使能rden要一直拉高,直到读出来最后一个数据,通过判断读出来的last信号,来拉低rden。

4,CRC校验

5,如何准确有效的进行数据组包,解包校验呢?

设置计数器,接受端设置rx_cnt,发送端设置tx_cnt。用计数器控制组包解包校验过程。

下图是mac_lay层的结构框图:

-----------------------------------------------------------------------------------------------------------------------------

五,MAC层代码编写

CRC32校验:

CRC校验

`timescale 1ns / 1psmodule crc32_d8(input				clk,input               reset,input               crc_din_vld,input   [7:0]       crc_din    ,input               crc_done   ,output  [31:0]      crc_dout   );wire [7:0]  crc_din_r;
reg  [31:0] crc_dout_r;
wire [31:0] crc_data;assign crc_din_r = {crc_din[0],crc_din[1],crc_din[2],crc_din[3],crc_din[4],crc_din[5],crc_din[6],crc_din[7]};
assign crc_dout  = ~{crc_dout_r[0],crc_dout_r[1],crc_dout_r[2],crc_dout_r[3],crc_dout_r[4],crc_dout_r[5],crc_dout_r[6],crc_dout_r[7],crc_dout_r[8],crc_dout_r[9],crc_dout_r[10],crc_dout_r[11],crc_dout_r[12],crc_dout_r[13],crc_dout_r[14],crc_dout_r[15],crc_dout_r[16],crc_dout_r[17],crc_dout_r[18],crc_dout_r[19],crc_dout_r[20],crc_dout_r[21],crc_dout_r[22],crc_dout_r[23],crc_dout_r[24],crc_dout_r[25],crc_dout_r[26],crc_dout_r[27],crc_dout_r[28],crc_dout_r[29],crc_dout_r[30],crc_dout_r[31]};assign crc_data[0] = crc_din_r[6] ^ crc_din_r[0] ^ crc_dout_r[24] ^ crc_dout_r[30];
assign crc_data[1] = crc_din_r[7] ^ crc_din_r[6] ^ crc_din_r[1] ^ crc_din_r[0] ^ crc_dout_r[24] ^ crc_dout_r[25] ^ crc_dout_r[30] ^ crc_dout_r[31];
assign crc_data[2] = crc_din_r[7] ^ crc_din_r[6] ^ crc_din_r[2] ^ crc_din_r[1] ^ crc_din_r[0] ^ crc_dout_r[24] ^ crc_dout_r[25] ^ crc_dout_r[26] ^ crc_dout_r[30] ^ crc_dout_r[31];
assign crc_data[3] = crc_din_r[7] ^ crc_din_r[3] ^ crc_din_r[2] ^ crc_din_r[1] ^ crc_dout_r[25] ^ crc_dout_r[26] ^ crc_dout_r[27] ^ crc_dout_r[31];
assign crc_data[4] = crc_din_r[6] ^ crc_din_r[4] ^ crc_din_r[3] ^ crc_din_r[2] ^ crc_din_r[0] ^ crc_dout_r[24] ^ crc_dout_r[26] ^ crc_dout_r[27] ^ crc_dout_r[28] ^ crc_dout_r[30];
assign crc_data[5] = crc_din_r[7] ^ crc_din_r[6] ^ crc_din_r[5] ^ crc_din_r[4] ^ crc_din_r[3] ^ crc_din_r[1] ^ crc_din_r[0] ^ crc_dout_r[24] ^ crc_dout_r[25] ^ crc_dout_r[27] ^ crc_dout_r[28] ^ crc_dout_r[29] ^ crc_dout_r[30] ^ crc_dout_r[31];
assign crc_data[6] = crc_din_r[7] ^ crc_din_r[6] ^ crc_din_r[5] ^ crc_din_r[4] ^ crc_din_r[2] ^ crc_din_r[1] ^ crc_dout_r[25] ^ crc_dout_r[26] ^ crc_dout_r[28] ^ crc_dout_r[29] ^ crc_dout_r[30] ^ crc_dout_r[31];
assign crc_data[7] = crc_din_r[7] ^ crc_din_r[5] ^ crc_din_r[3] ^ crc_din_r[2] ^ crc_din_r[0] ^ crc_dout_r[24] ^ crc_dout_r[26] ^ crc_dout_r[27] ^ crc_dout_r[29] ^ crc_dout_r[31];
assign crc_data[8] = crc_din_r[4] ^ crc_din_r[3] ^ crc_din_r[1] ^ crc_din_r[0] ^ crc_dout_r[0] ^ crc_dout_r[24] ^ crc_dout_r[25] ^ crc_dout_r[27] ^ crc_dout_r[28];
assign crc_data[9] = crc_din_r[5] ^ crc_din_r[4] ^ crc_din_r[2] ^ crc_din_r[1] ^ crc_dout_r[1] ^ crc_dout_r[25] ^ crc_dout_r[26] ^ crc_dout_r[28] ^ crc_dout_r[29];
assign crc_data[10] = crc_din_r[5] ^ crc_din_r[3] ^ crc_din_r[2] ^ crc_din_r[0] ^ crc_dout_r[2] ^ crc_dout_r[24] ^ crc_dout_r[26] ^ crc_dout_r[27] ^ crc_dout_r[29];
assign crc_data[11] = crc_din_r[4] ^ crc_din_r[3] ^ crc_din_r[1] ^ crc_din_r[0] ^ crc_dout_r[3] ^ crc_dout_r[24] ^ crc_dout_r[25] ^ crc_dout_r[27] ^ crc_dout_r[28];
assign crc_data[12] = crc_din_r[6] ^ crc_din_r[5] ^ crc_din_r[4] ^ crc_din_r[2] ^ crc_din_r[1] ^ crc_din_r[0] ^ crc_dout_r[4] ^ crc_dout_r[24] ^ crc_dout_r[25] ^ crc_dout_r[26] ^ crc_dout_r[28] ^ crc_dout_r[29] ^ crc_dout_r[30];
assign crc_data[13] = crc_din_r[7] ^ crc_din_r[6] ^ crc_din_r[5] ^ crc_din_r[3] ^ crc_din_r[2] ^ crc_din_r[1] ^ crc_dout_r[5] ^ crc_dout_r[25] ^ crc_dout_r[26] ^ crc_dout_r[27] ^ crc_dout_r[29] ^ crc_dout_r[30] ^ crc_dout_r[31];
assign crc_data[14] = crc_din_r[7] ^ crc_din_r[6] ^ crc_din_r[4] ^ crc_din_r[3] ^ crc_din_r[2] ^ crc_dout_r[6] ^ crc_dout_r[26] ^ crc_dout_r[27] ^ crc_dout_r[28] ^ crc_dout_r[30] ^ crc_dout_r[31];
assign crc_data[15] = crc_din_r[7] ^ crc_din_r[5] ^ crc_din_r[4] ^ crc_din_r[3] ^ crc_dout_r[7] ^ crc_dout_r[27] ^ crc_dout_r[28] ^ crc_dout_r[29] ^ crc_dout_r[31];
assign crc_data[16] = crc_din_r[5] ^ crc_din_r[4] ^ crc_din_r[0] ^ crc_dout_r[8] ^ crc_dout_r[24] ^ crc_dout_r[28] ^ crc_dout_r[29];
assign crc_data[17] = crc_din_r[6] ^ crc_din_r[5] ^ crc_din_r[1] ^ crc_dout_r[9] ^ crc_dout_r[25] ^ crc_dout_r[29] ^ crc_dout_r[30];
assign crc_data[18] = crc_din_r[7] ^ crc_din_r[6] ^ crc_din_r[2] ^ crc_dout_r[10] ^ crc_dout_r[26] ^ crc_dout_r[30] ^ crc_dout_r[31];
assign crc_data[19] = crc_din_r[7] ^ crc_din_r[3] ^ crc_dout_r[11] ^ crc_dout_r[27] ^ crc_dout_r[31];
assign crc_data[20] = crc_din_r[4] ^ crc_dout_r[12] ^ crc_dout_r[28];
assign crc_data[21] = crc_din_r[5] ^ crc_dout_r[13] ^ crc_dout_r[29];
assign crc_data[22] = crc_din_r[0] ^ crc_dout_r[14] ^ crc_dout_r[24];
assign crc_data[23] = crc_din_r[6] ^ crc_din_r[1] ^ crc_din_r[0] ^ crc_dout_r[15] ^ crc_dout_r[24] ^ crc_dout_r[25] ^ crc_dout_r[30];
assign crc_data[24] = crc_din_r[7] ^ crc_din_r[2] ^ crc_din_r[1] ^ crc_dout_r[16] ^ crc_dout_r[25] ^ crc_dout_r[26] ^ crc_dout_r[31];
assign crc_data[25] = crc_din_r[3] ^ crc_din_r[2] ^ crc_dout_r[17] ^ crc_dout_r[26] ^ crc_dout_r[27];
assign crc_data[26] = crc_din_r[6] ^ crc_din_r[4] ^ crc_din_r[3] ^ crc_din_r[0] ^ crc_dout_r[18] ^ crc_dout_r[24] ^ crc_dout_r[27] ^ crc_dout_r[28] ^ crc_dout_r[30];
assign crc_data[27] = crc_din_r[7] ^ crc_din_r[5] ^ crc_din_r[4] ^ crc_din_r[1] ^ crc_dout_r[19] ^ crc_dout_r[25] ^ crc_dout_r[28] ^ crc_dout_r[29] ^ crc_dout_r[31];
assign crc_data[28] = crc_din_r[6] ^ crc_din_r[5] ^ crc_din_r[2] ^ crc_dout_r[20] ^ crc_dout_r[26] ^ crc_dout_r[29] ^ crc_dout_r[30];
assign crc_data[29] = crc_din_r[7] ^ crc_din_r[6] ^ crc_din_r[3] ^ crc_dout_r[21] ^ crc_dout_r[27] ^ crc_dout_r[30] ^ crc_dout_r[31];
assign crc_data[30] = crc_din_r[7] ^ crc_din_r[4] ^ crc_dout_r[22] ^ crc_dout_r[28] ^ crc_dout_r[31];
assign crc_data[31] = crc_din_r[5] ^ crc_dout_r[23] ^ crc_dout_r[29];always @(posedge clk) beginif (reset) crc_dout_r <= 32'hffffffff;else if (crc_done) crc_dout_r <= 32'hffffffff;else if (crc_din_vld)crc_dout_r <= crc_data;else crc_dout_r <= crc_dout_r; 
endendmodule

mac_receive

mac_receive代码:

//功能 :  ①完成校验,将有效数据和MAC头部分离出来
//        ②跨时钟域
// -----------------------------------------------------------------------------
`timescale 1ns / 1psmodule mac_receive #(parameter	LOCAL_MAC_ADDR = 48'hffffff_ffffff,parameter   CRC_CHACK_EN   = 1)(input								clk             , //用户接受端时钟input                               phy_rx_clk      , //phy芯片提供的时钟input                               reset            , //用户端复位信号input                               phy_rx_reset     , //phy接受端复位/*-------rgmii_recive模块交互的信号----------------*/input                               gmii_rx_data_vld ,input       [7:0]                   gmii_rx_data     ,/*-------mac_to_arp_ip模块交互的信号----------------*/	output  reg                         mac_rx_data_vld  ,output  reg                         mac_rx_data_last ,output  reg [7:0]                   mac_rx_data      ,output  reg [15:0]                  mac_rx_frame_type,/*-------rx_crc32_d8模块交互的信号----------------*/	   output  reg 					    rx_crc_din_vld   ,output  reg [7:0]                   rx_crc_din       ,output  reg                         rx_crc_done      ,input       [31:0]                  rx_crc_dout         );endmodule

mac_send

mac_send代码:

//功能    ① 完成crc校验 mac头部 有效数据 crc校验 ...等组包
//        ② 跨时钟域 
// -----------------------------------------------------------------------------
`timescale 1ns / 1ps
module mac_send #(parameter	LOCAL_MAC_ADDR  = 48'hffffff_ffffff,parameter   TARGET_MAC_ADDR = 48'hffffff_ffffff	)(input								clk             , //用户发送端时钟input                               phy_tx_clk      , input                               reset            , input                               phy_tx_reset     , /*-------rgmii_send模块交互的信号----------------*/output  reg                         gmii_tx_data_vld ,output  reg [7:0]                   gmii_tx_data     ,/*-------ip_send模块交互的信号--------------------*/	input                               mac_tx_data_vld  ,input                               mac_tx_data_last ,input       [7:0]                   mac_tx_data      ,input       [15:0]                  mac_tx_frame_type,input       [15:0]                  mac_tx_length    ,/*-------tx_crc32_d8模块交互的信号----------------*/	   output  reg 					    tx_crc_din_vld   ,output      [7:0]                   tx_crc_din       ,output  reg                         tx_crc_done      ,input       [31:0]                  tx_crc_dout    	);endmodule 

顶层设计

mac层分别实现了接收和发送两部分,将两部分例化封装顶层mac_layer

`timescale 1ns / 1psmodule mac_layer #(parameter	LOCAL_MAC_ADDR  = 48'hffffff_ffffff   ,parameter   TARGET_MAC_ADDR = 48'hffffff_ffffff	,	parameter   CRC_CHACK_EN    = 1                )(input                               app_tx_clk       ,input                               app_rx_clk       ,input                               phy_tx_clk       , input                               phy_rx_clk       , 	input                               app_tx_reset     ,input                               app_rx_reset     ,input                               phy_tx_reset     , input                               phy_rx_reset     , input                               gmii_rx_data_vld ,input       [7:0]                   gmii_rx_data     ,output                              gmii_tx_data_vld ,output      [7:0]                   gmii_tx_data     ,	output                              mac_rx_data_vld  ,output                              mac_rx_data_last ,output      [7:0]                   mac_rx_data      ,output      [15:0]                  mac_rx_frame_type,		input                               mac_tx_data_vld  ,input                               mac_tx_data_last ,input       [7:0]                   mac_tx_data      ,input       [15:0]                  mac_tx_frame_type,input       [15:0]                  mac_tx_length    );wire        tx_crc_din_vld;wire  [7:0] tx_crc_din    ;wire        tx_crc_done   ;wire [31:0] tx_crc_dout   ;wire        rx_crc_din_vld;wire  [7:0] rx_crc_din    ;wire        rx_crc_done   ;wire [31:0] rx_crc_dout   ;mac_send #(.LOCAL_MAC_ADDR(LOCAL_MAC_ADDR),.TARGET_MAC_ADDR(TARGET_MAC_ADDR)) mac_send (.clk               (app_tx_clk),.phy_tx_clk        (phy_tx_clk),.reset             (app_tx_reset),.phy_tx_reset      (phy_tx_reset),.gmii_tx_data_vld  (gmii_tx_data_vld),.gmii_tx_data      (gmii_tx_data),.mac_tx_data_vld   (mac_tx_data_vld),.mac_tx_data_last  (mac_tx_data_last),.mac_tx_data       (mac_tx_data),.mac_tx_frame_type (mac_tx_frame_type),.mac_tx_length     (mac_tx_length),.tx_crc_din_vld    (tx_crc_din_vld),.tx_crc_din        (tx_crc_din),.tx_crc_done       (tx_crc_done),.tx_crc_dout       (tx_crc_dout));mac_receive #(.LOCAL_MAC_ADDR(LOCAL_MAC_ADDR),.CRC_CHACK_EN  (CRC_CHACK_EN)) mac_receive (.clk               (app_rx_clk),.phy_rx_clk        (phy_rx_clk),.reset             (app_rx_reset),.phy_rx_reset      (phy_rx_reset),.gmii_rx_data_vld  (gmii_rx_data_vld),.gmii_rx_data      (gmii_rx_data),.mac_rx_data_vld   (mac_rx_data_vld),.mac_rx_data_last  (mac_rx_data_last),.mac_rx_data       (mac_rx_data),.mac_rx_frame_type (mac_rx_frame_type),.rx_crc_din_vld    (rx_crc_din_vld),.rx_crc_din        (rx_crc_din),.rx_crc_done       (rx_crc_done),.rx_crc_dout       (rx_crc_dout));crc32_d8 tx_crc32_d8(.clk         (phy_tx_clk),.reset       (phy_tx_reset),.crc_din_vld (tx_crc_din_vld),.crc_din     (tx_crc_din),.crc_done    (tx_crc_done),.crc_dout    (tx_crc_dout));crc32_d8 rx_crc32_d8(.clk         (phy_rx_clk),.reset       (phy_rx_reset),.crc_din_vld (rx_crc_din_vld),.crc_din     (rx_crc_din),.crc_done    (rx_crc_done),.crc_dout    (rx_crc_dout));endmodule

 六,总结

至此,我们完成了以太网发送过程中最底层 ,也是最重要的部分MAC层的发送与接受。 关于本节中的CRC校验部分没有过多介绍,这部分可通过CRC生成网页来生成CRC校验代码。

接下来,在下一篇博客中将会实现ip层的接收与发送。

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

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

相关文章

Python | Leetcode Python题解之第28题找出字符串中的第一个匹配项的下标

题目&#xff1a; 题解&#xff1a; class Solution:def strStr(self, haystack: str, needle: str) -> int:# Func: 计算偏移表def calShiftMat(st):dic {}for i in range(len(st)-1,-1,-1):if not dic.get(st[i]):dic[st[i]] len(st)-idic["ot"] len(st)1re…

自己开发的App如何上架,详细解读App上架操作流程

对于企业或个人开发的App&#xff0c;上架是必经之路。然而&#xff0c;许多人不清楚如何进行App上架。工信部在2023年规定&#xff0c;App必须备案才能上架。那么&#xff0c;让我们一起了解App上架流程吧。 1. 准备上架所需材料 在上架App之前&#xff0c;需要准备应用图标…

类加载子系统

目录 类的加载 加载流程 类的加载器 类的链接 类的检验阶段 类的准备阶段 类的解析阶段 类的初始化 static与final的搭配问题 ()的线程安全性 类的初始化情况&#xff1a;主动使用vs被动使用 类的使用 类的卸载 类、类的加载器、类的实例之间的引用关系 类的生命…

端口协议(爆破、未授权)

常见端口服务及攻击方向&#xff1a; 弱口令爆破 工具&#xff1a;https://github.com/vanhauser-thc/thc-hydra hydra是一个支持多协议的自动化的爆破工具。 支持的服务、协议&#xff1a; telnet ftp pop3[-ntlm] imap[-ntlm] smb smbnt http-{head|get} http-{get|post}-…

深度学习入门(3)

一、感知机 感知机接收多个输入信号&#xff0c;输出一个信号。这里所说的“信号”可以想象成电流或河流那样具备“流动性”的东西。 但是&#xff0c;和实际的电 流不同的是&#xff0c;感知机的信号只有“流 / 不流”&#xff08; 1 / 0 &#xff09;两种取值。在本书中&…

【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩

文章目录 背景介绍 初始代码 优化代码 分析和应用 总结 背景介绍 在一个嵌入式软件开发项目中&#xff0c;有一个使用MATLAB Function编写的算法模块&#xff0c;功能是从一个较大的数组中提取一段数据&#xff0c;然后求均值输出&#xff0c;示例如下&#xff1a; 初始代…

Python和Java哪个更适合后端开发?

Python和Java都是强大的后端开发语言&#xff0c;它们各自有鲜明的特点和适用场景。选择哪一个更适合后端开发&#xff0c;主要取决于具体的项目需求、团队技术栈、个人技能偏好以及长期发展考虑等因素。 下面是两者在后端开发中的优势和劣势&#xff1a; 「Python&#xff1…

Maven超详细使用

定义 是一款用于管理和构建java项目的工具 作用 1. 依赖管理 2. 统一项目结构 3. 项目构建 项目目录结构 POM 项目对象模型 (Project Object Model) POM (Project Object Model) &#xff1a;指的是项目对象模型&#xff0c;用来描述当前的maven项目。 仓库 本地仓库&#…

银河麒麟高级服务器操作系统adb读写缓慢问题分析

1.问题环境 处理器&#xff1a; HUAWEI Kunpeng 920 5251K 内存&#xff1a; 512 GiB 整机类型/架构&#xff1a; TaiShan 200K (Model 2280K) BIOS版本&#xff1a; Byosoft Corp. 1.81.K 内核版本 4.19.90-23.15.v2101.ky10.aarch64 第三方应用 数据库 2.问题…

苹果个人证书管理

根据近日工业和信息化部发布的《工业和信息化部关于开展移动互联网应用程序备案工作的通知》&#xff0c;相信不少要进行IOS平台App备案的朋友遇到了一个问题&#xff0c;就是apple不提供云管理式证书的下载&#xff0c;也就无法获取公钥及证书SHA-1指纹。 已经上架的应用不想重…

瑞芯微RK3568/RK3588+鸿蒙,矿鸿工控屏、矿鸿工控板、矿鸿网关,推动矿业数智化变革

4月10日至12日&#xff0c;以“绿色智能创新&#xff0c;携手共赢未来”为主题的第二届中国国际矿业装备与技术展览会在西安举行。信迈科技携矿鸿解决方案及产品亮相&#xff0c;赋能矿山行业数智化升级和国产化改造进程全面提速。 作为华为矿山军团矿鸿生态使能合作伙伴&#…

【位运算】3097. 或值至少为 K 的最短子数组 II

本文涉及知识点 位运算 LeetCode3097. 或值至少为 K 的最短子数组 II 给你一个 非负 整数数组 nums 和一个整数 k 。 如果一个数组中所有元素的按位或运算 OR 的值 至少 为 k &#xff0c;那么我们称这个数组是 特别的 。 请你返回 nums 中 最短特别非空 子数组 的长度&…

数据可视化-ECharts Html项目实战(10)

在之前的文章中&#xff0c;我们学习了如何在ECharts中编写雷达图&#xff0c;实现特殊效果的插入运用&#xff0c;函数的插入&#xff0c;以及多图表雷达图。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&…

国内免费中文版ChatGPT网站入口(2024/4/15)

首先向大家介绍一些基本信息&#xff1a;ChatGPT3.5在官方网站上是可以免费使用的&#xff0c;而ChatGPT4.0则采取按月收费的模式&#xff0c;价格为20美元&#xff08;约合140元人民币&#xff09;。因此&#xff0c;所谓的免费使用主要指的是GPT3.5。如果有人声称GPT4.0也是免…

vite+vue3+antDesignVue 记录-持续记录

记录学习过程 持续补充 每天的学习点滴 开始时间2024-04-12 1&#xff0c;报错记录 &#xff08;1&#xff09;env.d.ts文件 解决方法&#xff1a; 在env.d.ts文件中添加以下代码&#xff08;可以看一下B站尚硅谷的讲解视频&#xff09; declare module *.vue {import { Defi…

关于centos8自带的apache2.4开启https后,XP系统的IE8无法显示网页的问题

经检验&#xff0c;是因为系统的apache和openssl版本太高导致的。 禁用系统默认的apache2.4&#xff0c;自己重新源码编译安装一套openssl-1.0.1fapache2.2.23php7.1.2即可。跟update-crypto-policies没有关系&#xff0c;可保持默认的DEFAULT状态。 关于centos8自带的apache2…

数据结构从入门到实战——顺序表

目录 前言 一、顺序表的概念及结构 1.1 线性表 二、顺序表分类 三、动态顺序表的实现 3.1 顺序表结构的创建以及初始化 3.2 顺序表的销毁 3.3 顺序表的打印 3.4 尾插数据 ——最困难的 3.5 头插数据 3.6 尾删数据 3.7 头部删除数据 前言 在计算机科学和数据结…

不饱和脂肪酸的综述

1.概述 不饱和脂肪酸是一类脂肪酸&#xff0c;其碳链上存在双键&#xff08;不饱和键&#xff09;。根据双键的数量和位置&#xff0c;不饱和脂肪酸可以进一步分为以下两类&#xff1a; 单不饱和脂肪酸&#xff08;Monounsaturated fatty acids&#xff0c;简称MUFA&#xff0…

excel添加折线图,如何将日期作为横坐标?

就这么两列数据&#xff0c;想添加一个以日期为横坐标的折线图&#xff0c;但是出来的折线是这个样子&#xff0c;切换行/列也不行&#xff0c;怎么办呢&#xff1f; 实际上这个折线图中包括两条折线&#xff0c;蓝色的是日期的折线&#xff0c;橙色的是时间的折线&#xff0c;…

夜月一帘幽梦,春风十里“三指针法“ (链表面试题篇2)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…