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); …

LeetCode Hot100 35.搜索插入位置

题目&#xff1a; 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 方法&#xff1a;灵神 二分查找 闭区间写法 c…

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…

【智能家居】面向对象编程OOP和设计模式(工厂模式)

面向对象编程 类和对象 面向对象编程和面向过程编程区别 设计模式 软件设计模式按类型分 工厂模式 面向对象编程 面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种程序设计范式&#xff0c;其中程序被组织成对象的集合&#xff0c;每…

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 编程社区指数…

Docker export 命令

docker export&#xff1a;将文件系统作为一个tar归档文件导出到STDOUT。 语法 docker export [OPTIONS] CONTAINEROPTIONS说明&#xff1a; -o&#xff1a;将输入内容写到文件。 实例 将id为a404c6c174a2的容器按日期保存为tar文件&#xff1a; docker export -o mysql-…

用java编写一个网络聊天室

网络聊天室 服务器&#xff1a; 1.启动服务器&#xff0c;在服务器端循环监听客户端的连接 try {ServerSocket serverSocketnew ServerSocket(6622);System.out.println("服务器已启动");while(true){//把客户端实例添加到sockets里Socket socketserverSocket.acc…

【小黑嵌入式系统第二课】嵌入式系统的概述(二)——外围设备、处理器、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…

CLH锁原理

CLH锁其实是为了优化自旋锁的缺点&#xff1a; 所有自旋锁都在一个内存地址上自旋&#xff0c;持有锁的线程释放锁后&#xff0c;会引发惊群效应&#xff0c;而且会造成个别线程一只拿不到锁&#xff0c;处在饥饿状态,CLH锁通过队列将所有线程排队&#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;两个人修改了不同文件 其中一人&…

Java面向对象第7天

精华笔记&#xff1a; 成员内部类&#xff1a;了解&#xff0c;应用率不高 类中套类&#xff0c;外面的称为外部类&#xff0c;里面的称为内部类 内部类只服务于外部类&#xff0c;对外不具备可见性 内部类对象通常在外部类中创建 内部类中可以直接访问外部类的成员(包括私有…

Python 哈希表的实现——字典

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

OpenAI神秘项目“Q*”的N个猜想

文章目录 “Q*”可能是什么&#xff1f;何为AI意识的产生&#xff1f;AI应该如何与人类对齐&#xff1f; 上周&#xff0c;OpenAI人事风波暂停的尾声中&#xff0c;有个“可能威胁人类”的、代号为“Q*”的神秘项目被抛掷出来。 传言中&#xff0c;Sam Altman被解雇前&#xff…

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

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