Linux 学习记录58(ARM篇)

news2024/11/29 10:37:08

Linux 学习记录58(ARM篇)

在这里插入图片描述

本文目录

  • Linux 学习记录58(ARM篇)
  • 一、GIC相关寄存器
    • 1. 系统框图
    • 2. 中断号对应关系
  • 二、GICD寄存器
    • 1. GICD_CTLR
    • 2. GICD_ISENABLERx
    • 3. GICD_IPRIORITYRx
    • 4. GICD_ITARGETSRx
    • 5. GICD_ICPENDRx
  • 三、GICC寄存器
    • 1. GICC_PMR
    • 2. GICC_CTLR
    • 3. GICC_IAR
    • 4. GICC_EOIR
  • 四、封装函数
    • 1. 寄存器封装
    • 2. EXTI初始化结构体/枚举封装
    • 3. GICD初始化结构体/枚举
    • 4. GICC初始化结构体/枚举
    • 5. EXTI函数
    • 6. GICD函数
    • 7. GICC函数
    • 8. 使用示例

一、GIC相关寄存器

1. 系统框图

在这里插入图片描述

  1. PPI:私有外设中断号:(ID:0~15)
  2. SPI:共享外设中断号:(ID:16~31)
  3. SGI:软件产生的中断号:(ID:0~287)

总结:

GIC层一共管理288个中断号(ID:0 ~ 287),16个SGIS,16个PPIS,256个SPIS

2. 中断号对应关系

在这里插入图片描述
例:
在这里插入图片描述

二、GICD寄存器

1. GICD_CTLR

功能:使能CPU
在这里插入图片描述

2. GICD_ISENABLERx

功能:设置GICD层中断使能
该寄存器共有8个(0-8),用于使能GICD层的的288个中断号,每个寄存器32位,分别控制32个中断号的使能
在这里插入图片描述

计算方式 置1 为使能

int ID = 99//中断号,以外部中断号为99的ID为例
ID / 32 = 3 
使用" GICD_ISENABLER3 "寄存器即可
ID % 32 = 3
使用" GICD_ISENABLER3 "寄存器的第 "3 bit位" 即可

3. GICD_IPRIORITYRx

功能:设置GICD层中断优先级
在这里插入图片描述

计算方式
备注:设置中断优先级值的范围在:0 ~ 2^5 -1 GICD层中断优先级,需要比GICC层中断优先级高 中断优先级的值越小,代表中断优先级越高

int ID = 99//中断号,以外部中断号为99的ID为例
ID / 4 = 24 
使用" GICD_IPRIORITYR第24个"寄存器即可
ID % 4 = 3 (*8+3) =27" GICD_IPRIORITYR第24个 "寄存器的第 "27 ~ 37(27+4) bit位" 即可

4. GICD_ITARGETSRx

功能:分配给cpu0 或者 cpu1
该寄存器共有72个(0~71)个寄存器 [ 288个中断号/每个寄存器控制4个中断号的分配 ]
在这里插入图片描述

计算方式

int ID = 99//中断号,以外部中断号为99的ID为例
ID / 4 = 24 
使用" GICD_ITARGETSR第24个"寄存器即可
ID % 4 = 3 (*8) =24" GICD_ITARGETSR第24个 "寄存器的第 "24 ~ 25(24+1) bit位" 即可

5. GICD_ICPENDRx

功能:清除GICD层挂起的中断标志位
该寄存器给共有8个寄存器[ 228个中断号/每个寄存器控制32个中断号的清除 ]
在这里插入图片描述

计算方式 置1为清除

int ID = 99//中断号,以外部中断号为99的ID为例
ID / 32 = 3 
使用" GICD_ICPENDR第3个"寄存器即可
ID % 32 = 3" GICD_ICPENDR第3个 "寄存器的第 "3 bit位" 即可

三、GICC寄存器

1. GICC_PMR

功能:设置GICC层中断优先级
在这里插入图片描述

2. GICC_CTLR

功能:使能cpu中断
在这里插入图片描述
在这里插入图片描述

3. GICC_IAR

功能:获取中断号,这个寄存器只读
在这里插入图片描述

4. GICC_EOIR

功能:清除获取到中断号
在这里插入图片描述

四、封装函数

1. 寄存器封装

typedef unsigned          char uint8_t;
typedef unsigned short     int uint16_t;
typedef unsigned           int uint32_t;

#define __IO    volatile
typedef struct{
	__IO uint32_t RTSR1; 	// EXTI rising trigger selection register 	
	__IO uint32_t FTSR1; 	// EXTI falling trigger selection register	
	__IO uint32_t SWIER1;   // EXTI software interrupt event register 
	__IO uint32_t RPR1;     // EXTI rising edge pending register
	__IO uint32_t FPR1;  	// EXTI falling edge pending register
	__IO uint32_t TZENR1;   // EXTI TrustZone enable register
	__IO uint32_t RES1[2];  
	__IO uint32_t RTSR2;    // EXTI rising trigger selection register
	__IO uint32_t FTSR2;    // EXTI falling trigger selection register
	__IO uint32_t SWIER2;   // EXTI software interrupt event register
	__IO uint32_t RPR2;     // EXTI rising edge pending register
	__IO uint32_t FPR2;	    // EXTI falling edge pending register
	__IO uint32_t TZENR2;   // EXTI TrustZone enable register
	__IO uint32_t RES2[2];
	__IO uint32_t RTSR3;    // EXTI rising trigger selection register
	__IO uint32_t FTSR3;    // EXTI falling trigger selection register
	__IO uint32_t SWIER3;   // EXTI software interrupt event register
	__IO uint32_t RPR3;     // EXTI rising edge pending register
	__IO uint32_t FPR3;     // EXTI falling edge pending register
	__IO uint32_t TZENR3;   // EXTI TrustZone enable register
	__IO uint32_t RES3[2];
	__IO uint32_t EXTICR1;	// EXTI external interrupt selection register 1
	__IO uint32_t EXTICR2;  // EXTI external interrupt selection register 2	
	__IO uint32_t EXTICR3;  // EXTI external interrupt selection register 3	
	__IO uint32_t EXTICR4;  // EXTI external interrupt selection register 4	
	__IO uint32_t RES4[4];
	__IO uint32_t C1IMR1;   // EXTI CPU1 wakeup with interrupt mask register
	__IO uint32_t C1EMR1;   // EXTI CPU1 wakeup with event mask register
	__IO uint32_t RES5[2];
	__IO uint32_t C1IMR2;   // EXTI CPU1 wakeup with interrupt mask register
	__IO uint32_t C1EMR2;   // EXTI CPU1 wakeup with event mask register
	__IO uint32_t RES6[2];
	__IO uint32_t C1IMR3;   // EXTI CPU1 wakeup with interrupt mask register	
	__IO uint32_t C1EMR3;   // EXTI CPU1 wakeup with event mask register 
	__IO uint32_t RES7[6];
	__IO uint32_t C2IMR1;   // EXTI CPU2 wakeup with interrupt mask register
	__IO uint32_t C2EMR1;   // EXTI CPU2 wakeup with event mask register
	__IO uint32_t RES8[2];
	__IO uint32_t C2IMR2;   // EXTI CPU2 wakeup with interrupt mask register
	__IO uint32_t C2EMR2;   // EXTI CPU2 wakeup with event mask register
	__IO uint32_t RES9[2];
	__IO uint32_t C2IMR3;   // EXTI CPU2 wakeup with interrupt mask register 
	__IO uint32_t C2EMR3;   // EXTI CPU2 wakeup with event mask register 
	__IO uint32_t RES10[2];
}EXTI_TypeDef;

#define  EXTI   ((EXTI_TypeDef*)0x5000D000)

typedef struct {
	volatile unsigned int CTRL;
	volatile unsigned int TYPER;
	volatile unsigned int IIDR;
	volatile unsigned int RES1[29];
	volatile unsigned int IGROUPR[9];
	volatile unsigned int RES2[23];
	volatile unsigned int ISENABLER[9];
	volatile unsigned int RES3[23];
	volatile unsigned int ICENABLER[9];
	volatile unsigned int RES4[23];
	volatile unsigned int ISPENDR[9];
	volatile unsigned int RES5[23];
	volatile unsigned int ICPENDR[9];
	volatile unsigned int RES6[23];
	volatile unsigned int ISACTIVER[9];
	volatile unsigned int RES7[23];
	volatile unsigned int ICACTIVER[9];
	volatile unsigned int RES8[23];
	volatile unsigned int IPRIORITYR[72];
	volatile unsigned int RES9[184];
	volatile unsigned int ITARGETSR[72];
	volatile unsigned int RES10[184];	
	volatile unsigned int ICFGR[18];
	volatile unsigned int RES11[46];

}GICD_TypeDef;
#define GICD  ((GICD_TypeDef*)0xA0021000)

typedef struct {
	volatile unsigned int CTRL;
	volatile unsigned int PMR;
	volatile unsigned int BRR;
	volatile unsigned int IAR;
	volatile unsigned int EOIR;
	volatile unsigned int RPR;
	volatile unsigned int HPPIR;
	volatile unsigned int ABPR;
	volatile unsigned int AIAR;
	volatile unsigned int AEOIR;
	volatile unsigned int AHPPIR;
	volatile unsigned int RES1[41];
	volatile unsigned int APR0;
	volatile unsigned int RES2[3];
	volatile unsigned int NSAPR0;
	volatile unsigned int RES3[6];
	volatile unsigned int IIDR;
	volatile unsigned int RES4[960];
	volatile unsigned int DIRDIR;

}GICC_TypeDef;
#define GICC  ((GICC_TypeDef*)0xA0022000) 

2. EXTI初始化结构体/枚举封装

typedef enum
{
    EXTI_GPIOA = 0x0,
    EXTI_GPIOB,
    EXTI_GPIOC,
    EXTI_GPIOD,
    EXTI_GPIOE,
    EXTI_GPIOF,
    EXTI_GPIOG,
    EXTI_GPIOH,
    EXTI_GPIOI,
    EXTI_GPIOJ,
    EXTI_GPIOK,
    EXTI_GPIOZ,
}EXTI_GPIOxTypedef;

typedef enum
{
    EXTI_Trigger_Rising = 0x0,//上升
    EXTI_Trigger_Falling,//下降
    EXTI_Trigger_Rising_Falling,//双边沿
}EXTI_TriggerTypedef;

typedef struct
{
    uint16_t EXTI_GPIOx;//GPIO组号
    uint16_t EXTI_Line;//中断线
    uint8_t EXTI_Trigger;//触发方式
    uint8_t EXTI_Wakeup;//是否屏蔽

}EXTI_InitTypeDef;
/*相关函数声明*/
/*外部中断初始化*/
void EXTI_Init(EXTI_InitTypeDef* EXTI_Init);
/*清除挂起标志位s*/
void EXTI_Clr_FPR1(uint16_t ID);

3. GICD初始化结构体/枚举

typedef enum
{/*和GICC共用*/
    GIC_CPU0 = 0x1,//CPU0
    GIC_CPU1,//CPU1
    GIC_CPU1_0,//CPU1和CPU0
}GIC_CPUTypedef;

typedef struct
{
   uint8_t GICD_CPU;//使能的CPU
   uint8_t GICD_Allocation_CPU;//分配CPU
   uint8_t GICD_priority;//设置优先级
   uint16_t GICD_interrupt_ID;//使能的中断号
   
}GICD_InitTypeDef;
/*相关函数声明*/
/*GICD初始化*/
void GICD_Init(GICD_InitTypeDef* GICD_Init);
/*清除挂起标志位*/
void GICD_Clr_ICPENDR(uint16_t ID);

4. GICC初始化结构体/枚举

typedef struct
{
    uint8_t GICC_priority;//设置优先级
    uint8_t GICC_CPU;//使能的CPU
}GICC_InitTypeDef;
/*相关函数声明*/
/*GICC初始化*/
void GICC_Init(GICD_InitTypeDef* GICD_Init);
/*获取中断号*/
uint32_t GICC_Get_IAR(void);
/*清除中断号*/
void GICC_Clr_EOIR(uint32_t ID);

5. EXTI函数

void EXTI_Init(EXTI_InitTypeDef* EXTI_Init)
{
    uint8_t py = 0;

    py = EXTI_Init->EXTI_Line/4;
    py++;

    switch(py)
    {
        case 1:{
            /*连接Pin到EXTI_line*/
            EXTI->EXTICR1 &= ~(0xff << ((EXTI_Init->EXTI_Line%4) *8));
            EXTI->EXTICR1 |= (EXTI_Init->EXTI_GPIOx << ((EXTI_Init->EXTI_Line%4) *8));
        }break;

        case 2:{
            /*连接Pin到EXTI_line*/
            EXTI->EXTICR2 &= ~(0xff << ((EXTI_Init->EXTI_Line%4) *8));
            EXTI->EXTICR2 |= (EXTI_Init->EXTI_GPIOx << ((EXTI_Init->EXTI_Line%4) *8));
        }break;

        case 3:{
            EXTI->EXTICR3 &= ~(0xff << ((EXTI_Init->EXTI_Line%4) *8));
            EXTI->EXTICR3 |= (EXTI_Init->EXTI_GPIOx << ((EXTI_Init->EXTI_Line%4) *8));
        }break;

        case 4:{
            /*连接Pin到EXTI_line*/
            EXTI->EXTICR4 &= ~(0xff << ((EXTI_Init->EXTI_Line%4) *8));
            EXTI->EXTICR4 |= (EXTI_Init->EXTI_GPIOx << ((EXTI_Init->EXTI_Line%4) *8));
        }break;

        default : break;
    }

    switch(EXTI_Init->EXTI_Trigger)
    {
        case EXTI_Trigger_Rising :{//上升沿
            /*设置为上升降沿触发*/
            EXTI->RTSR1 &= ~(0x1 << EXTI_Init->EXTI_Line);
            EXTI->RTSR1 |= (0x1 << EXTI_Init->EXTI_Line);
        }break;

        case EXTI_Trigger_Falling :{//下降沿
            /*设置为下降沿触发*/
            EXTI->FTSR1 &= ~(0x1 << EXTI_Init->EXTI_Line);
            EXTI->FTSR1 |= (0x1 << EXTI_Init->EXTI_Line);
        }break;

        case EXTI_Trigger_Rising_Falling :{//双边沿
            /*设置下降沿触发*/
            EXTI->FTSR1 &= ~(0x1 << EXTI_Init->EXTI_Line);
            EXTI->FTSR1 |= (0x1 << EXTI_Init->EXTI_Line);
            /*设置为上升降沿触发*/
            EXTI->RTSR1 &= ~(0x1 << EXTI_Init->EXTI_Line);
            EXTI->RTSR1 |= (0x1 << EXTI_Init->EXTI_Line);
        }break;
    }
    
    /*设置EXTI不屏蔽*/
    EXTI->C1IMR1 &= ~(0x1 << EXTI_Init->EXTI_Line);
    EXTI->C1IMR1 |= (0x1 << EXTI_Init->EXTI_Line);
    /*设置EXTI不屏蔽*/
    EXTI->C1IMR1 &= ~(0x1 << EXTI_Init->EXTI_Line);
    EXTI->C1IMR1 |= (0x1 << EXTI_Init->EXTI_Line);
}

/*清除挂起标志位s*/
void EXTI_Clr_FPR1(uint16_t ID)
{
    EXTI->FPR1 |= 0x1 << ID;
}

6. GICD函数

/*GICD初始化*/
void GICD_Init(GICD_InitTypeDef* GICD_Init)
{
    /*使能GICD*/
    GICD->CTRL &= ~(0x3);
    GICD->CTRL |= GICD_Init->GICD_CPU;

    /*设置使能寄存器*/
    GICD->ISENABLER[GICD_Init->GICD_interrupt_ID/32] |= 0x1<<(GICD_Init->GICD_interrupt_ID%32);

    /*设置中断优先级*/
    GICD->IPRIORITYR[GICD_Init->GICD_interrupt_ID/4] &= ~(0x1F << ((GICD_Init->GICD_interrupt_ID%32)*8+3));
    GICD->IPRIORITYR[GICD_Init->GICD_interrupt_ID/4] |= GICD_Init->GICD_priority << ((GICD_Init->GICD_interrupt_ID%32)*8+3);
    
    /*设置中断优先级*/
    GICD->ITARGETSR[GICD_Init->GICD_interrupt_ID/4] &= ~(0x3 << ((GICD_Init->GICD_interrupt_ID%32)*8));
    GICD->ITARGETSR[GICD_Init->GICD_interrupt_ID/4] |= GICD_Init->GICD_Allocation_CPU << ((GICD_Init->GICD_interrupt_ID%32)*8);
}
/*清除挂起标志位*/
void GICD_Clr_ICPENDR(uint16_t ID)
{
    GICD->ICPENDR[ID/32] |= 0x1 << ID%32;
}

7. GICC函数

/*GICC初始化*/
void GICC_Init(GICC_InitTypeDef* GICC_Init)
{
     /*使能CICC*/
    GICC->CTRL &= ~(0x3);
    GICC->CTRL |= GICC_Init->GICC_CPU;
    /*中断优先级设置*/
    GICC->PMR &= ~(0x1F << 3);
    GICC->PMR |= GICC_Init->GICC_priority << 3;
}

8. 使用示例

	EXTI_InitTypeDef EXTI_InitStructure;

    EXTI_InitStructure.EXTI_GPIOx = EXTI_GPIOF;
    EXTI_InitStructure.EXTI_Line = 9;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_Wakeup = 1;
    EXTI_Init(&EXTI_InitStructure);

    EXTI_InitStructure.EXTI_Line = 8;
    EXTI_Init(&EXTI_InitStructure);

    EXTI_InitStructure.EXTI_Line = 7;
    EXTI_Init(&EXTI_InitStructure);

    GICD_InitTypeDef GICD_InitStructure;

    GICD_InitStructure.GICD_CPU = GIC_CPU0;
    GICD_InitStructure.GICD_Allocation_CPU = GIC_CPU0;
    GICD_InitStructure.GICD_priority = 0;
    GICD_InitStructure.GICD_interrupt_ID = 99;
    GICD_Init(&GICD_InitStructure);

    GICD_InitStructure.GICD_priority = 1;
    GICD_InitStructure.GICD_interrupt_ID = 98;
    GICD_Init(&GICD_InitStructure);

    GICD_InitStructure.GICD_priority = 2;
    GICD_InitStructure.GICD_interrupt_ID = 97;
    GICD_Init(&GICD_InitStructure);

    GICC_InitTypeDef GICC_InitStructure;
    GICC_InitStructure.GICC_priority = 4;
    GICC_InitStructure.GICC_CPU = GIC_CPU0;
    GICC_Init(&GICC_InitStructure);

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

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

相关文章

JAVA面试总结-Redis篇章(五)——持久化

Java面试总结-Redis篇章&#xff08;五&#xff09;——持久化 1.RDBRDB全称Redis Database Backup file (Redis数据备份文件)&#xff0c;也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后&#xff0c;从磁盘读取快照文件&#x…

持续贡献开源力量,棱镜七彩加入openKylin

近日&#xff0c;棱镜七彩签署 openKylin 社区 CLA&#xff08;Contributor License Agreement 贡献者许可协议&#xff09;&#xff0c;正式加入openKylin 开源社区。 棱镜七彩成立于2016年&#xff0c;是一家专注于开源安全、软件供应链安全的创新型科技企业。自成立以来&…

短视频账号矩阵系统源码开发部署路径

一、短视频批量剪辑的开发逻辑算法 1.视频剪辑之开发算法 自己研发视频剪辑是指通过对视频素材进行剪切、调整、合并等操作&#xff0c;利用后台计算机算法&#xff0c;进行抽帧抽组抽序进行排列以达到对视频内容进行修改和优化的目的。自己研发的视频剪辑工具可以通过后台码…

系统集成项目管理工程师挣值分析笔记大全

系统集成项目管理工程师挣值分析笔记大全 挣值分析是一种项目管理技术&#xff0c;用于量化和监控项目绩效。它通过比较计划值&#xff08;PV&#xff09;、实际成本&#xff08;AC&#xff09;和挣值&#xff08;EV&#xff09;三个参数来评估项目的进展情况和成本绩效。 挣值…

系统架构设计师-软件架构设计(3)

目录 一、软件架构风格&#xff08;其它分类&#xff09; 1、闭环控制结构&#xff08;过程控制&#xff09; 2、C2风格 3、MDA&#xff08;模型驱动架构 Model Driven Architecture&#xff09; 4、特定领域软件架构&#xff08;DSSA&#xff09; 4.1 DSSA基本活动及产出物…

《CUDA C++ Programming Guide》第一章 CUDA介绍

第一章 CUDA介绍 1.1 使用GPUs的好处 在相同的价格和功耗范围内&#xff0c;图形处理器 GPU 比 CPU 提供了更高的指令吞吐量和内存带宽, 许多应用程序利用这些更高的功能在 GPU 上比在 CPU 上运行得更快。相比较其他计算设备&#xff0c;如 FPGA&#xff0c;也是非常节能的&a…

协议和模型

1 规则 1.1 通信基础知识 不同网络的规模、形状和功能都存在很大差异。它们可以复杂到通过互联网来连接设备&#xff0c;也可以简单到直接将两台计算机用一根电缆连接&#xff0c;或者是介于这两种之间。然而&#xff0c;只是完成终端设备之间的有线或无线物理连接并不足以实…

MATLAB基础知识回顾

目录 1.帮助命令 2.数据类型 3.元胞数组和结构体 4.矩阵操作 4.1 矩阵的定义与构造 4.2 矩阵的四则运算 4.3 矩阵的下标 5.程序结构 5.1 for循环结构 5.2 分支结构 7.基本绘图操作 7.1.二维平面绘图 6.2 三维立体绘图 7.图形的保存与导出 8.补充 语句后⾯加;的作…

Kaggle图表内容识别大赛TOP方案汇总

赛题名称&#xff1a;Benetech - Making Graphs Accessible 赛题链接&#xff1a;https://www.kaggle.com/competitions/benetech-making-graphs-accessible 赛题背景 数以百万计的学生有学习、身体或视力障碍&#xff0c;导致人们无法阅读传统印刷品。这些学生无法访问科学…

人机合一Linux

未来云系统成为主流&#xff0c;维护电脑这种充满时代特性的技术&#xff0c;完全不重要了。 无论是学习还是工作&#xff0c;电脑都是IT人必不可少的重要武器&#xff0c;一台好电脑除了自身配置要经得起考验&#xff0c;后期主人对它的维护也是决定它寿命的重要因素&#xff…

【01trie】CF1851F

Problem - F - Codeforces 题意&#xff1a; 思路&#xff1a; 首先最大异或对可以用01trie解决 trie树入门_lamentropetion的博客-CSDN博客 ai xor x 和 aj xor x 都必须为1 因此可以转换为 ai 和 aj 最小异或对问题 改一下01trie的板子即可 主要修改部分在query上 p…

如何把视频中的背景删掉,AI抠像,瞬间换背景!

不用绿幕也能快速抠除视频背景。一个可以去除视频背景的AI智能抠像工具&#xff0c;上传视频后会自动去除背景&#xff0c;支持单人、多人等各类场景&#xff0c;智能扫描识别&#xff0c;发丝级细节处理&#xff0c;快捷高效。 随着AI 抠像技术的不断成熟和普及&#xff0c;我…

5-7月大更新!EasyOps®全平台34+新特性齐上线~

为了提供更好的产品使用体验&#xff0c;优维从未停止更新升级的脚步。在5-7月份&#xff0c;EasyOps全平台更新上线34新功能&#xff0c;涉及Hyperlnsight超融合监控、CMDB、DevOps、AutoOps、ITSM、公共服务&#xff0c;在不断的技术创新过程中&#xff0c;进一步加速IT运维效…

存算一体化(Processing in Memory, PIM)入门

一、 存算一体化 概念&#xff1a; 简单来说就是将存储资源中嵌入计算能力&#xff0c;以新的运算架构进行二维和三维矩阵乘法/加法运算。这样减少了数据频繁移动带来的延迟和能耗方面的开销。 背景&#xff1a; 虽然多核&#xff08;例如CPU&#xff09;/众核&#xff08;例…

视频监控综合管理平台EasyCVR多分屏默认播放协议的配置优化

视频监控综合管理平台EasyCVR具备视频融合汇聚能力&#xff0c;TSINGSEE青犀视频平台基于云边端一体化架构&#xff0c;可支持多协议、多类型设备接入&#xff0c;包括&#xff1a;NVR、IPC、视频编码器、无人机、车载设备、智能手持终端、移动执法仪等。国标GB28181视频平台Ea…

Mysql执行计划字段解释

文章目录 一、前言二、如何查看执行计划三、执行计划各字段解释四、select_type4.1、SIMPLE&#xff08;简单查询&#xff09;4.1.1、简单的单表查询4.1.2、多表连接查询 4.2、PRIMARY&#xff08;主查询&#xff09;4.2.1、包含复杂子查询的外层查询4.2.2、UNION语句中的第一个…

55寸透明屏有哪些主要特点?

55寸透明屏是一种新型的显示技术&#xff0c;它具有透明度高、色彩鲜艳、清晰度高等特点&#xff0c;可以广泛应用于商业展示、户外广告、智能家居等领域。 首先&#xff0c;55寸透明屏的透明度非常高&#xff0c;可以达到80%以上&#xff0c;这意味着即使屏幕开启&#xff0c;…

裁员 10%,暴跌 14%,这家 IT 独角兽正在被抛弃!

流量一跌再跌&#xff0c;Stack Overflow 简直被狠狠地上了一课&#xff01; 3 月份 Stack Overflow 的流量下降了近 14%。该公司的 CEO 压力空前&#xff0c;甚至昨天决定裁员 10%&#xff01; 平均每月下降6%&#xff0c;上月直接跌了近14% 开发人员越来越多地从 AI 聊天机器…

Hive数据仓库

数据仓库概念与起源发展由来 数仓概念 数据仓库&#xff08;英语&#xff1a;Data Warehouse&#xff0c;简称数仓、DW&#xff09;&#xff0c;是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面相分析的集成化数据环境&#xff0c;分析结果为企业提供决策支持…

结构化思维:高效能项目经理人的底层能力

大家好&#xff0c;我是老原。 我们经常会说「高效能」&#xff0c;那怎么成为高效能人士&#xff1f;其实除了拼体力和心力以外&#xff0c;高效能更重要的是脑力&#xff0c;这里的脑力不是指智力&#xff0c;而是结构化思维。 随着你在职场中不断成长和进阶&#xff0c;级…