Zynq-Linux移植学习笔记之67- 国产ZYNQ上通过GPIO模拟MDC/MDIO协议

1、背景介绍

模块上有9个PHY,其中两个PHY通过ZYNQ PS端的MDIO总线连接,其余7个PHY单独通过GPIO进行控制,需要实现GPIO模拟MDC/MDIO协议。

2、vivado工程设计

vivado工程内为每个PHY建立两个GPIO IP核,分别用来代表MDC和MDIO(虽然有点浪费)

MDC配置为默认输出

MDIO配置为双向

MDIO管脚默认上拉

3、MDIO时序介绍

MDIO接口包括两条线,MDIO和MDC,其中MDIO是双向数据线,而MDC是由STA驱动的时钟线。MDC时钟的最高速率一般为2.5MHz,MDC也可以是非固定频率,甚至可以是非周期的。MDIO接口只是会在MDC时钟的上升沿进行采样,而并不在意MDC时钟的频率(类似于I2C接口)。MDIO是一个PHY的管理接口,用来读/写PHY的寄存器,以控制PHY的行为或获取PHY的状态,MDC为MDIO提供时钟。

Preamble+Start:32bits的前导码以及2bit的开始位。

OP Code:2bits的操作码,10表示读,01表示写。

PHYAD:5bits的PHY地址,一般PHY地址,从0开始顺序编号,例如6口switch中PHY地址为0-5。

REGAD:5bits的寄存器地址,即要读或写的寄存器。

Turn Around:2bits的TA,在读命令中,MDIO在此时由MAC驱动改为PHY驱动,并等待一个时钟周期准备发送数据。在写命令中,不需要MDIO方向发生变化,则只是等待两个时钟周期准备写入数据。

Data:16bits数据,在读命令中,PHY芯片将读到的对应PHYAD的REGAD寄存器的数据写到Data中,在写命令中,MAC将要写入对应PHYAD的REGAD寄存器的值写入Data中。

Idle:空闲状态,此时MDIO无源驱动,处高阻状态,但一般用上拉电阻使其处在高电平,上拉电阻一般为1.5K。(空闲电平是低电平)

逻辑分析上抓到的示意图如下:

4、应用程序设计

参考上面的时序,采用GPIO翻转实现,注意AXI GPIO IP核0x4写0为输出,写1为输入,主要是用来操作MDIO方向

代码如下:

/** Copyright (c) 2012 Xilinx, Inc.  All rights reserved.** Xilinx, Inc.* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A* COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS* ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR* STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION* IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE* FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.* XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO* THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO* ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE* FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY* AND FITNESS FOR A PARTICULAR PURPOSE.**/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <linux/mii.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/sockios.h>
#include <linux/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include "xil_io.h"#define  PHY2_YT8521_ADDR                             0x01
#define  PHY3_YT8521_ADDR                             0x02
#define  PHY5_YT8521_ADDR                             0x04
#define  PHY6_YT8521_ADDR                             0x05
#define  PHY7_YT8521_ADDR                             0x06
#define  PHY8_YT8521_ADDR                             0x07
#define  PHY9_YT8521_ADDR                             0x00#define  PHY_YT8521_ID_REG_ADDR                      0x03
#define  PHY_YT8521_REG_DEBUG_ADDR_OFFSET            0x1E
#define  PHY_YT8521_REG_DEBUG_DATA                   0x1F
#define  PHY_YT8521_EXT_REG_ADDR                     0xa00d#define MDC2_GPIO_ADDR 0x412B0000
#define MDC3_GPIO_ADDR 0x412D0000
#define MDC5_GPIO_ADDR 0x412F0000
#define MDC6_GPIO_ADDR 0x41310000
#define MDC7_GPIO_ADDR 0x41330000
#define MDC8_GPIO_ADDR 0x41350000
#define MDC9_GPIO_ADDR 0x41370000#define MDIO2_GPIO_ADDR 0x412C0000
#define MDIO3_GPIO_ADDR 0x412E0000
#define MDIO5_GPIO_ADDR 0x41300000
#define MDIO6_GPIO_ADDR 0x41320000
#define MDIO7_GPIO_ADDR 0x41340000
#define MDIO8_GPIO_ADDR 0x41360000
#define MDIO9_GPIO_ADDR 0x41380000#define PHY2_SOFT_SMI_MDIO_READ Xil_In32(MDIO2_GPIO_ADDR)
#define PHY3_SOFT_SMI_MDIO_READ Xil_In32(MDIO3_GPIO_ADDR)
#define PHY5_SOFT_SMI_MDIO_READ Xil_In32(MDIO5_GPIO_ADDR)
#define PHY6_SOFT_SMI_MDIO_READ Xil_In32(MDIO6_GPIO_ADDR)
#define PHY7_SOFT_SMI_MDIO_READ Xil_In32(MDIO7_GPIO_ADDR)
#define PHY8_SOFT_SMI_MDIO_READ Xil_In32(MDIO8_GPIO_ADDR)
#define PHY9_SOFT_SMI_MDIO_READ Xil_In32(MDIO9_GPIO_ADDR)typedef unsigned char u8;
typedef unsigned short u16;void mdio_out(int index)
{switch(index){case 2:Xil_Out32(MDIO2_GPIO_ADDR+0x4,0x0);break;case 3:Xil_Out32(MDIO3_GPIO_ADDR+0x4,0x0);break;case 5:Xil_Out32(MDIO5_GPIO_ADDR+0x4,0x0);break;case 6:Xil_Out32(MDIO6_GPIO_ADDR+0x4,0x0);break;case 7:Xil_Out32(MDIO7_GPIO_ADDR+0x4,0x0);break;case 8:Xil_Out32(MDIO8_GPIO_ADDR+0x4,0x0);break;case 9:Xil_Out32(MDIO9_GPIO_ADDR+0x4,0x0);break;default:break;}}void mdio_in(int index)
{switch(index){case 2:Xil_Out32(MDIO2_GPIO_ADDR+0x4,0x1);break;case 3:Xil_Out32(MDIO3_GPIO_ADDR+0x4,0x1);break;case 5:Xil_Out32(MDIO5_GPIO_ADDR+0x4,0x1);break;case 6:Xil_Out32(MDIO6_GPIO_ADDR+0x4,0x1);break;case 7:Xil_Out32(MDIO7_GPIO_ADDR+0x4,0x1);break;case 8:Xil_Out32(MDIO8_GPIO_ADDR+0x4,0x1);break;case 9:Xil_Out32(MDIO9_GPIO_ADDR+0x4,0x1);break;default:break;}}void mdc_low(int index)
{switch(index){case 2:Xil_Out32(MDC2_GPIO_ADDR,0x0);break;case 3:Xil_Out32(MDC3_GPIO_ADDR,0x0);break;case 5:Xil_Out32(MDC5_GPIO_ADDR,0x0);break;case 6:Xil_Out32(MDC6_GPIO_ADDR,0x0);break;case 7:Xil_Out32(MDC7_GPIO_ADDR,0x0);break;case 8:Xil_Out32(MDC8_GPIO_ADDR,0x0);break;case 9:Xil_Out32(MDC9_GPIO_ADDR,0x0);break;default:break;}}void mdc_high(int index)
{switch(index){case 2:Xil_Out32(MDC2_GPIO_ADDR,0xffffffff);break;case 3:Xil_Out32(MDC3_GPIO_ADDR,0xffffffff);break;case 5:Xil_Out32(MDC5_GPIO_ADDR,0xffffffff);break;case 6:Xil_Out32(MDC6_GPIO_ADDR,0xffffffff);break;case 7:Xil_Out32(MDC7_GPIO_ADDR,0xffffffff);break;case 8:Xil_Out32(MDC8_GPIO_ADDR,0xffffffff);break;case 9:Xil_Out32(MDC9_GPIO_ADDR,0xffffffff);break;default:break;}}void mdio_low(int index)
{switch(index){case 2:Xil_Out32(MDIO2_GPIO_ADDR,0x0);break;case 3:Xil_Out32(MDIO3_GPIO_ADDR,0x0);break;case 5:Xil_Out32(MDIO5_GPIO_ADDR,0x0);break;case 6:Xil_Out32(MDIO6_GPIO_ADDR,0x0);break;case 7:Xil_Out32(MDIO7_GPIO_ADDR,0x0);break;case 8:Xil_Out32(MDIO8_GPIO_ADDR,0x0);break;case 9:Xil_Out32(MDIO9_GPIO_ADDR,0x0);break;default:break;}}void mdio_high(int index)
{switch(index){case 2:Xil_Out32(MDIO2_GPIO_ADDR,0xffffffff);break;case 3:Xil_Out32(MDIO3_GPIO_ADDR,0xffffffff);break;case 5:Xil_Out32(MDIO5_GPIO_ADDR,0xffffffff);break;case 6:Xil_Out32(MDIO6_GPIO_ADDR,0xffffffff);break;case 7:Xil_Out32(MDIO7_GPIO_ADDR,0xffffffff);break;case 8:Xil_Out32(MDIO8_GPIO_ADDR,0xffffffff);break;case 9:Xil_Out32(MDIO9_GPIO_ADDR,0xffffffff);break;default:break;}}void Mcu_Yt8521_Soft_Smi_Bit_Set(int index,u8 bit)
{// set mdio dir out// set mdiomdio_out(index);if(bit) mdio_high(index);else mdio_low(index);// set clk.mdc_low(index);mdc_high(index);
}void Mcu_Yt8521_Soft_Smi_Bit_Get(int index,u8 *bit)
{// set mdio dir in// get mdiomdio_in(index);      //MDIO线设置为输入switch(index){case 2:*bit = !!PHY2_SOFT_SMI_MDIO_READ;break;case 3:*bit = !!PHY3_SOFT_SMI_MDIO_READ;break;case 5:*bit = !!PHY5_SOFT_SMI_MDIO_READ;break;case 6:*bit = !!PHY6_SOFT_SMI_MDIO_READ;break;case 7:*bit = !!PHY7_SOFT_SMI_MDIO_READ;break;case 8:*bit = !!PHY8_SOFT_SMI_MDIO_READ;break;case 9:*bit = !!PHY9_SOFT_SMI_MDIO_READ;break;default:break;}// set clk.mdc_low(index);mdc_high(index);}u16 Srv_Yt8521_Soft_I2c_Device_Write(int index,u8 phy_addr, u8 reg_addr, u16 data)
{u16 i = 0;//idelfor(i = 0; i < 32; i++){Mcu_Yt8521_Soft_Smi_Bit_Set(index,1);}//startMcu_Yt8521_Soft_Smi_Bit_Set(index,0);Mcu_Yt8521_Soft_Smi_Bit_Set(index,1);//op codeMcu_Yt8521_Soft_Smi_Bit_Set(index,0);Mcu_Yt8521_Soft_Smi_Bit_Set(index,1);//phy addressfor(i = 0; i < 5; i++){if( phy_addr & (0x10 >> i) ){Mcu_Yt8521_Soft_Smi_Bit_Set(index,1);}else{Mcu_Yt8521_Soft_Smi_Bit_Set(index,0);}}//register addressfor(i = 0; i < 5; i++){if( reg_addr & (0x10 >> i) ){Mcu_Yt8521_Soft_Smi_Bit_Set(index,1);}else{Mcu_Yt8521_Soft_Smi_Bit_Set(index,0);}}//TA翻转状态(ack)Mcu_Yt8521_Soft_Smi_Bit_Set(index,1);Mcu_Yt8521_Soft_Smi_Bit_Set(index,0);//register datafor(i = 0; i < 16; i++){if( data & (0x8000 >> i) ){Mcu_Yt8521_Soft_Smi_Bit_Set(index,1);}else{Mcu_Yt8521_Soft_Smi_Bit_Set(index,0);}}return 0;
}u16 Srv_Yt8521_Soft_I2c_Device_Read(int index,u8 phy_addr, u8 reg_addr)
{u16 i = 0;u16 data = 0;     //待获取的数据u8  bit  = 0;//idelfor(i = 0; i < 32; i++){Mcu_Yt8521_Soft_Smi_Bit_Set(index,1);}//startMcu_Yt8521_Soft_Smi_Bit_Set(index,0);Mcu_Yt8521_Soft_Smi_Bit_Set(index,1);//op codeMcu_Yt8521_Soft_Smi_Bit_Set(index,1);Mcu_Yt8521_Soft_Smi_Bit_Set(index,0);//phy addressfor(i = 0; i < 5; i++){if( phy_addr & (0x10 >> i) ){Mcu_Yt8521_Soft_Smi_Bit_Set(index,1);}else{Mcu_Yt8521_Soft_Smi_Bit_Set(index,0);}}//register addressfor(i = 0; i < 5; i++){if( reg_addr & (0x10 >> i) ){Mcu_Yt8521_Soft_Smi_Bit_Set(index,1);}else{Mcu_Yt8521_Soft_Smi_Bit_Set(index,0);}}//TA翻转状态(ack)Mcu_Yt8521_Soft_Smi_Bit_Get(index,&bit);Mcu_Yt8521_Soft_Smi_Bit_Get(index,&bit);//register datafor(i = 0; i < 16; i++){data<<=1;Mcu_Yt8521_Soft_Smi_Bit_Get(index,&bit);if(bit){data |= 0x1;}}return data;
}int main(int argc, char *argv[])
{int phy_index=0;int reg_addr=0;int value=0;u16 Reg_Value;if(argc<4){printf("Usage mdio_test w/r phy_index[2,3,5,6,7,8,9] reg_addr [value]\n ");return 0;}if(argc==4){phy_index=(uint16_t) strtoul(argv[2], NULL, 0);reg_addr=(uint16_t) strtoul(argv[3], NULL, 0);switch(phy_index){case 2:Reg_Value=Srv_Yt8521_Soft_I2c_Device_Read(2,PHY2_YT8521_ADDR, reg_addr);printf("[READ]phy_index %d reg_addr 0x%x value is 0x%x\n",phy_index,reg_addr,Reg_Value);break;case 3:Reg_Value=Srv_Yt8521_Soft_I2c_Device_Read(3,PHY3_YT8521_ADDR, reg_addr);printf("[READ]phy_index %d reg_addr 0x%x value is 0x%x\n",phy_index,reg_addr,Reg_Value);break;case 5:Reg_Value=Srv_Yt8521_Soft_I2c_Device_Read(5,PHY5_YT8521_ADDR, reg_addr);printf("[READ]phy_index %d reg_addr 0x%x value is 0x%x\n",phy_index,reg_addr,Reg_Value);break;case 6:Reg_Value=Srv_Yt8521_Soft_I2c_Device_Read(6,PHY6_YT8521_ADDR, reg_addr);printf("[READ]phy_index %d reg_addr 0x%x value is 0x%x\n",phy_index,reg_addr,Reg_Value);break;case 7:Reg_Value=Srv_Yt8521_Soft_I2c_Device_Read(7,PHY7_YT8521_ADDR, reg_addr);printf("[READ]phy_index %d reg_addr 0x%x value is 0x%x\n",phy_index,reg_addr,Reg_Value);break;case 8:Reg_Value=Srv_Yt8521_Soft_I2c_Device_Read(8,PHY8_YT8521_ADDR, reg_addr);printf("[READ]phy_index %d reg_addr 0x%x value is 0x%x\n",phy_index,reg_addr,Reg_Value);break;case 9:Reg_Value=Srv_Yt8521_Soft_I2c_Device_Read(9,PHY9_YT8521_ADDR, reg_addr);printf("[READ]phy_index %d reg_addr 0x%x value is 0x%x\n",phy_index,reg_addr,Reg_Value);break;default:break;}}else if(argc==5){phy_index=(uint16_t) strtoul(argv[2], NULL, 0);reg_addr=(uint16_t) strtoul(argv[3], NULL, 0);value=(uint16_t) strtoul(argv[4], NULL, 0);printf("[WRITE] phy_index is %d reg_addr is 0x%x value is 0x%x\n",phy_index,reg_addr,value);switch(phy_index){case 2:Srv_Yt8521_Soft_I2c_Device_Write(2,PHY2_YT8521_ADDR, reg_addr,value);break;case 3:Srv_Yt8521_Soft_I2c_Device_Write(3,PHY3_YT8521_ADDR, reg_addr,value);break;case 5:Srv_Yt8521_Soft_I2c_Device_Write(5,PHY5_YT8521_ADDR, reg_addr,value);break;case 6:Srv_Yt8521_Soft_I2c_Device_Write(6,PHY6_YT8521_ADDR, reg_addr,value);break;case 7:Srv_Yt8521_Soft_I2c_Device_Write(7,PHY7_YT8521_ADDR, reg_addr,value);break;case 8:Srv_Yt8521_Soft_I2c_Device_Write(8,PHY8_YT8521_ADDR, reg_addr,value);break;case 9:Srv_Yt8521_Soft_I2c_Device_Write(9,PHY9_YT8521_ADDR, reg_addr,value);break;default:break;}}#if 0u16 id = 0;printf("//***************** Read SMI Reg of YT8521 ******************//\r\n");printf("------ PHY Identification Registers ------\r\n");id = Srv_Yt8521_Soft_I2c_Device_Read(2,PHY2_YT8521_ADDR, PHY_YT8521_ID_REG_ADDR);   //reg_addr:0x03  读取的值应为0x11aprintf("PHY2_YT8521 id = 0x%x\n", id);id = Srv_Yt8521_Soft_I2c_Device_Read(3,PHY3_YT8521_ADDR, PHY_YT8521_ID_REG_ADDR);   //reg_addr:0x03  读取的值应为0x11aprintf("PHY3_YT8521 id = 0x%x\n", id);id = Srv_Yt8521_Soft_I2c_Device_Read(5,PHY5_YT8521_ADDR, PHY_YT8521_ID_REG_ADDR);   //reg_addr:0x03  读取的值应为0x11aprintf("PHY5_YT8521 id = 0x%x\n", id);id = Srv_Yt8521_Soft_I2c_Device_Read(6,PHY6_YT8521_ADDR, PHY_YT8521_ID_REG_ADDR);   //reg_addr:0x03  读取的值应为0x11aprintf("PHY6_YT8521 id = 0x%x\n", id);id = Srv_Yt8521_Soft_I2c_Device_Read(7,PHY7_YT8521_ADDR, PHY_YT8521_ID_REG_ADDR);   //reg_addr:0x03  读取的值应为0x11aprintf("PHY7_YT8521 id = 0x%x\n", id);id = Srv_Yt8521_Soft_I2c_Device_Read(8,PHY8_YT8521_ADDR, PHY_YT8521_ID_REG_ADDR);   //reg_addr:0x03  读取的值应为0x11aprintf("PHY8_YT8521 id = 0x%x\n", id);id = Srv_Yt8521_Soft_I2c_Device_Read(9,PHY9_YT8521_ADDR, PHY_YT8521_ID_REG_ADDR);   //reg_addr:0x03  读取的值应为0x11aprintf("PHY9_YT8521 id = 0x%x\n", id);printf("Setting PHY2\n");Srv_Yt8521_Soft_I2c_Device_Write(2,PHY2_YT8521_ADDR, PHY_YT8521_REG_DEBUG_ADDR_OFFSET, PHY_YT8521_EXT_REG_ADDR);Srv_Yt8521_Soft_I2c_Device_Write(2,PHY2_YT8521_ADDR, PHY_YT8521_REG_DEBUG_DATA,0x604);printf("Setting PHY3\n");Srv_Yt8521_Soft_I2c_Device_Write(3,PHY3_YT8521_ADDR, PHY_YT8521_REG_DEBUG_ADDR_OFFSET, PHY_YT8521_EXT_REG_ADDR);Srv_Yt8521_Soft_I2c_Device_Write(3,PHY3_YT8521_ADDR, PHY_YT8521_REG_DEBUG_DATA,0x604);printf("Setting PHY5\n");Srv_Yt8521_Soft_I2c_Device_Write(5,PHY5_YT8521_ADDR, PHY_YT8521_REG_DEBUG_ADDR_OFFSET, PHY_YT8521_EXT_REG_ADDR);Srv_Yt8521_Soft_I2c_Device_Write(5,PHY5_YT8521_ADDR, PHY_YT8521_REG_DEBUG_DATA,0x604);printf("Setting PHY6\n");Srv_Yt8521_Soft_I2c_Device_Write(6,PHY6_YT8521_ADDR, PHY_YT8521_REG_DEBUG_ADDR_OFFSET, PHY_YT8521_EXT_REG_ADDR);Srv_Yt8521_Soft_I2c_Device_Write(6,PHY6_YT8521_ADDR, PHY_YT8521_REG_DEBUG_DATA,0x604);printf("Setting PHY7\n");Srv_Yt8521_Soft_I2c_Device_Write(7,PHY7_YT8521_ADDR, PHY_YT8521_REG_DEBUG_ADDR_OFFSET, PHY_YT8521_EXT_REG_ADDR);Srv_Yt8521_Soft_I2c_Device_Write(7,PHY7_YT8521_ADDR, PHY_YT8521_REG_DEBUG_DATA,0x604);printf("Setting PHY8\n");Srv_Yt8521_Soft_I2c_Device_Write(8,PHY8_YT8521_ADDR, PHY_YT8521_REG_DEBUG_ADDR_OFFSET, PHY_YT8521_EXT_REG_ADDR);Srv_Yt8521_Soft_I2c_Device_Write(8,PHY8_YT8521_ADDR, PHY_YT8521_REG_DEBUG_DATA,0x604);printf("Setting PHY9\n");Srv_Yt8521_Soft_I2c_Device_Write(9,PHY9_YT8521_ADDR, PHY_YT8521_REG_DEBUG_ADDR_OFFSET, PHY_YT8521_EXT_REG_ADDR);Srv_Yt8521_Soft_I2c_Device_Write(9,PHY9_YT8521_ADDR, PHY_YT8521_REG_DEBUG_DATA,0x604);
#endifreturn 0;
}

5、测试验证

读取裕太8521的PHY ID

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

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

相关文章

基于BP神经网络的手写体数字识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 filename dir(images\*.bmp); %图像文件格式 load BP.matfilename dir(test\*.bmp); …

PyQt基础_009_ 按钮类控件QSlider

基本功能 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class SliderDemo(QWidget):def __init__(self, parentNone):super(SliderDemo, self).__init__(parent)self.setWindowTitle("QSlider 例子") self.resize…

Google play开发者账号付款资料暂停的原因及解决方案

相信大多数Google play开发者都收到过这封邮件 邮件内容的大致意思是“由于可疑的活动&#xff0c;我们暂停了你的付款资料。” “要恢复您的帐户&#xff0c;请转到您的帐户并执行所要求的操作。” 这是触发了谷歌的付款风控机制&#xff0c;根据开发者们的反馈&#xff0c;账…

滴滴打车崩了!全过程

滴滴发布致歉10元补偿券&#xff0c;文末可领取 。 事情发生于 2023年11月27日晚~28日中午&#xff0c;滴滴打车服务出现大面积故障&#xff0c;登上微博热搜。 许多用户在使用滴滴出行时遇到了无法叫车、订单异常等问题&#xff0c;导致大量用户滞留在外&#xff0c;出行受阻…

2023年11月编程语言排行榜——你的编程语言上榜了吗?

编程语言的流行度是一个热门的话题&#xff0c;不同的机构和平台有不同的评判标准和排名方法。本文将以 TIOBE 编程社区指数为例&#xff0c;介绍 2023 年 11 月的编程语言趋势榜单&#xff0c;分析各种编程语言的表现和原因&#xff0c;以及对未来的展望。 TIOBE 编程社区指数…

【小黑嵌入式系统第二课】嵌入式系统的概述(二)——外围设备、处理器、ARM、操作系统

上一课&#xff1a; 【小黑嵌入式系统第一课】嵌入式系统的概述&#xff08;一&#xff09;——概念、特点、发展、应用 下一课&#xff1a; 【小黑嵌入式系统第三课】嵌入式系统硬件平台&#xff08;一&#xff09;——概述、总线、存储设备&#xff08;RAM&ROM&FLASH…

QDoubleSpinBox的使用示例

QDoubleSpinBox即可以做为数值型输入框使用&#xff0c;也可以使用只读型数据显示框&#xff0c;在作为输入框使用时比QLineEdit有以下几个方面的优势 1.可以设置范围&#xff0c;并且范围精确&#xff0c; 2.输入数据精确&#xff0c;自动屏幕非数值以外的字符。 3.设置步长后…

文件基础知识

计算机中的流&#xff1a;在C语言中将通过输入/输出设备&#xff08;键盘、内存、显示器、网络等&#xff09;之间的数据传输抽象表述为“流”。 1、文本流和二进制流 在文本流中输入输出的数据是一系列的字符&#xff0c;可以被修改在二进制流中输入输出数据是一系列字节&am…

RabbitMQ消息模型之Sample

Hello World Hello World是官网给出的第一个模型&#xff0c;使用的交换机类型是直连direct&#xff0c;也是默认的交换机类型。 在上图的模型中&#xff0c;有以下概念&#xff1a; P&#xff1a;生产者&#xff0c;也就是要发送消息的程序C&#xff1a;消费者&#xff1a;消…

【Linux】gcc和g++

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和Linux还有算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 …

git-4

1.在GitHub上创建个人仓库 现在仓库中有LICENSE文件&#xff0c;但本地没有这个文件&#xff0c;该怎么办呢&#xff1f;往下看 2.把本地仓库同步到GitHub 3.不同人修改了不同文件如何处理&#xff1f; 两个人在同一个分支上&#xff0c;两个人修改了不同文件 其中一人&…

Python 哈希表的实现——字典

哈喽大家好&#xff0c;我是咸鱼 接触过 Python 的小伙伴应该对【字典】这一数据类型都了解吧 虽然 Python 没有显式名称为“哈希表”的内置数据结构&#xff0c;但是字典是哈希表实现的数据结构 在 Python 中&#xff0c;字典的键&#xff08;key&#xff09;被哈希&#x…

出于隐私和安全的考虑,有时需要从谷歌删除你的个人数据,有两种方法

如果你是公众人物、企业或拥有个人品牌的人&#xff0c;那么拥有在线形象很重要。然而&#xff0c;你可能会发现&#xff0c;通过谷歌搜索&#xff0c;陌生人可以获得你的个人信息&#xff0c;如联系方式、地址和财务信息&#xff0c;这会让你感到不安。 幸运的是&#xff0c;…

系统频繁崩溃,如何考虑系统的稳定性和可扩展性?

最近网传互联网应用信息系统频繁崩溃&#xff0c;语雀崩完淘宝崩&#xff0c;淘宝崩完滴滴崩&#xff0c;随着业务的发展和技术的进步&#xff0c;对于信息系统的要求也越来越高。信息应用系统为了满足不断增长的用户和业务需求&#xff0c;提高系统的稳定性和扩展性至关重要。…

短 URL 生成器设计:百亿短 URL 怎样做到无冲突?

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 我们先来看看&#xff0c;当高并发遇到海量数据处理时的架构。在社交媒体上&#xff0c;人们经常需要分享一些 URL&#xff0c;但是有些 URL 可能会很长&#xff0c;比如&#xff1a; https://time.geekbang.org/hyb…

pytest分布式执行(pytest-xdist)

前言 平常我们手工测试用例非常多时&#xff0c;比如有1千条用例&#xff0c;假设每个用例执行需要1分钟。如果一个测试人员执行需要1000分钟才能执行完&#xff0c;当项目非常紧急的时候&#xff0c;我们会用测试人力成本换取时间成本&#xff0c;这个时候多找个小伙伴把任务…

MySQL根据binlog恢复数据

简介 本文介绍了使用mysqlbinlog导出数据&#xff0c;根据binlog恢复数据&#xff0c;和导出数据时报需要super权限的解决方法。 环境 MySQL: 5.7.40 说明 MySQL的binlog是数据库服务器在运行过程中产生的日志文件&#xff0c;记录了数据库增删改的操作&#xff0c;可用于恢复和…

重排链表,剑指offerII 26,力扣 120

目录 力扣题目地址&#xff1a; 题目&#xff1a; 那我们直接看题解吧&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 审题目事例提示&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 解题补充&#xff1a; 力扣题目地址&#xff1a; 143. 重排链表 - 力扣&…

基于Django+Tensorflow卷积神经网络鸟类识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介系统概述系统功能核心技术系统架构系统优势 二、功能三、系统四. 总结  总结 一项目简介 介绍一个基于DjangoTensorflow卷积神经网络鸟类识别系统是一个非…

多目标水母搜索算法(MOJS)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、多目标水母搜索算法MOJS 多目标水母搜索算法&#xff08;Multi-Objective Jellyfish Search algorithm&#xff0c;MOJS&#xff09;由Jui-Sheng Chou等…