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开发、信号处理、工业通讯等技术主题。欢迎关注,一起交流,一起进步!
评论
  • 近期,据全球物联网市场调研机构IoT Analytics公布数据显示,2025年全球物联网设备连接数预计将突破200亿,同比增长约14%,物联网技术正以稳定上升态势向工业自动化、智慧城市、智慧农业与智慧家居等领域纵深推进。在多样化的应用场景和复杂环境需求的驱动下,物联网无线通信技术的运行功耗、传输距离和频段兼容性正受到前所未有的关注。为增加物联网通信模块的配置灵活度,消除物联网设备的“连接焦虑”,华普微重磅推出了一款自主研发的超低功耗、可兼容Sub-GHz与2.4GHz 双频段的高性能LoRa
    华普微HOPERF 2025-03-18 15:43 60浏览
  • 随着汽车行业逐步迈向电气化和电池动力,位置传感器以及其他长期在车辆中被忽视但却至关重要的小型元器件正逐渐成为关注的焦点。某些电子元器件常常吸引大量关注,例如如今用于训练AI模型的强大GPU几乎每天都出现在新闻中。而其他元器件则默默地执行着重要但鲜为人知的功能。艾迈斯欧司朗一些历史悠久的产品线便隶属于后者,其中包括磁性和电感式位置传感器、电容式传感器和电池监控芯片。工业泵和风扇等产品的制造商利用位置传感器实现电动机高效平稳运行。在车辆的方向盘中安装电容传感器可以保障安全,它可以用于在辅助驾驶模式下
    艾迈斯欧司朗 2025-03-17 22:22 73浏览
  • 一、问题现象:语音播放异常的典型表现在使用WT588F(E)系列语音芯片的开发过程中,工程师常会遇到以下两类典型异常现象:播放不全:语音仅播放前段内容后突然中断,或特定段落无法触发播放断续:音频输出存在明显卡顿、爆音或波形畸变某智能门锁项目实测数据显示,在首批样机中有2%的设备出现语音提示突然中断的情况,经排查发现电源电压在播放瞬间跌落至2.0V(低于芯片工作阈值)。这类问题的根源往往隐藏于硬件设计与系统协同的细节之中。二、核心机理:电压稳定性对语音芯片的影响2.1 电源系统的动态响应特性WT5
    广州唯创电子 2025-03-17 09:18 127浏览
  • 在制药行业中,生产工艺的精准控制与产品质量安全密切相关。随着制药工业4.0的发展,传感器作为生产流程的"感知器官",在确保合规性、提升效率、降低风险方面发挥着不可替代的作用。本文将以晨穹电子科技(以下简称"晨穹")的压力、温度、流量及液位传感器为例,解析制药厂关键工艺流程中的传感器应用场景及技术要求。一、制药核心工艺流程中的传感器需求1. 原料处理与配液系统液位监测:储罐内原料液位实时监控需使用卫生型液位计。晨穹磁翻板液位计采用316L不锈钢材质,具备CIP/SIP(在线清洗/灭菌)耐受性,符合
    传感器晨穹 2025-03-18 15:51 72浏览
  • 在招聘合适的人才时,清晰度至关重要。想要找到合适的人选,并确保他们在岗位上取得成功,第一步就是明确职位的关键绩效指标(KPI)和预期成果。但光有这些还不够,如何判断候选人是否具备必要的特质?这时,KSA模型就派上用场了。它是一个简单但强大的方法,能帮助你聚焦于真正影响岗位表现的关键要素。今天,我想和你聊聊这个模型,帮你更轻松地为合适的候选人设定合适的KPI。了解KSA模型KSA代表知识(Knowledge)、技能(Skills)和态度(Attitude),是评估候选人是否适合岗位的三个关键维度。
    优思学院 2025-03-18 15:03 63浏览
  • 文/Leon编辑/cc孙聪颖‍蛇年春晚最有意思的节目,一定非机器人跳舞莫属。就算是遥控或预编程,机器人能够做出如此复杂的动作,在五年前都是不敢想象的事情,其制造商宇树科技也因此火爆全网。就在春节过后不到一个月,会骑自行车的人形机器人诞生了。这背后,是近年来“具身智能”概念的迅猛发展。“我们造了一个跟人一样灵动的机器人!”3月11日,智元机器人联合创始人兼首席技术官彭志辉在微博上说道。在视频中,灵犀X2会骑自行车、能跳《科目三》,还可以与人促膝长谈,甚至拿起葡萄“穿针引线”。在全球人形机器人领域,
    华尔街科技眼 2025-03-17 12:38 112浏览
  • 晨穹电子一家专业从事研发、生产、销售各类传感器为一体的高新科技企业。1 人赞同了该文章在工业4.0、智能家居、新能源汽车等场景中,传感器作为数据采集的核心器件,其抗电磁干扰(EMC)能力直接影响系统可靠性。尤其在5G通信、高功率电机、无线充电等复杂电磁环境下,传感器的信号失真问题愈发突出。本文结合MEMS传感器、物联网(IoT)设备、边缘计算等热度技术,解析提升传感器抗干扰能力的6大策略。 一、电磁干扰对传感器的威胁; 1、电磁干扰(EMI)会导致传感器出现 。2、信号跳变(
    传感器晨穹 2025-03-18 09:28 83浏览
  •        在工业视觉检测线上,一台搭载传统图像传感器的机器人因高温导致图像噪点激增,误将合格零件判定为瑕疵品,每小时损失超10万元;在深夜的安防监控画面中,模糊的噪点让犯罪分子身影难以识别,导致案件侦破延迟—— 噪声,已成为图像传感器行业的“无声杀手”。据Yole统计,全球约35%的工业检测误差源于传感器噪声干扰,而安防场景下60%的有效信息因低照度噪点丢失。传统方案试图通过单一优化像素或电路来降噪,却陷入“按下葫芦浮起瓢”的困境。  &nb
    中科领创 2025-03-18 10:24 52浏览
  • 在工业4.0与智能制造深度融合的今天,设备实时性、稳定性和成本效益成为企业核心竞争力的关键。触觉智能将基于RK3506平台,分享工业应用方案,本期为大家带来DSMC串行接口在数控行业的应用。DSMC技术解析底层架构突破双倍数据速率:通过上升沿与下降沿双重触发机制,实现单周期内2倍数据吞吐量,较传统SPI接口效率提升300%。多通道并行:支持8线/16线位宽可配置模式,满足多轴协同场景下的同步通信需求。性能实测标杆超低延迟:FPGA互联场景下,写延时小于75ns,读延时小于260ns,相比PCIe
    Industio_触觉智能 2025-03-18 11:46 58浏览
  • esp32s3使用platformio 点亮1.69寸TFT历程之LVGL移植 继上一篇我历经很久的时间点亮了1.69寸TFT之后。我开始进行LVGL的移植。开始LVGL的学习。用platformio 开发esp32s3真的好方便。按照上一节的环境。本次由于需要使用LVGL。打开platformio lib界面搜索LVGL。目前里面的版本是9.2.2。我使用的8.3.6。然后按照下图加载到自己的工程项目。待加载完毕后。我们会看到libdeps下面会出现LVGL库好了,这一步完成后。我们就开始移植
    zhusx123 2025-03-15 20:58 119浏览
  • 新兴的个人健康监测技术为何在医疗场景和日常生活中越来越受到青睐?为了准确回答这个关键问题,我们首先需要理解三个全球性趋势:如今,几乎人手一部智能手机,这等于随身携带了一台高性能计算机、一个全天候运行的智能医疗传感器中心,还有一块显示屏。发达工业国家的人口正在迅速老龄化,而老年群体的疾病发病率较高。与此同时,年轻人也比过去更加关注如何延长健康寿命。这些人群以及服务他们的医务人员可以利用新技术来优化生活方式,合理调控运动、饮食、睡眠和压力等关键因素,帮助他们作出更健康的生活选择。如摩尔定律所预言,半
    艾迈斯欧司朗 2025-03-17 21:50 77浏览
  • 一、引言:语音芯片的智能化浪潮在万物互联的智能化时代,语音交互技术已成为人机交互的重要纽带。从智能家电的提示音到儿童玩具的趣味互动,从工业设备的语音告警到公共服务设施的自动播报,语音播放芯片IC作为核心硬件支撑,正在重塑各行各业的用户体验。在众多解决方案中,WTN6、WT588、WT2003H、WTV四大系列产品,凭借差异化的技术特性构建了完整的语音芯片产品矩阵。本文将深度解析这四大主流芯片的技术特点与应用场景,为开发者提供选型参考。二、主流语音芯片技术特性全解析2.1 WTN6系列:高性价比的
    广州唯创电子 2025-03-17 09:04 146浏览
  • 近日,2025年GTI国际产业大会成功举办,活动上GTI Awards 2025获奖名单正式揭晓,紫光展锐连续三年斩获国际权威机构GTI颁发的大奖。此次,T8300凭借在5G技术创新和娱乐体验方面的卓越表现,荣获GTI“移动技术创新突破奖”(Innovative Breakthrough in Mobile Technology Award)。GTI是由中国移动、软银、沃达丰等运营商于2011年发起成立的国际产业合作平台。GTI Awards作为全球通信行业最具影响力的奖项之一,旨在表彰为行业
    紫光展锐 2025-03-14 17:35 78浏览
  • 失效模式与影响分析(FMEA)失效模式与影响分析(FMEA)是一种系统方法,用于识别和分析系统或过程中的潜在失效,广泛应用于工程和制造领域,以提高产品可靠性和安全性。最新标准由 2019 年发布的 AIAG-VDA FMEA 手册(第一版) 定义,该手册结合了美国和欧洲汽车行业的最佳实践,并引入了 七步法,确保分析全面且结构化。图:优思学院六西格玛新版 FMEA 失效分析的七个步骤1. 规划与准备确定 FMEA 研究的 范围、边界和目标。组建跨职能团队(设
    优思学院 2025-03-17 14:43 115浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦