Linux中断子系统系列之基础概念篇

嵌入式客栈 2020-06-10 00:00
关注、星标 嵌入式客栈 ,干货及时送达


[导读] 对于驱动开发而言,中断机制是一个无法绕开的主题,翻看了很多资料书籍,读来读去总觉得没明白,所以尝试自底向上的分析一下Linux中断子系统的内在设计以及运行机制。将陆续分享相关的学习原创笔记,敬请关注期待。

代码分析基于内核5.4.31

如有兴趣,不妨星标一下小号,这样后续笔记将及时置顶出现在你的面前。

啥是中断/异常

处理器的典型任务是处理一系列预定的程序。为了通知处理器某些事件,有时需要中断当前正在处理的任务。中断可以由程序触发,也可以从外设异步触发。如果发生中断请求IRQ,则处理器将执行预定的中断服务程序ISR。CPU需要能处理软件错误,例如除零或显式中断调用(例如syscalls)。硬件中断由中断控制器路由到指定的处理器(如x86系统的IO-APIC)。

操作系统的总体运行机制属于事件驱动(event-driven)机制。

中断

  • 由外部硬件生成的异步事件。
  • 中断控制器芯片将每个IRQ输入映射到一个中断向量,该中断向量定位相应的中断服务程序

一个 IRQ 是来自某个设备的一个中断请求。可能的中断请求源:来自一个硬件引脚,或来自一个数据包。多个设备可能连接到同一个硬件引脚,从而共享一个 IRQ。抽象成中断请求事件,有哪些可能的事件呢:

  • GPIO 中断请求,包括边沿、电平模式
  • 外设 I2C的start/stop事件
  • USB枚举,报文
  • 网口......

异常(陷阱):由软件生成的同步事件,比如前面提到的除零,页错误

ARM32/ARM64硬件架构对比

ARM32

这里以ARMv7 为例进行描述,对于ARM32而言,CPU具有9大处理模式:

其中encoding是指的CPSR程序状态寄存器中的M[4:0],对于ARMv7而言,权限等级如下:

  • PL0-适用于用户应用程序供应商,例如从App Store下载的应用程序。
  • PL1-丰富的OS供应商,例如Android使用的Linux内核。
  • PL2-虚拟机监控程序供应商。
  • (Secure PL0)安全PL0-受信任的OS供应商提供的受信任的OS应用程序。
  • (Secure PL1)安全PL1-受信任的操作系统。
  • (Secure PL)安全PL1-提供安全固件的OEM。

ARMv7采用通用中断控制器GIC V2进行中断分发控制。

AArch64

自《Programmer’s Guide for ARMv8-A》,armv8 引入64位ARM架构,向后兼容。

  • Cortex-A53处理器是一个中档、低功耗处理器,在单个集群中有一个到四个核,每个核都有一个L1缓存子系统、一个可选的集成GICv3/4(通用中断控制器Generic Interrupt Controller)接口和一个可选的L2缓存控制器。
  • Cortex-A57处理器针对移动和企业计算应用,包括计算密集型64位应用,如高端计算机、平板电脑和服务器产品。它可以与Cortex-A53处理器一起采用 big.LITTLE技术(有的也称为异步多核架构)成为一个处理器。

ARMv8-A体系结构引入了许多更改,这些更改使得可以设计性能明显更高的处理器实现:

  • 更大的物理地址寻址能力:处理器可以访问超过4GB的物理内存。
  • 64位虚拟寻址:这样可以使虚拟内存超过4GB的限制。这对于使用内存映射文件I / O或稀疏寻址的现代台式机和服务器软件很重要。
  • 自动事件信号:利于实现低功耗、高性能的自旋锁。
  • 更大寄存器文件:31个64位通用寄存器可提高性能并减少栈开销。
  • 高效的64位立即数生成:较少对文字池的依赖。
  • 更大的PC指针相对寻址空间:+/- 4GB寻址范围,可在共享库和与位置无关的可执行文件中进行有效的数据寻址。
  • 额外的16KB和64KB翻译颗粒:这样可以减少转换后备缓冲区(TLB)的丢失率和页面遍历的深度。
  • 新的异常模型: 降低了操作系统和管理程序软件的复杂性。
  • 高效的缓存管理: 用户空间缓存操作提高了动态代码生成效率。使用数据高速缓存零指令快速清除数据高速缓存。
  • 硬件加速密码器:提高3倍至10倍较好的软件加密性能。这对于小颗粒的解密和太小而无法有效地卸载到硬件加速器上的加密非常有用,例如https。
  • Load-Acquire, Store-Release指令:针对C++11,C11,Java内存模型而设计。它们通过消除显式的内存屏障指令来提高线程安全代码的性能。
  • NEON双精度浮点高级SIMD:这使SIMD矢量化可以应用于更广泛的算法集,例如科学计算,高性能计算(HPC)和超级计算机。

上面谈到了新的异常模型,这里来看一下具体是指什么:

在ARMv8中,程序运行总是处于四个异常级别之一。在AArch64中,异常级别确定特权级别,类似于ARMv7中定义的特权级别。异常级别确定特权级别,因此在ELn程序对应于特权PLn。类似地,n值大于另一个值的异常级别处于较高的异常级别。数量比另一个少的异常级别被描述为处于较低的异常级别。

异常级别提供了适用于ARMv8架构所有运行状态的软件执行特权的逻辑隔离。它类似于计算机科学中常见的分层保护域概念。

  • EL0:普通用户应用程序。
  • EL1:操作系统内核通常描述为特权。
  • EL2:管理程序(Hypervisor)。
  • EL3:底层固件,包括安全监视器。

通常,一个软件(例如应用程序,操作系统的内核或系统管理程序)占据一个异常级别。该规则的一个例外是内核内虚拟机管理程序,例如KVM,它们在EL2和EL1上都可运行。

可运行在AArch32以及AArch64模式下:

由图可见:在AArch32模式下,EL0相对于usr 模式,而EL1则相当于Svc、Abt、Und、FIQ、IRQ、Sys模式,而EL2则相当于Hyp模式。

ARMv8-A提供两种安全状态,即安全和非安全。非安全状态也称为正常模式(normal world)。这使操作系统(OS)与受信任的OS在同一硬件上并行运行,并提供了针对某些软件攻击和硬件攻击的保护。ARM TrustZone技术使系统可以在普通和安全环境之间进行分区。与ARMv7-A架构一样,安全监视器充当在普通和安全环境之间移动的网关。

ARMv8-A 在正常模式下还提供了对虚拟化的支持。从而虚拟机监控程序或虚拟机管理器(VMM)代码可以在系统上运行,并承载多个客户操作系统。每个客户操作系统本质上都运行在一个虚拟机上。每个操作系统就不会意识到它正在与其他客户操作系统共享CPU。

ARMv8-A采用通用中断控制器GIC V3进行中断分发控制。

在AArch64中,异常可以是(synchronous exception)同步的,也可以是( asynchronous exception)异步的。

同步异常:如果异常是在执行或试图执行指令流时产生,并且返回地址提供导致该异常指令的详细信息,则将其描述为同步异常。

异步异常:异步异常不是由执行指令生成的,而返回地址可能并不总是提供导致异常的细节。异步异常的来源是IRQ(正常优先级中断),FIQ(快速中断)或SError(系统错误)。系统错误有许多可能的原因,最常见的是异步数据中止(例如,由将脏数据从缓存线写到外部内存而触发的中止)。

啥是GIC?

GIC是一种先进的微控制器总线架构(AMBA)和ARM架构兼容的系统片上(SoC)外设。它是一种高性能的、区域优化的中断控制器,具有芯片上的AMBA总线接口,根据配置,它符合AMBA高级可扩展接口(AXI)协议或AMBA AHB-Lite协议。

这里仅仅参考ARM官方文档将其中一部分从概念上加以介绍,过多细节比较枯燥就不做介绍了,个人认为仅需要从概念上去理解一下大致原理即可,没有必要去进行更深层的挖掘。除非你需要去修改这一层次的代码。


具体一点来看,GIC的总体框架如下:

  • 处理单元Processing element (PE),也即是核
  • 中断翻译服务组件Interrupt Translation Service components (ITS)
  • 中断路由基础设施Interrupt Routing Infrastructure (IRI)

比如一个SPI的中断分发路由机制如下:


分发器 Distributor:分发服务器执行中断优先级排序,并将spi和SGIs分发到连接到系统中PEs,从而进入CPU处理。如果我们将这些都看成黑盒子,可以简化理解一下:

对于GICv2与GICv3的主要显著区别是GICv3可以支持更多核,GICv3可支持超过8核的处理器。

异常/中断来了咋办?

  • 对于ARM处理器而言,异常/中断到来后,处理器对应进入不同的处理器模式(FIQ/IRQ/UND/ABT).
  • 对于ARM64处理器而言,因为处理器已经没有处理器模式机制了,因此对应变成进入何种异常级别(exception level)。处理器复位时默认进入最高级别的exception level,例如如果处理器最高支持的EL是EL2,复位后系统将处于EL2。对于那些正常通过system call产生的异常,处理器会切换到哪一个exception level这个问题也很好回答,SVC、HVC和SMC将进入处理器设定的异常级别。

然而对于异常/中断的处理,说到底还是需要进入相应的异常/中断句柄(process handler)进行处理,那么怎么进入的呢?这里自然就引入了异常向量表了,这里来看看异常向量表在哪里实现的。这里个人认为理解一下大致概念也就可以了。

ARM

对于ARMv7而言,位于./arch/arm/kernel/entry-v7m.s

ENTRY(vector_table)
 .long 0   @ 0 - Reset stack pointer
 .long __invalid_entry  @ 1 - Reset
 .long __invalid_entry  @ 2 - NMI
 .long __invalid_entry  @ 3 - HardFault
 .long __invalid_entry  @ 4 - MemManage
 .long __invalid_entry  @ 5 - BusFault
 .long __invalid_entry  @ 6 - UsageFault
 .long __invalid_entry  @ 7 - Reserved
 .long __invalid_entry  @ 8 - Reserved
 .long __invalid_entry  @ 9 - Reserved
 .long __invalid_entry  @ 10 - Reserved
 .long vector_swi  @ 11 - SVCall
 .long __invalid_entry  @ 12 - Debug Monitor
 .long __invalid_entry  @ 13 - Reserved
 .long __pendsv_entry  @ 14 - PendSV
 .long __invalid_entry  @ 15 - SysTick
 .rept CONFIG_CPU_V7M_NUM_IRQ
 .long __irq_entry  @ External Interrupts
 .endr
 .align 2
 .globl exc_ret
exc_ret:
 .space 4

对于其他的ARM架构而言,位于./arch/arm/kernel/entry-armv.S,贴上部分代码

 *
 * Interrupt dispatcher
 */
 vector_stub irq, IRQ_MODE, 4

 .long __irq_usr   @  0  (USR_26 / USR_32)
 .long __irq_invalid   @  1  (FIQ_26 / FIQ_32)
 .long __irq_invalid   @  2  (IRQ_26 / IRQ_32)
 .long __irq_svc   @  3  (SVC_26 / SVC_32)
 .long __irq_invalid   @  4
 .long __irq_invalid   @  5
 .long __irq_invalid   @  6
 .long __irq_invalid   @  7
 .long __irq_invalid   @  8
 .long __irq_invalid   @  9
 .long __irq_invalid   @  a
 .long __irq_invalid   @  b
 .long __irq_invalid   @  c
 .long __irq_invalid   @  d
 .long __irq_invalid   @  e
 .long __irq_invalid   @  f

/*
 * Data abort dispatcher
 * Enter in ABT mode, spsr = USR CPSR, lr = USR PC
 */

 vector_stub dabt, ABT_MODE, 8

 .long __dabt_usr   @  0  (USR_26 / USR_32)
 .long __dabt_invalid   @  1  (FIQ_26 / FIQ_32)
 .long __dabt_invalid   @  2  (IRQ_26 / IRQ_32)
 .long __dabt_svc   @  3  (SVC_26 / SVC_32)
 .long __dabt_invalid   @  4
 .long __dabt_invalid   @  5
 .long __dabt_invalid   @  6
 .long __dabt_invalid   @  7
 .long __dabt_invalid   @  8
 .long __dabt_invalid   @  9
 .long __dabt_invalid   @  a
 .long __dabt_invalid   @  b
 .long __dabt_invalid   @  c
 .long __dabt_invalid   @  d
 .long __dabt_invalid   @  e
 .long __dabt_invalid   @  f

/*
 * Prefetch abort dispatcher
 * Enter in ABT mode, spsr = USR CPSR, lr = USR PC
 */

 vector_stub pabt, ABT_MODE, 4

 .long __pabt_usr   @  0 (USR_26 / USR_32)
 .long __pabt_invalid   @  1 (FIQ_26 / FIQ_32)
 .long __pabt_invalid   @  2 (IRQ_26 / IRQ_32)
 .long __pabt_svc   @  3 (SVC_26 / SVC_32)
 .long __pabt_invalid   @  4
 .long __pabt_invalid   @  5
 .long __pabt_invalid   @  6
 .long __pabt_invalid   @  7
 .long __pabt_invalid   @  8
 .long __pabt_invalid   @  9
 .long __pabt_invalid   @  a
 .long __pabt_invalid   @  b
 .long __pabt_invalid   @  c
 .long __pabt_invalid   @  d
 .long __pabt_invalid   @  e
 .long __pabt_invalid   @  f

/*
 * Undef instr entry dispatcher
 * Enter in UND mode, spsr = SVC/USR CPSR, lr = SVC/USR PC
 */

 vector_stub und, UND_MODE

 .long __und_usr   @  0 (USR_26 / USR_32)
 .long __und_invalid   @  1 (FIQ_26 / FIQ_32)
 .long __und_invalid   @  2 (IRQ_26 / IRQ_32)
 .long __und_svc   @  3 (SVC_26 / SVC_32)
 .long __und_invalid   @  4
 .long __und_invalid   @  5
 .long __und_invalid   @  6
 .long __und_invalid   @  7
 .long __und_invalid   @  8
 .long __und_invalid   @  9
 .long __und_invalid   @  a
 .long __und_invalid   @  b
 .long __und_invalid   @  c
 .long __und_invalid   @  d
 .long __und_invalid   @  e
 .long __und_invalid   @  f

 .align 5
.....................
/*=============================================================================
 * FIQ "NMI" handler
 *-----------------------------------------------------------------------------
 */

 vector_stub fiq, FIQ_MODE, 4

 .long __fiq_usr   @  0  (USR_26 / USR_32)
 .long __fiq_svc   @  1  (FIQ_26 / FIQ_32)
 .long __fiq_svc   @  2  (IRQ_26 / IRQ_32)
 .long __fiq_svc   @  3  (SVC_26 / SVC_32)
 .long __fiq_svc   @  4
 .long __fiq_svc   @  5
 .long __fiq_svc   @  6
 .long __fiq_abt   @  7
 .long __fiq_svc   @  8
 .long __fiq_svc   @  9
 .long __fiq_svc   @  a
 .long __fiq_svc   @  b
 .long __fiq_svc   @  c
 .long __fiq_svc   @  d
 .long __fiq_svc   @  e
 .long __fiq_svc   @  f

 .globl vector_fiq

 .section .vectors, "ax", %progbits
.L__vectors_start:
 W(b) vector_rst
 W(b) vector_und
 W(ldr) pc, .L__vectors_start + 0x1000
 W(b) vector_pabt
 W(b) vector_dabt
 W(b) vector_addrexcptn
 W(b) vector_irq
 W(b) vector_fiq

 .data
 .align 2

 .globl cr_alignment
cr_alignment:
 .space 4

ARM64

位于./arch/arm64/kernel/entry.S,贴上部分代码

 .pushsection ".entry.text""ax"

 .align 11
ENTRY(vectors)
 kernel_ventry 1, sync_invalid   // Synchronous EL1t
 kernel_ventry 1, irq_invalid   // IRQ EL1t
 kernel_ventry 1, fiq_invalid   // FIQ EL1t
 kernel_ventry 1, error_invalid  // Error EL1t

 kernel_ventry 1, sync    // Synchronous EL1h
 kernel_ventry 1, irq    // IRQ EL1h
 kernel_ventry 1, fiq_invalid   // FIQ EL1h
 kernel_ventry 1, error   // Error EL1h

 kernel_ventry 0, sync    // Synchronous 64-bit EL0
 kernel_ventry 0, irq    // IRQ 64-bit EL0
 kernel_ventry 0, fiq_invalid   // FIQ 64-bit EL0
 kernel_ventry 0, error   // Error 64-bit EL0

#ifdef CONFIG_COMPAT
 kernel_ventry 0, sync_compat, 32  // Synchronous 32-bit EL0
 kernel_ventry 0, irq_compat, 32  // IRQ 32-bit EL0
 kernel_ventry 0, fiq_invalid_compat, 32 // FIQ 32-bit EL0
 kernel_ventry 0, error_compat, 32  // Error 32-bit EL0
#else
 kernel_ventry 0, sync_invalid, 32  // Synchronous 32-bit EL0
 kernel_ventry 0, irq_invalid, 32  // IRQ 32-bit EL0
 kernel_ventry 0, fiq_invalid, 32  // FIQ 32-bit EL0
 kernel_ventry 0, error_invalid, 32  // Error 32-bit EL0
#endif
END(vectors)

总结一下

对于做嵌入式开发,尤其需要做底层驱动开发的小伙伴们,较深入的理解一下更为底层异常/中断运行的机制,对于具体驱动开发而言是非常有帮助的。本文参考内核代码,以及ARM官方规格书大致梳理了Linux中断子系统的基础概念,以及异常/中断如何进入到CPU,以及相应的入口在哪里实现定义的。后续为逐步深入分析中断底层如何建模抽象的,采用自底向上的分析策略进而分析用户空间的调用接口,敬请关注期待。

本文辛苦原创分享,水平所限,文中估计也有蛮多错误,希望看到的同学帮忙指正,如果觉得有价值也请帮忙点赞转发支持,不胜感激!

END

往期精彩推荐,点击即可阅读




▲Linux内核中I2C总线及设备长啥样?  [推荐]
手把手教系列之状滤波器设计实现
手把手教系列之IIR数字滤波器设计实现

嵌入式客栈 欢迎关注嵌入式客栈,主要分享嵌入式Linux系统构建、嵌入式linux驱动开发、单片机技术、FPGA开发、信号处理、工业通讯等技术主题。欢迎关注,一起交流,一起进步!
评论
  • 01. 什么是过程能力分析?过程能力研究利用生产过程中初始一批产品的数据,预测制造过程是否能够稳定地生产符合规格的产品。可以把它想象成一种预测。通过历史数据的分析,推断未来是否可以依赖该工艺持续生产高质量产品。客户可能会要求将过程能力研究作为生产件批准程序 (PPAP) 的一部分。这是为了确保制造过程能够持续稳定地生产合格的产品。02. 基本概念在定义制造过程时,目标是确保生产的零件符合上下规格限 (USL 和 LSL)。过程能力衡量制造过程能多大程度上稳定地生产符合规格的产品。核心概念很简单:
    优思学院 2025-01-12 15:43 523浏览
  • 流量传感器是实现对燃气、废气、生活用水、污水、冷却液、石油等各种流体流量精准计量的关键手段。但随着工业自动化、数字化、智能化与低碳化进程的不断加速,采用传统机械式检测方式的流量传感器已不能满足当代流体计量行业对于测量精度、测量范围、使用寿命与维护成本等方面的精细需求。流量传感器的应用场景(部分)超声波流量传感器,是一种利用超声波技术测量流体流量的新型传感器,其主要通过发射超声波信号并接收反射回来的信号,根据超声波在流体中传播的时间、幅度或相位变化等参数,间接计算流体的流量,具有非侵入式测量、高精
    华普微HOPERF 2025-01-13 14:18 482浏览
  • 随着通信技术的迅速发展,现代通信设备需要更高效、可靠且紧凑的解决方案来应对日益复杂的系统。中国自主研发和制造的国产接口芯片,正逐渐成为通信设备(从5G基站到工业通信模块)中的重要基石。这些芯片凭借卓越性能、成本效益及灵活性,满足了现代通信基础设施的多样化需求。 1. 接口芯片在通信设备中的关键作用接口芯片作为数据交互的桥梁,是通信设备中不可或缺的核心组件。它们在设备内的各种子系统之间实现无缝数据传输,支持高速数据交换、协议转换和信号调节等功能。无论是5G基站中的数据处理,还是物联网网关
    克里雅半导体科技 2025-01-10 16:20 444浏览
  • 随着全球向绿色能源转型的加速,对高效、可靠和环保元件的需求从未如此强烈。在这种背景下,国产固态继电器(SSR)在实现太阳能逆变器、风力涡轮机和储能系统等关键技术方面发挥着关键作用。本文探讨了绿色能源系统背景下中国固态继电器行业的前景,并强调了2025年的前景。 1.对绿色能源解决方案日益增长的需求绿色能源系统依靠先进的电源管理技术来最大限度地提高效率并最大限度地减少损失。固态继电器以其耐用性、快速开关速度和抗机械磨损而闻名,正日益成为传统机电继电器的首选。可再生能源(尤其是太阳能和风能
    克里雅半导体科技 2025-01-10 16:18 325浏览
  •   在信号处理过程中,由于信号的时域截断会导致频谱扩展泄露现象。那么导致频谱泄露发生的根本原因是什么?又该采取什么样的改善方法。本文以ADC性能指标的测试场景为例,探讨了对ADC的输出结果进行非周期截断所带来的影响及问题总结。 两个点   为了更好的分析或处理信号,实际应用时需要从频域而非时域的角度观察原信号。但物理意义上只能直接获取信号的时域信息,为了得到信号的频域信息需要利用傅里叶变换这个工具计算出原信号的频谱函数。但对于计算机来说实现这种计算需要面对两个问题: 1.
    TIAN301 2025-01-14 14:15 108浏览
  • 随着数字化的不断推进,LED显示屏行业对4K、8K等超高清画质的需求日益提升。与此同时,Mini及Micro LED技术的日益成熟,推动了间距小于1.2 Pitch的Mini、Micro LED显示屏的快速发展。这类显示屏不仅画质卓越,而且尺寸适中,通常在110至1000英寸之间,非常适合应用于电影院、监控中心、大型会议、以及电影拍摄等多种室内场景。鉴于室内LED显示屏与用户距离较近,因此对于噪音控制、体积小型化、冗余备份能力及电气安全性的要求尤为严格。为满足这一市场需求,开关电源技术推出了专为
    晶台光耦 2025-01-13 10:42 498浏览
  • PNT、GNSS、GPS均是卫星定位和导航相关领域中的常见缩写词,他们经常会被用到,且在很多情况下会被等同使用或替换使用。我们会把定位导航功能测试叫做PNT性能测试,也会叫做GNSS性能测试。我们会把定位导航终端叫做GNSS模块,也会叫做GPS模块。但是实际上他们之间是有一些重要的区别。伴随着技术发展与越发深入,我们有必要对这三个词汇做以清晰的区分。一、什么是GPS?GPS是Global Positioning System(全球定位系统)的缩写,它是美国建立的全球卫星定位导航系统,是GNSS概
    德思特测试测量 2025-01-13 15:42 492浏览
  • 食物浪费已成为全球亟待解决的严峻挑战,并对环境和经济造成了重大影响。最新统计数据显示,全球高达三分之一的粮食在生产过程中损失或被无谓浪费,这不仅导致了资源消耗,还加剧了温室气体排放,并带来了巨大经济损失。全球领先的光学解决方案供应商艾迈斯欧司朗(SIX:AMS)近日宣布,艾迈斯欧司朗基于AS7341多光谱传感器开发的创新应用来解决食物浪费这一全球性难题。其多光谱传感解决方案为农业与食品行业带来深远变革,该技术通过精确判定最佳收获时机,提升质量控制水平,并在整个供应链中有效减少浪费。 在2024
    艾迈斯欧司朗 2025-01-14 18:45 66浏览
  • 根据Global Info Research(环洋市场咨询)项目团队最新调研,预计2030年全球无人机电池和电源产值达到2834百万美元,2024-2030年期间年复合增长率CAGR为10.1%。 无人机电池是为无人机提供动力并使其飞行的关键。无人机使用的电池类型因无人机的大小和型号而异。一些常见的无人机电池类型包括锂聚合物(LiPo)电池、锂离子电池和镍氢(NiMH)电池。锂聚合物电池是最常用的无人机电池类型,因为其能量密度高、设计轻巧。这些电池以输出功率大、飞行时间长而著称。不过,它们需要
    GIRtina 2025-01-13 10:49 188浏览
  • 数字隔离芯片是现代电气工程师在进行电路设计时所必须考虑的一种电子元件,主要用于保护低压控制电路中敏感电子设备的稳定运行与操作人员的人身安全。其不仅能隔离两个或多个高低压回路之间的电气联系,还能防止漏电流、共模噪声与浪涌等干扰信号的传播,有效增强电路间信号传输的抗干扰能力,同时提升电子系统的电磁兼容性与通信稳定性。容耦隔离芯片的典型应用原理图值得一提的是,在电子电路中引入隔离措施会带来传输延迟、功耗增加、成本增加与尺寸增加等问题,而数字隔离芯片的目标就是尽可能消除这些不利影响,同时满足安全法规的要
    华普微HOPERF 2025-01-15 09:48 83浏览
  • 在不断发展的电子元件领域,继电器——作为切换电路的关键设备,正在经历前所未有的技术变革。固态继电器(SSR)和机械继电器之间的争论由来已久。然而,从未来发展的角度来看,固态继电器正逐渐占据上风。本文将从耐用性、速度和能效三个方面,全面剖析固态继电器为何更具优势,并探讨其在行业中的应用与发展趋势。1. 耐用性:经久耐用的设计机械继电器:机械继电器依靠物理触点完成电路切换。然而,随着时间的推移,这些触点因电弧、氧化和材料老化而逐渐磨损,导致其使用寿命有限。因此,它们更适合低频或对切换耐久性要求不高的
    腾恩科技-彭工 2025-01-10 16:15 100浏览
  • ARMv8-A是ARM公司为满足新需求而重新设计的一个架构,是近20年来ARM架构变动最大的一次。以下是对ARMv8-A的详细介绍: 1. 背景介绍    ARM公司最初并未涉足PC市场,其产品主要针对功耗敏感的移动设备。     随着技术的发展和市场需求的变化,ARM开始扩展到企业设备、服务器等领域,这要求其架构能够支持更大的内存和更复杂的计算任务。 2. 架构特点    ARMv8-A引入了Execution State(执行状
    丙丁先生 2025-01-12 10:30 466浏览
  • 新年伊始,又到了对去年做总结,对今年做展望的时刻 不知道你在2024年初立的Flag都实现了吗? 2025年对自己又有什么新的期待呢? 2024年注定是不平凡的一年, 一年里我测评了50余块开发板, 写出了很多科普文章, 从一个小小的工作室成长为科工公司。 展望2025年, 中国香河英茂科工, 会继续深耕于,具身机器人、飞行器、物联网等方面的研发, 我觉得,要向未来学习未来, 未来是什么? 是掌握在孩子们生活中的发现,和精历, 把最好的技术带给孩子,
    丙丁先生 2025-01-11 11:35 457浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦