GIC控制器(一)

?

目錄

處理器工作模式

異常源

?編輯寄存器組織結構

異常處理流程

CPSR寄存器

異常向量表

編寫異常向量表

CP15協處理器

CP15 協處理器寄存器分組

協處理器指令

C0寄存器

C1寄存器

C12寄存器

C15寄存器

CBAR寄存器

Reset異常


前言:

????????GICGeneric Interrupt Controller通用中斷控制器)是 ARM 架構中用于管理中斷的核心模塊,主要應用于現代多核處理器系統中,GIC 控制器的功能如下:

  • 中斷管理與分發:系統中存在眾多中斷源(外設中斷(?GPIO、UART、SPI 等外設產生的中斷 )、軟件觸發中斷)GIC 能夠收集這些中斷請求,根據預先設定的優先級和配置信息,決定將中斷分配給哪個 CPU 核心進行處理;
  • 優先級處理:為不同的中斷分配優先級,高優先級的中斷可以打斷低優先級中斷的處理;
  • 中斷屏蔽與使能:可以對中斷進行屏蔽和使能操作,開發人員可以通過配置 GIC 的相關寄存器,來決定是否允許某個中斷被 CPU 接收和處理;
  • 支持虛擬化:在虛擬化環境中,GIC 能夠將中斷正確地路由到虛擬機,使得虛擬機也能像物理機一樣有效地處理中斷;

GIC具有?GICv1、GICv2、GICv3、GICv4 等版本,由于GICv2廣泛應用于 Cortex-A 系列處理器,選擇GICv2版本進行討論,本文并不局限于GIC控制器的討論,著眼于cortex-A系列芯片的整個異常處理流程,而GIC控制器提供中斷處理的硬件支持;

處理器工作模式

處理器模式詳解:ARM架構_arm架構 csdn-CSDN博客

異常源


寄存器組織結構

  • ?系統模式與用戶模式共用同一套寄存器
  • ?異常模式都具有獨立的棧頂指針寄存器r13_<mode>?與 鏈接寄存器(lr) r14_<mode>
  • ?只有異常模式具有SPSR寄存器且相互獨立
  • ?所有工作模式只具有一個pc指針寄存器

寄存器詳細介紹(重點掌握CPSR寄存器):ARM架構_arm架構 csdn-CSDN博客

異常處理流程

若想達到上圖所呈現的效果,硬件上需要做那些事,軟件上又需要做那些事,以中斷異常為例,展開如下討論

CPSR寄存器

硬件階段:

  1. 由于CPSR保存用戶程序的執行狀態(比如處理器當前所處的工作模式),當異常發生時,硬件會自動將CPSR寄存器中的值保存到對應異常模式中的SPSR_<mode>寄存器,當異常返回時,以便恢復程序之前的執行狀態;
  2. ?硬件自動關閉 FIQ(快速中斷)與 IRQ(普通中斷),由于異常是由處理器內部事件?或?程序執行指令?引發的,而?中斷?是由?外部設備?或?處理器外部事件?引起,異常優先級高于中斷,所以關閉 FIQ 和 IRQ 中斷可以保證異常處理的高優先級得以實現,讓系統能夠優先處理異常情況,盡快恢復到正常運行狀態 ,所以CPSR bit[6]:1 bit[7]:1
  3. 無論處理器是在ARM狀態或者THUMB狀態下發生異常, 硬件都會自動切換到ARM狀態下進行異常處理,所以CPSR bit[5]:0
  4. 硬件根據當前發生的異常類型,將異常碼寫入CPSR里 的M[4:0]模式位以達到模式切換;
  5. 由于用戶程序被異常打斷,當前正在執行的指令必定由處理器執行結束,然后切換到異常處理程序里,當異常處理完成,需要返回用戶程序繼續向下執行,因此硬件自動保存當前執行指令的下一條指令的地址到LR_<mode> 方便程序返回;
  6. 硬件自動將pc指針寄存器的值設置為異常向量表的起始地址

當硬件完成上述六步之后,嵌入式軟件工程師為cortex-A系列的芯片編寫異常向量表,但是什么是異常向量表,異常向量表的起始地址是多少,開發人員如何編寫異常向量表

異常向量表

異常向量表(Exception Vector Table)是處理器為不同類型的異常源預設的固定內存地址集合,每個地址對應一種異常的處理程序入口,當異常發生時,處理器會自動跳轉到向量表中對應異常的地址,執行該地址指向的異常處理程序,異常向量表的異常類型和異常數量是由處理器架構的設計者規定的(如 ARM 架構由 ARM 公司定義,x86 架構由 Intel/AMD 定義);

經典 ARM架構 規定:處理器復位后,默認從?0x00000000?地址讀取異常向量表;

異常向量表的起始地址難道是0x00000000,當燒錄MCU程序時,比如 STM32,FLASH起始地址0x08000000,開發人員編寫的異常向量表只會存放在flash所對應的地址空間范圍內,根本不可能存放到0x0000000,當燒錄MPU程序時,比如I.MX 6ULL/STM32MP157/ITOP 4412都會指定程序的運行地址,但是處理器復位后默認從?0x00000000?地址讀取異常向量表,必定存在一種機制,用于通知處理器由開發人員編寫的異常向量表的實際存放地址,通過配置協處理器CP15中的向量基址寄存器(VBAR,Vector Base Address Register)此寄存器用于存儲異常向量表的基地址,當處理器在處理異常時,便會從 VBAR 指向的地址開始查找對應異常的處理程序入口

編寫異常向量表

如下方案僅展示異常向量表的基本框架,實際項目中需添加功能擴展

方案一

@ ARM匯編編寫異常向量表 startup.s文件(裸機啟動文件)
.text
.global _start
_start:b reset            @ 復位異常,     該條指令的偏移地址為0x00b undef_handler    @ 未定義異常,   該條指令的偏移地址為0x04b swi_handler      @ 軟中斷異常,   該條指令的偏移地址為0x08b pref_handler     @ 預取中止異常, 該條指令的偏移地址為0x0Cb data_handler     @ 數據中止異常, 該條指令的偏移地址為0x10b .                @ b . 含義: 程序會跳轉到當前地址,本質為形成一個無限循環b irq_handler      @ 普通中斷異常, 該條指令的偏移地址為0x18b fiq_handler      @ 快速中斷異常, 該條指令的偏移地址為0x1Creset:b stop             @所有處理函數暫時都指向stop標簽, 僅用于展示基礎框架
undef_handler:b stop
swi_handler:b stop
pref_handler:b stop
data_handler:b stop
irq_handler:b stop
fiq_handler:b stopstop:b stop

方案二

@ startup.s文件(裸機啟動文件) 
.text
.global _start
_start:b resetldr pc, =undef_handlerldr pc, =swi_handlerldr pc, =pref_handlerldr pc, =data_handlerb .ldr pc, =irq_handlerldr pc, =fiq_handlerreset:b stop
undef_handler:b stop
swi_handler:b stop
pref_handler:b stop
data_handler:b stop
irq_handler:b stop
fiq_handler:b stopstop:b stop

方案三

@ startup.s文件(裸機啟動文件) 
@ 異常向量表 - 定義異常處理程序的入口點
.text                  @ 指定代碼段
.global _start         @ 聲明全局符號_start作為程序入口
_start:b reset            @ 復位異常:跳轉到reset標簽(系統啟動入口)ldr pc, _undef_handler  @ 未定義指令異常:從_undef_handler地址加載處理函數地址到PCldr pc, _swi_handler    @ 軟件中斷異常(如系統調用)ldr pc, _pref_handler   @ 預取指中止異常(指令讀取失敗)ldr pc, _data_handler   @ 數據訪問中止異常(內存訪問失敗)b .                    @ 保留異常:跳轉到自身(無限循環,防止意外執行)ldr pc, _irq_handler   @ IRQ普通中斷(外部設備請求)ldr pc, _fiq_handler   @ FIQ快速中斷(高優先級外部事件)@ 異常處理函數地址表 - 存儲實際處理函數的地址
_undef_handler:.word undef_handler    @ 存儲undef_handler函數的地址
_swi_handler:.word swi_handler      @ 存儲swi_handler函數的地址
_pref_handler:.word pref_handler     @ 存儲pref_handler函數的地址
_data_handler:.word data_handler     @ 存儲data_handler函數的地址
_irq_handler:.word irq_handler      @ 存儲irq_handler函數的地址
_fiq_handler:.word fiq_handler      @ 存儲fiq_handler函數的地址@ 異常處理函數實現(當前全部指向stop無限循環)
reset:b stop                 @ 復位處理:跳轉到停機狀態(未實現初始化)
undef_handler:b stop                 @ 未定義指令處理:跳轉到停機狀態
swi_handler:b stop                 @ 軟件中斷處理:跳轉到停機狀態
pref_handler:b stop                 @ 預取指中止處理:跳轉到停機狀態
data_handler:b stop                 @ 數據訪問中止處理:跳轉到停機狀態
irq_handler:b stop                 @ IRQ中斷處理:跳轉到停機狀態
fiq_handler:b stop                 @ FIQ中斷處理:跳轉到停機狀態@ 無限循環(停機狀態)
stop:b stop                 @ 死循環,系統暫停運行

CP15協處理器

協處理器是一種協助主處理器(CPU)完成特定任務的專用處理器,主要用于針對特定任務優化(浮點運算、內存管理),從而提高系統整體效率,協處理器不能獨立啟動或運行程序,需主處理器通過專用指令(MCR/MRC)調度 協作工作,相當于主處理器的 "專用助手"

CP15(系統控制協處理器):負責內存管理(MMU)、緩存(Cache)控制、特權級配置、異常向量表基址設置等底層系統功能;

CP15 協處理器寄存器分組

ARM 的 CP15 協處理器只有?16 個主寄存器(CRn=C0~C15),但系統控制功能復雜(內存、緩存、安全、調試等),通過?CRn(主分類)+ CRm(子分類)+ opc1/opc2(微調)?的組合,可擴展出數百種寄存器 / 功能;

協處理器指令

MRC指令將 CP15 協處理器中的寄存器數據讀取到 ARM 寄存器中;

MCR指令將 ARM 寄存器的數據寫入到 CP15 協處理器寄存器中;

MRC{cond} p15, <Opc1>, <Rd>, <CRn>, <CRm>, <Opc2>?

MCR{cond} p15, <Opc1>, <Rd>, <CRn>, <CRm>, <Opc2>?

cond:? ?指令執行的條件碼,忽略表示無條件執行;

opc1: 協處理器要執行的操作碼;

? Rd:? ARM 源寄存器,要寫入到 CP15 寄存器的數據就保存在此寄存器中;

CRn: CP15 協處理器的目標寄存器的主編號;

CRm?CRm 是 "附加寄存器",用于給CRn主寄存器提供額外的操作對象信息,當某個操作只需要CRn便可以確定(不需要額外的附加寄存器信息)時,必須把 CRm 設置為C0;

opc2:??opc2 是 "細分操作碼",當某個操作不需要這種細分(CRn+CRm已經能唯一確定操作)時,必須把 opc2 設為0(這是 “無細分操作” 的約定標記)

?ARM 官方明確規定 CP15 的opc1必須為0000,否則視為未定義指令

MRC p15, 0, r0, c0, c0, 0   @ 讀CP15的ID寄存器到r0  LDR r1, =0x80000000         @ 指定頁表起始地址(虛擬地址轉物理地址的映射表)  
MCR p15, 0, r1, c2, c0, 0   @ 寫TTBR0,配置頁表基地址

C0寄存器

當CRn=c0,opc1=0,CRm=c0,opc2=0 時表示 此時 c0寄存器為 MIDR 寄存器,MDIR 寄存器含義如下圖所示

bit[31:24]:廠商編號,0X41表示ARM公司;

bit[23:20]:內核架構的主版本號,ARM 內核版本一般使用 rnpn 來表示,比如 r0p1,其中 r0 后面的 0 就是內核架構主版本號;
bit[19:16]:架構代碼,0XF代表ARMv7 架構;

bit[15:4]:內核版本號,0XC07代表Cortex-A7內核;

bit[3:0]:內核架構的次版本號,rnpn 中的 pn,比如 r0p1 中 p1 后面的 1 就是次版本號;

C1寄存器

當CRn=c1,opc1=0,CRm=c0,opc2=0 時表示 此時 c1寄存器為 系統控制寄存器(SCTLR寄存器),SCTLR寄存器含義如下圖所示

[bit13]:異常向量表基地址選擇位,為 0 的話異常向量表基地址為 0X00000000,軟件可 以使用 VBAR寄存器來設置異常向量表的基地址,為 1 的話中斷向量表基地址為 0XFFFF0000,此基地址不可被設置。

bit[12]:I Cache(指令緩存) 使能位,為 0 的話關閉 I Cache,為 1 的話使能 I Cache;

bit[11]:分支預測使能位,如果開啟 MMU 的話,此位也會使能;

bit[10]:SWP 和 SWPB 使能位,當為 0 的話關閉 SWP 和 SWPB 指令,當為 1 的時候 就使能 SWP 和 SWPB 指令;

bit[2]:D Cache(數據緩存) 和緩存一致性使能位,為 0 的時候禁止 D Cache 和緩存一致性,為 1 時 使能;

bit[1]:內存對齊檢查使能位,為 0 的時候關閉內存對齊檢查,為 1 的時候使能內存對齊 檢查;

bit[0]:MMU 使能位,為 0 的時候禁止 MMU,為 1 的時候使能 MMU;

I Cache(指令緩存)

  • 定義:CPU 內專門存儲即將執行的指令的高速緩存;
  • 作用:減少 CPU 從內存讀取指令的延遲(內存速度遠低于 CPU),提升程序運行效率;
  • 原理:CPU 優先查詢 I Cache,命中則直接取指令;未命中時從內存加載,并將指令塊存入 I Cache 供后續復用;

D Cache(數據緩存)

  • 定義:CPU 內專門存儲程序操作的數據(如變量、數組)的高速緩存;
  • 作用:加速數據讀寫,減少內存訪問次數;
  • 原理:讀寫數據時優先查詢 D Cache,命中則直接操作;未命中時從內存加載,并緩存數據塊;

分支預測

  • 定義:CPU 提前預測分支指令(如?if-else)的執行走向(true/false),提前加載預測路徑的指令到流水線;
  • 作用:避免分支執行時的流水線停滯(因分支結果未確定時,后續指令無法執行),提升 CPU 吞吐量;

內存對齊檢查

  • 定義:CPU 檢查數據訪問地址是否符合 "對齊規則"(如?int?需存放在 4 的倍數地址,short?需存放在 2 的倍數地址);
  • 影響:若數據未對齊,ARM 芯片可能觸發?總線錯誤(Bus Error),或導致性能嚴重下降;

當為cortex-A系列的芯片配置裸機開發的開發環境,這些比特位該如何設置

bit[13]: 0 ,設置為?0?時,可通過?VBAR 寄存器?自由指定向量表基地址;

bit[12]: 0 ,裸機初期,內存系統未完全初始化(如內存控制器未配置),開啟 I Cache 會導致指令緩存與實際內存不一致,關閉I cache;

bit[11]:? 0,裸機初期代碼邏輯簡單,分支少,分支預測的收益極低;

bit[10]:? 0,SWP/SWPB 是原子指令(用于共享內存的互斥訪問),裸機開發中通常無多任務調度;

bit[2]: 0,若開啟 D Cache,寫入的數據可能暫存于 Cache 而非立即更新硬件,導致配置失效;

bit[1]: 0,裸機開發中,若自定義數據結構未嚴格對齊,開啟對齊檢查會觸發總線錯誤

bit[0]: 0,裸機開發直接操作物理地址,無需虛擬地址映射;

C12寄存器

當CRn=c12,opc1=0,CRm=c0,opc2=0 時表示 此時 c12寄存器為異常向量表基址寄存器(VBAR寄存器),VBAR寄存器含義如下圖所示

假定cortex-A系列的芯片的程序 鏈接起始地址=程序運行地址?為 0X87800000,一般推薦將異常向量表存放于鏈接起始地址,所以需要設置 VBAR 為 0X87800000,設置命令如下:

ldr r0, =0X87800000        @ r0=0X87800000
MCR p15, 0, r0, c12, c0, 0 @ 將r0里面的數據寫入到 c12 中,即 c12=0X87800000

C15寄存器

ARM 架構本身不限制 c15 寄存器的用途,芯片廠商(如高通、三星)可以根據需求自定義c15 中寄存器的功能,但 ARMv7 要求芯片廠商必須在其 "實現文檔" 中完整描述 c15 中每個寄存器的用途、位定義、操作方式;

以ARM公司為例,假設芯片內核為Cortex-A7,架構為ARMv7,查看Cortex-A7 Technical Reference Manual 手冊關于c15寄存器的定義;

CBAR寄存器

CBAR 是?系統級寄存器,用于告知處理器?GIC(通用中斷控制器)的物理基地址

CBAR寄存器特性:

  • CBAR 為?只讀寄存器,GIC基地址由?硬件設計?或?啟動固件(如 BootROM)?初始化,保證地址的穩定性,軟件無法修改;
  • 無論處理器處于?安全狀態(TrustZone Secure 模式,處理敏感數據)?還是?普通狀態(Non-secure 模式,運行普通應用),都能訪問 CBAR;
  • 特權模式(svc模式)可訪問CBAR寄存器,用戶模式無法訪問;
  • CBAR 在?所有 ARMv7 配置中均存在,無需擔心硬件選型導致的功能缺失,保證了架構兼容性;

位域結構:

  • PERIPHBASE[31:15]:存儲 GIC 基地址的?高 17 位
  • Reserved:保留位,讀為 0
  • PERIPHBASE[39:32]:?存儲 GIC 基地址的?低 8 位(對應 64 位地址的 bit39~bit32)

由于ARMv7架構誕生于?32 位向 64 位過渡時期,其架構設計允許?物理地址擴展到 40 位甚至更多,以支持大容量內存,若 CBAR 僅用 32 位,最多只能尋址 4GB 內存,無法滿足現代系統需求,所以CBAR 采用 64 位地址,但?實際寄存器僅用 32 位存儲,所以GIC基地址計算方案如下:

Reset異常

當系統上電時,便會產生reset異常,此時系統進入SVC模式,因此最先處理的任務配置異常向量表的基地址以確保系統穩定性;當處理器從一種工作模式切換到另一種工作模式,必然涉及到上下文(處理器寄存器中的內容)的保護,所以必須初始化處理器各個工作模式的棧空間以保存上下文;需要配置SCTLR(系統控制寄存器)以設置內存訪問特性;若系統運行C程序,必須搭建C語言運行環境,由于C語言標準規定,未顯式初始化的全局變量和靜態變量必須為 0 值,而未初始化的全局變量存放于?bss?段,所以必須將bss段清0,最后跳入main函數;

reset異常處理任務:

  • 設置異常向量表的基地址;
  • 配置SCTLR系統控制寄存器;
  • 初始化處理器各個工作模式的棧頂指針寄存器;
  • 清空bss段,跳入主函數;
.text
.global _start
_start:@ 異常向量表b resetldr pc, =undefined_instructionldr pc, =software_interruptldr pc, =prefetch_abortldr pc, =data_abortldr pc, =not_usedldr pc, =irqldr pc, =fiqreset:@ 重新映射異常向量表的入口地址/* Set Vector Base Address Register */mrc p15, 0, r0, c1, c0, 0bic r0, #(1<<13)mcr p15, 0, r0, c1, c0, 0ldr r0,=0x87800000mcr p15,0,r0,c12,c0,0 @ Vector Base Address Register@ 配置系統控制寄存器mrc p15, 0, r0, c1, c0, 0   @ 讀取 CP15 的 C1 寄存器到 R0 中 bic r0, r0, #(0x1 << 12)    @ 清除 C1 的 I 位,關閉 I Cache bic r0, r0, #(0x1 << 2)     @ 清除 C1 的 C 位,關閉 D Cache bic r0, r0, #0x2            @ 清除 C1 的 A 位,關閉對齊檢查 bic r0, r0, #(0x1 << 11)    @ 清除 C1 的 Z 位,關閉分支預測 bic r0, r0, #0x1            @ 清除 C1 的 M 位,關閉 MMU mcr p15, 0, r0, c1, c0, 0   @ 將 r0 的值寫入到 CP15 的 C1 中 @配置IRQ模式棧頂指針寄存器mrs r0, cpsrbic r0, r0, #0x1f          @ 將 r0 的低 5 位清零,也就是 cpsr 的 M0~M4 orr r0, r0, #0x12          @ r0 或上 0x12,表示使用 IRQ 模式 msr cpsr, r0               @ 將 r0 的數據寫入到 cpsr 中 ldr sp, =0x80600000        @ IRQ 模式棧首地址為 0X80600000,大小為2MB@配置SYS模式棧頂指針寄存器mrs r0, cpsrbic r0, r0, #0x1f          @ 將 r0 的低 5 位清零,也就是 cpsr 的 M0~M4orr r0, r0, #0x1f          @ r0 或上 0x1f,表示使用 SYS 模式 msr cpsr, r0               @ 將 r0 的數據寫入到 cpsr 中 ldr sp, =0x80400000        @ SYS 模式棧首地址為 0X80400000,大小為2MB @配置SVC模式棧頂指針寄存器mrs r0, cpsrbic r0, r0, #0x1f          @ 將r0的低 5 位清零,也就是 cpsr 的 M0~M4 orr r0, r0, #0x13          @ r0 或上 0x13,表示使用 SVC 模式msr cpsr, r0               @ 將 r0 的數據寫入到 cpsr 中ldr sp, =0X80200000        @ SVC 模式棧首地址為 0X80200000,大小為2MB @ 3. 初始化數據段@ 3.1  清空bss段ldr r0,=__bss_startldr r1,=__bss_end@ 將r2寄存器的值(0)寫入r0所指向的空間,每寫一個0,r0地址自動加1mov r2,#0 @ 將寄存器r2中的值存儲到r0所指向的內存空間,然后R0的值遞增@ IA:先存數據,后增地址@ IB:先增地址,后存數據
loop:stmia r0!,{r2}cmp r0,r1@ r0小于等于r1,繼續循環ble loop@ 4. 跳入main函數b mainundefined_instruction:b stop
software_interrupt:b stop
prefetch_abort:b stop 
data_abort:b stop
not_used:b stop
irq:b stop
fiq:b stopstop:b stop
.end

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87445.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87445.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87445.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入解析RS485通信:從原理到Linux驅動開發實踐

深入解析RS485通信&#xff1a;從原理到Linux驅動開發實踐在工業控制、智能建筑和物聯網領域&#xff0c;RS485憑借其強大的抗干擾能力和多節點組網特性&#xff0c;成為長距離可靠通信的首選方案。本文將帶您深入理解RS485的核心技術。一、RS485通信技術解析 1.1 RS485與RS232…

Linux系統常用性能分析運維命令

分類命令描述CPU性能分析相關命令mpstat -P ALL 5監控所有CPU的使用情況&#xff0c;間隔5秒后輸出一組數據。用于查看是否出現某個CPU占滿的情況CPU性能分析相關命令pidstat -u 5 1監控所有進程的CPU使用情況&#xff0c;用于查看是否出現某個進程CPU占用過高的問題CPU性能分析…

HTTP 壓縮

介紹 壓縮是提升網站性能的關鍵手段之一。對于某些類型的文件&#xff0c;最大可減少 70% 的大小&#xff0c;從而大幅降低帶寬需求。隨著時間的推移&#xff0c;壓縮算法不斷得到優化&#xff0c;新的高效算法也逐漸被客戶端和服務器所支持。 在實際應用中&#xff0c;Web 開…

STM32之循跡避障模塊TCRT5000紅外反射傳感器

目錄 一、系統概述 二、TCRT5000紅外反射傳感器簡介 2.1 基本概述 2.2 結構與工作原理 2.2.1 物理結構 2.2.2 工作流程 2.2.3 電路原理圖 2.3 電氣特性 2.4 模塊接口說明 2.5 典型應用電路 2.6 實際應用注意事項 三、硬件設計 3.1 硬件組成 3.2 硬件連…

新能源汽車功率級測試自動化方案:從理論到實踐的革命性突破

> 在800V高壓平臺普及與碳化硅半導體爆發的雙輪驅動下,傳統測試方法正經歷顛覆性變革 “當我看到工程師手動記錄測試數據時,就知道這個行業需要一場革命。”——某新能源車企測試總監的深夜感慨 ## 01 新能源汽車測試的痛點與變革 當新能源汽車的**電驅系統功率密度突…

【網絡編程】事件驅動 reactor 式的服務器(EPOLL機制)

文章目錄業務拆解事件驅動的 reactor總流程圖C 代碼實現準備工作編寫頭文件 reactor.h準備頭文件準備宏定義聲明三大模塊函數和基礎的內存變量長度定義全局變量定義 EPOLL 實例事件處理的函數與釋放資源的函數注冊服務器監聽套接字的函數accept_cb 模塊read_cb 模塊send_cb 模塊…

如何做好云服務器密碼管理

一、設置強密碼 強密碼就像是給云服務器上了一把“超級鎖”。專家建議&#xff0c;一個強密碼應該包含大寫字母、小寫字母、數字和特殊字符&#xff0c;長度至少在 12 位以上。比如說&#xff0c;“Abc12345678”就比簡單的“123456”要安全得多。有數據顯示&#xff0c;簡單密…

《新消費模式與消費者權益保護研討會》課題研討會在北京順利召開

近期&#xff0c;《新消費模式與消費者權益保護研討會》課題研討會在北京召開。來自市場監管、政法、宏觀管理等部門專家參會&#xff0c;聚焦《消費者權益保護法》《關于以新業態新模式引領新型消費加快發展的意見》等文件精神&#xff0c;探討激發市場主體活力、促進新型消費…

Gradio全解13——MCP協議詳解(6)——MCP服務器構建、測試與示例大全

Gradio全解13——MCP協議詳解&#xff08;6&#xff09;——MCP服務器構建、測試與示例大全第13章 MCP協議詳解13.6 MCP服務器構建、測試與示例大全13.6.1 開發MCP天氣服務器1. 天氣服務器概述2. 安裝Node.js并設置環境3. 構建服務器13.6.2 安裝Claude for Desktop1. 安裝Claud…

Windows 11 24H2 專業版/家庭版安裝教程(2025年6月更新版)- U盤啟動盤制作+詳細步驟

準備U盤啟動盤? 下載個叫「Rufus」的免費小工具&#xff08;百度搜就行&#xff09;。插入一個至少8GB的空U盤&#xff08;U盤會被清空&#xff0c;提前備份資料&#xff01;&#xff09;。打開Rufus&#xff0c;選你的U盤&#xff0c;ISO文件選你下載的那個 zh-cn_windows_1…

mac電腦wireshark快速實現http接口抓包

wireshark介紹 Wireshark 是一款功能強大的網絡協議分析工具&#xff0c;可以用來抓取網絡中的數據包&#xff0c;包括 HTTP 請求和響應。 wireshark安裝 安裝下載官網 https://www.wireshark.org/download.html&#xff0c;根據個人電腦環境下載安裝wireshark使用 1配置網卡2選…

Softhub軟件下載站實戰開發(十二):軟件管理編輯頁面實現

文章目錄 Softhub軟件下載站實戰開發&#xff08;十二&#xff09;&#xff1a;軟件管理編輯頁面實現?功能概述 &#x1f4cb;編輯頁面實現 &#x1f6e0;?1. 頁面結構設計2. aieEditor集成 &#x1f31f;初始化配置編輯器功能 3. 大整數處理 &#x1f522;4. 封面圖片上傳 &…

微服務外聯Feign調用:第三方API調用的負載均衡與容災實戰

01Feign 簡介 Feign 是 Spring Cloud Netflix 中的 聲明式 HTTP 客戶端&#xff0c;它如同一位貼心的信使&#xff0c;幫我們化繁為簡&#xff0c;讓服務間的調用變得輕松又高效。 Feign 的核心優勢在于&#xff1a;。 ? 聲明式調用&#xff1a;開發者只需定義接口和注解&a…

k8s pod調度基礎

目錄 一&#xff1a;replication controller和replicaset 1&#xff1a;replication controller replication controller的使用示例。 2&#xff1a;標簽與標簽選擇器 &#xff08;1&#xff09;標簽 &#xff08;2&#xff09;標簽選擇器 &#xff08;3&#xff09;標簽…

學習者的Python項目靈感

一、實用工具類 - 文件批量重命名工具 用 os 模塊實現按規則&#xff08;如添加日期、序號、替換關鍵詞&#xff09;批量重命名文件&#xff0c;適合處理大量圖片/文檔。 - 簡易待辦事項管理器&#xff08;To-Do List&#xff09; 用 tkinter 或 PyQt 做GUI界面&#xff0c;…

gRPC服務發現

基于 etcd 實現的服務發現&#xff0c;按照非規范化的 etcd key 實現&#xff0c;詳細見代碼注釋。 package discoveryimport ("context""encoding/json""fmt""go.etcd.io/etcd/api/v3/mvccpb"clientv3 "go.etcd.io/etcd/client/…

基于Linux的Spark本地模式環境搭建實驗指南

一、實驗目的 掌握Spark本地模式的安裝與配置方法驗證Spark本地環境是否搭建成功了解Spark基本操作和運行原理 二、實驗環境準備 操作系統&#xff1a;Linux&#xff08;推薦ubuntu&#xff09;Java環境&#xff1a;JDK 1.8或以上版本內存&#xff1a;至少4GB&#xff08;推…

數學建模_時間序列

什么是時間序列時間序列預測方法/模型條件&#xff1a;非白噪音平穩平穩性評估不平穩變成平穩然后用ARIMA模型確定p,qAR模型(ARMA特例)MA模型(ARMA特例)ARMA模型(普適)灰色模型神經網絡/LSTM組合預測模型向量數據預測結果和為1的情況什么是時間序列 省略具體圖形例子 時間序列…

linux用rpm包升級sudo包為sudo-1.9.17-2版本

rpm下載地址&#xff1a; https://www.sudo.ws/dist/packages/1.9.17p1/ 備注&#xff1a;其他壓縮包下載地址&#xff1a;https://www.sudo.ws/download.html sudo-1.9.17-2.el7.x86_64.rpm 檢查一下&#xff0c;本地sudo版本&#xff0c;執行&#xff1a;sudo -V 或者sudo -…

【開源項目】一款真正可修改視頻MD5工具視頻質量不損失

文章目錄 視頻MD5修改工具 ???? 目錄? 功能特點?? 系統要求??? 設計架構?? 技術原理?? 核心代碼1. 視頻MD5修改核心邏輯2. 前端異步處理代碼3. 錯誤處理與日志記錄?? 安裝方法方法一:直接下載方法二:使用本地服務器?? 使用教程基本使用步驟高級使用技巧??…