当前位置: 首页 > article >正文

硬件与软件的边界-从单片机到linux的问答详解


硬件与软件的边界——从单片机到 Linux 设备驱动的问答详解

在嵌入式开发和操作系统领域,经常会有人问:

“如果一个设备里没有任何代码,硬件是不是依然会工作?例如,数据收发、寄存器数据存储、甚至中断触发,这些底层硬件电路是不是依然能正常运行?”

这篇文章将以对话问答的形式详细对话,从 Arduino Nano 的 Flash 全擦除问题开始,顺势讨论 Linux 操作系统中设备驱动的原理和单片机中程序的作用,展现硬件电路的独立功能以及软件代码对其的“驾驭”作用。


第一部分:Arduino Nano 的 Flash 全擦除情况

用户提问 1

我有一个 Arduino Nano 开发板,其内置 Flash 用来存放 Bootloader 和用户程序。通常 Bootloader 从地址 0 开始,到某个地址结束,而后面的区域供用户程序烧录。如果 Flash 中的数据全部丢失(变成全 1 或全 0),这种情况下我的单片机还能接收数据吗?

比如说,如果强行给它连接串口、SPI 或 USB,不断发送数据,是不是硬件仍然会通过移位寄存器把数据捕获存入寄存器,直到寄存器填满,进而触发对应的_interrupt_?还是说即便触发了中断,也只是因为没有代码处理而已?请详细分析,如果真是 Flash 全空,将会发生哪些情况?


回答 1

在正常工作时,Arduino Nano(如基于 ATmega328P)的 Flash 存储区中存放着 Bootloader 和用户程序,MCU 上电或复位后便从 Flash 地址 0 取指令执行。下面详细说明 Flash 全擦除(全 1 或全 0)时可能出现的情形:

  1. 系统启动与代码执行:

- 正常情况:

正常上电时,CPU 从 Flash 起始地址执行 Bootloader。Bootloader 对外设进行初始化、监听串口/USB 等以便下载用户程序。

- Flash 全擦除:

若 Flash 数据全部被擦除,Bootloader 区域也随之消失。MCU 复位时从地址 0 取到的指令是无效的(例如全 1 的 0xFFFF 或全 0),CPU 会误将其解析为非法或未定义指令,从而导致:

- 进入死循环或执行随机跳转;

- 系统自动复位;

- 或在中断触发时,由于中断向量表也在 Flash 中而失效,导致跳转到错误地址,引发异常或复位。

  1. 外设数据接收与中断处理:

- 硬件数据采集:

无论 Flash 中是否有代码,只要外部数据符合时序和电平要求,单片机内部的串口(UART)、SPI 或 USB 模块中嵌入的移位寄存器都会捕捉输入的数据,将数据逐位合成后写入对应的接收缓冲区。

- 中断信号触发:

当接收缓冲区填满或达到设定条件时,硬件控制逻辑会将相应状态标志置位,必要时生成中断信号。但是否真正触发中断,还取决于寄存器中的中断使能位是否已激活。

- 在缺少初始化代码的情况下, 外设大多保持在默认复位状态,中断使能位通常为关闭状态,即使数据进入缓冲区也不会真正发出中断。

- 极少情况: 如果默认状态下中断被激活,缓冲区满时确实会生成中断信号,但由于中断向量表内容无效,系统一旦跳转会进入未定义域,最终导致 MCU 异常或复位。


第二部分:当硬件工作却没有软件处理时

用户提问 2

这让我联想到 Linux 操作系统的原理。或者说单片机中程序的作用。

一个设备若完全没有任何代码,硬件层面仍然会执行数据收发任务。例如,数据从外部送入后,接收寄存器将数据一个个 bit 地存入,当数据填满后会触发电信号,表示一个中断。但这中断没有软件去处理而已。因此,编写程序的目的就在于处理这些对应的中断信号,从而完成诸如网卡收发数据、串口接收数据等任务。

换句话说,就算没有任何软件代码,从硬件底层看,数据收发、触发中断等行为依然正常工作,而这些都是硬件电路的功劳,与软件代码无关。请对此再详细说明一下。


回答 2

你对硬件与软件间分工的理解非常准确。硬件电路具有独立于软件的基本功能,而软件代码的存在正是为了控制、管理和利用这些硬件信号,使之为具体任务服务。具体说明如下:

  1. 硬件电路的独立运行:

- 数据收发:

硬件模块(例如串口、SPI 控制器)内嵌有移位寄存器,其设计目的是在时钟和电平匹配的条件下自动捕捉传入数据,并将数据逐位组成完整的字节,存入接收缓冲区。这一过程完全由电路逻辑实现,与 Flash 中是否存储代码无任何依赖。

- 中断触发:

当接收缓冲区满或者达到预设条件后,硬件会置位状态标志并生成中断信号。这种中断信号本身就是一个电信号输出,代表硬件已完成一个动作(例如数据接收完成),其生成过程是由硬件电路固定完成的。

  1. 软件代码的作用:

- 中断服务与数据处理:

软件代码(如 Linux 设备驱动或 MCU 内的程序)负责在硬件触发中断后从中断向量表中找到对应的中断服务程序(ISR),然后调用该处程序进行数据读取、处理与存储。

- 在 Linux 系统中,各类设备如网卡、串口设备都有专门的驱动程序处理由硬件产生的中断信号,从而实现数据转发、协议处理等高层功能。

- 在嵌入式系统中,用户编写的代码同样需要配置和使能中断功能,一旦硬件检测到数据或事件,ISR 就会被调用去执行相应任务。

  1. “没有代码”时的现象:

- 硬件动作依然正常:

如前所述,单片机或 MCU 内的硬件电路依旧会执行数据采集和中断信号触发工作。

- 无响应的后果:

若设备中没有任何代码(例如 Flash 全擦除),虽然数据依然可能被捕获到寄存器中,中断信号依然由硬件产生,但没有中断服务程序去处理这些信号,整个系统便无法将硬件行为转化为有用的数据处理流程。

这正突显了软件代码(无论是操作系统内核中的驱动还是嵌入式系统中的应用程序)的重要作用:“把硬件干的事儿接起来”,使之转化成实际服务。


第三部分:整体理解与归纳

关键观点

  • 硬件电路的坚韧性:

无论设备内部有没有代码,硬件电路总会按照设计去捕捉和处理信号。从串口数据移位、数据寄存器填充,到信号满足条件后触发中断,一切都是预先固定好的数字逻辑电路的本能反应。

  • 软件的驾驭作用:

软件代码——无论是 Linux 设备驱动还是嵌入式 MCU 程序——负责读取和处理中断产生的信号,将硬件层面的数据有效利用起来。没有软件,硬件虽然“动”了,但功能无法实现转化,系统也不会产生实际功效。

  • 同类对比:

在 Linux 操作系统中,设备驱动的作用是捕捉硬件中断、读取数据,然后交由上层协议栈处理;在单片机中,编程的目的也是通过中断服务程序实现对数据收发、外设控制的软硬件协同。

ASCII 示意图重温

下面这个简单的 ASCII 流程图展示了当数据从外部输入,到硬件捕获,再到中断触发的基本流程:

┌─────────────────────────┐│ 外部数据源(如串口) │└───────┬───────────────┘│ (匹配电平和时序)▼┌────────────────────┐│ 移位寄存器/接收模块 │ ← 自动工作(无代码依赖)└────────────────────┘│▼┌────────────────────┐│ 数据接收缓冲区 │ ← 数据存储后置位状态标志└────────────────────┘│▼┌────────────────────┐│ 中断控制逻辑 │ ← 触发中断信号(依赖中断使能)└────────────────────┘

正是因为硬件电路按照这种预设逻辑工作,所以无论是否有软件代码,数据接收和中断信号的生成均会发生。但只有软件代码能将这些硬件动作转化为实际可用的功能。


结语

本文通过问答对话的形式,探讨了以下核心问题:

  1. Flash 全擦除时单片机的启动问题:

- 无有效 Bootloader 导致 CPU 从无效指令处启动,引发死循环、异常或复位;

- 外设虽然依然捕获数据并可能触发中断,但因没有初始化,中断向量表也无效,系统无法正常工作。

  1. 设备硬件与软件的分工:

- 硬件层面的移位寄存器、数据缓存和中断生成完全依赖于电路设计,与 Flash 代码无直接关系;

- 软件代码则负责捕捉这些硬件信号(通过中断服务程序),实现数据处理、通信协议执行等实际功能。

  1. Linux 操作系统与嵌入式应用中的共性:

- 无论是 Linux 下的设备驱动,还是单片机中的 ISR,都是基于相同的硬件信号而设计;

- 无代码时,硬件动作照常发生,但最终系统功能无法落地。

这深刻说明了**“写程序就是需要处理对应中断信号,完成指定任务”**这一原理。硬件电路为数据收发、信号触发提供了坚实基础,而软件代码则将这些原始动作组织起来、赋予意义,完成如网卡收发数据以及串口通信等高层功能。


Arduino Nano Flash 全擦除情况下的行为问答详解

在嵌入式开发中,很多人在调试和使用 Arduino Nano 时,会关注 MCU 内 Flash 存储区的工作原理,尤其对于 Bootloader 的作用、数据接收以及中断响应等方面都有疑问。下面是一段详细对话记录,展示了问题与回答的完整交流过程,帮助你从中深入理解在 Flash 全擦除(全为 1 或全为 0)情况下,MCU 内部各模块(如移位寄存器、外设数据接收、中断逻辑等)的行为和可能的后果。


第一部分:关于 Bootloader 与 Flash 丢失后系统行为的讨论

用户提问

问题 1:

我的一个 Arduino Nano 的开发单片机(CPU 板子)里面有一个 Flash,如果我没记错的话,里面应该有一个叫 bootloader 的程序。这个程序应该从地址 0 开始到某个地址结束,然后在后面的区域放置用户烧录程序。一般来说,bootloader 负责通过 USB 接收数据,并把接收到的数据写入 Flash 中指定的位置。

现在的问题是:如果通过某种方式让这个 Flash 中的数据全部丢失,变成全 0 或全 1,那么这种情况下,我的单片机还能接收数据吗?

比如说,如果强行给它连接串口、SPI、USB,然后不断发送数据,那么外设是否能依然将数据存入对应寄存器?某些寄存器的数据是否会装满,并触发对应的中断信号?还是说即使中断触发了,也只是因为没有程序来处理而已?

总之,如果 Flash 全被清空,会发生哪些情况?请你详细分析一下。


回答 1

在正常工作情况下,Arduino Nano(例如基于 ATmega328P)的 Flash 用于存放 Bootloader 和用户程序。下面详细分析当 Flash 全擦除后可能出现的情形:

  1. 系统启动与代码执行:

- 正常流程:

当 MCU 上电或复位时,CPU 会从 Flash 的起始地址(复位向量所在地址)开始执行程序。预先烧录的 Bootloader 会运行,用于初始化外设和监听串口(或者 USB 转串口芯片)接收升级数据。

- Flash 全擦除情况:

如果 Flash 中的数据全部丢失(通常擦除后内容为全 1,当然也可能全 0),Bootloader 区段也随之丢失。当 MCU 复位后,CPU 从地址 0 处取指令,取到全 1(如 0xFFFF)或全 0,这通常会被解析成无效或未定义的指令。结果可能会有以下几种:

- 非法指令执行或未定义行为: MCU 可能进入死循环、跳转到随机地址或者直接复位;

- 中断向量表缺失: 因为中断向量表也存放在 Flash,若其内容为空,则当外设触发中断时,CPU 会跳转到非法地址,导致系统崩溃或复位。

  1. 外设数据接收与中断处理:

- 数据采集机制:

MCU 的外设(例如 UART)的硬件设计内嵌有移位寄存器,用于将从外部输入的串行数据采样转换为完整的字节,并放入数据缓冲区。这个过程是硬件电路实现的,与 Flash 中是否有代码无关,只要满足时序及电平要求,就会工作。

- 默认状态下的外设:

复位后,许多外设的寄存器会处于默认状态。通常默认状态下,系统需要软件去初始化和设置具体工作模式(例如启用 USART 中断、设置波特率等),否则外设可能只是处于静默状态。

- 数据和中断可能情况:

- 如果外部强行发送数据,硬件上的移位寄存器在条件满足时可能会依然捕获数据,将数据放入接收缓冲区;

- 但是否触发中断则依赖于外设控制寄存器中是否默认激活了中断使能位。若默认未开启,则即使数据捕获也不会发起中断;

- 若默认开启(情况较为少见),缓冲区满后可能触发中断。但由于中断向量表内容无效,跳转到空地址会造成错误或复位。


第二部分:关于强行发送数据与硬件行为的讨论

用户提问

问题 2:

那么如果强行发送数据,会有移位寄存器处理,将数据放到寄存器里吗?是否会接收到硬件指定的数据,甚至触发对应的中断信号呢?


回答 2

我们来看一下在这种极端情况下,硬件层面可能出现的情况:

  1. 移位寄存器与数据采集:

- 工作原理:

MCU 的串口(UART)等外设内部配有移位寄存器,用于实时接收外界串行数据。只要外来的信号电平与时序符合要求,这个移位寄存器就会工作,将数据逐位移入,最终形成完整的字节,存入接收缓冲区。

- 独立性:

此部分硬件逻辑嵌入在芯片内部,与 Flash 中的程序无关。也就是说,即使 Flash 数据被完全擦除,只要外设模块在复位默认状态下允许数据采样,接收过程依然可能正常发生。

  1. 中断触发:

- 条件:

当接收缓冲区满后,外设状态寄存器会置位某些标志位,此时如果对应的中断使能位打开,系统就会触发中断信号进入中断服务程序。

- 默认状态的影响:

通常在复位初期,大多数 MCU 的外设中断使能并未自动打开,因而即便捕获到数据,也不会自动调用中断服务程序。

但如果有极少数情况下默认中断被激活,那么:

- 数据采集后确实可能触发中断,请求 CPU 跳转到中断向量地址;

- 由于 Flash 为空,其中断向量表内容无效,此时跳转会进入未定义行为,可能导致系统异常或复位。


整体逻辑的 ASCII 图示

为了更直观地展示数据从外部到 MCU 内部的处理过程,下图提供了一个简化的示意:

┌─────────────────────────┐│ 外部数据源(串口等) │└───────┬───────────────┘│ (匹配电平和时序)▼┌────────────────────┐│ 移位寄存器/接收模块 │ ← 若默认激活则工作└────────────────────┘│▼┌────────────────────┐│ 数据缓冲区寄存器 │ ← 当数据完整后置位状态标志└────────────────────┘│▼┌────────────────────┐│ 中断控制逻辑 │ ← 仅在中断使能时触发中断└────────────────────┘

第三部分:总结与后续思考

总结问答:

  • 对于问题 1:

当 Arduino Nano 内 Flash 数据全部丢失,MCU 启动时无法执行 Bootloader 或用户程序,CPU 取到无效指令导致异常、死循环或复位。同时,中断向量表也无效,进而引发中断触发时的不可预期行为。

关键点:

- 系统启动失败;

- 外设虽然在理论上能采集数据,但没有初始化代码支持;

- 中断一旦触发,由于无有效中断向量,会导致系统崩溃或不停复位。

  • 对于问题 2:

即使在 Flash 全擦除情况下,只要外部数据符合电平和时序要求,硬件内的移位寄存器依然可能会捕获数据,数据会进入接收缓冲区。不过是否触发中断则依赖于:

- 是否在默认复位状态中激活了外设接收及中断(通常默认情况下中断未被使能),

- 如果触发了中断,由于中断向量表无效,最终会导致异常或系统复位。

衍生思考:

  1. 外设硬件和 Flash 内容的独立性:

设计上,MCU 内部的移位寄存器和大部分数据采集功能直接由硬件实现,与 Flash 是否有有效程序没有直接关系,但外设在大多数情况下需要软件初始化才能以正确的模式运行。

  1. 异常处理与恢复方案:

当 Flash 全擦除导致 Bootloader 消失时,常见的做法是通过 ISP 或高压编程接口对芯片重新刷写 Bootloader 来恢复设备。为避免设备“砖化”,很多开发板会预留这样的备选编程接口。

  1. 默认状态分析:

不同 MCU 型号在复位状态下各外设行为不尽相同。一般来说,默认状态下外设中断及复杂配置未被激活,因此“强行发送数据”虽然在物理层面数据可能被捕获,但系统无法正确处理和响应这些数据。


结语

以上问答详细演示了在 Arduino Nano Flash 数据全部丢失情况下的系列行为分析。

  • 问题 1 主要涉及了系统启动流程、 Bootloader 作用以及 Flash 内容缺失后可能引起的异常。

  • 问题 2 则聚焦在外设数据采集(移位寄存器的工作)和中断触发这两个核心问题上。

通过这段详细的对话,你可以看到,即使硬件电路依然存在且可能在默认条件下捕获数据,但关键的程序和中断处理逻辑都依赖于 Flash 内的有效代码,当 Flash 全空后,MCU 将无法正确响应和处理数据,最终可能导致系统崩溃或不断重启。

相关文章:

硬件与软件的边界-从单片机到linux的问答详解

硬件与软件的边界——从单片机到 Linux 设备驱动的问答详解 在嵌入式开发和操作系统领域,经常会有人问: “如果一个设备里没有任何代码,硬件是不是依然会工作?例如,数据收发、寄存器数据存储、甚至中断触发&#xff…...

5.实现 Channel 类,Reactor 模式初步形成

目录 由联合体epoll_data引出类Channel 结构体epoll_data_t Channel类 Channel类的使用 Epoll类的改变 由联合体epoll_data引出类Channel 在之前使用epoll时,有使用到一个结构体epoll_event // 这是联合体,多个变量共用同一块内存 typedef union…...

深度剖析:U盘打不开难题与应对之策

一、引言 在数字化办公与数据存储的浪潮中,U盘凭借其小巧便携、大容量存储等优势,成为了人们日常数据传输与备份的得力助手。然而,当我们急需调用U盘中的关键数据时,却常常遭遇U盘打不开的棘手状况。U盘打不开不仅会影响工作进度&…...

洛谷题单3-P5721 【深基4.例6】数字直角三角形-python-流程图重构

题目描述 给出 n n n,请输出一个直角边长度是 n n n 的数字直角三角形。所有数字都是 2 2 2 位组成的,如果没有 2 2 2 位则加上前导 0 0 0。 输入格式 输入一个正整数 n n n。 输出格式 输出如题目要求的数字直角三角形。 输入输出样例 输入…...

一起学大语言模型-通过ollama搭建本地大语言模型服务

文章目录 Ollama的github地址链接安装下载需求配置更改安装目录安装更改下载的模型存储位置Ollama一些目录说明日志目录 运行一个模型测试下测试下更改服务监听地址和端口号 Ollama的github地址链接 https://github.com/ollama/ollama 安装 下载 mac安装包下载地址&#xff1…...

AllData数据中台商业版发布版本1.2.9相关白皮书发布

文章末尾网盘链接获取白皮书,本资源通过星球社群不定时更新,加入星球后,请联系市场同事获取相关知识星球社群信息。 一、总体介绍 主要介绍了AllData商业版产品的整体情况,包括产品定位、核心优势、灵活性和扩展性等,已有150个客户使用,社区发展良好。同时,详细解析了…...

uni-app 框架 调用蓝牙,获取 iBeacon 定位信标的数据,实现室内定位场景

背景:最近需要对接了一个 叫 iBeacon 定位信标 硬件设备,这个设备主要的作用是,在信号不好的地方,或者室内实现定位,准确的找到某个东西。就比如 地下停车场,商城里,我们想知道这个停车场的某个…...

leetcode-热题100(3)

leetcode-74-搜索二维矩阵 矩阵最后一列升序排序,在最后一列中查找第一个大于等于target的元素 然后在该元素所在行进行二分查找 bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) {int n matrixSize;int m matrixColSize[0];in…...

汇编学习结语

一天之内挑战计划太乐观了, 不过还好,这次我总共用了三天完成了系列汇编指令的学习,有的指令也深入进行了验证,输出了系列文章,收获颇多。 接下来我将开启一个专栏,用于记录学习OllyDbg的使用。 OllyDbg使用…...

C++ I/O 流通俗指南

1. std::ostream 是什么? 定义:std::ostream 是 C 标准库中的输出流类,负责将数据输出到各种目标(如屏幕、文件、网络等)。你可以把 std::ostream 想象成一根“数据水管”: 数据从 C 代码流进 std::ostrea…...

基于python的电影数据分析及可视化系统

一、项目背景 随着电影行业的快速发展,电影数据日益丰富,如何有效地分析和可视化这些数据成为行业内的一个重要课题。本系统旨在利用Python编程语言,结合数据分析与可视化技术,为电影行业从业者、研究者及爱好者提供一个便捷的电…...

【NLP 面经 5】

难以承受的东西只会让我在下一次更平静的面对 —— 25.4.2 一、NER任务,CRF模型改进 命名实体识别(NER)任务中,你使用基于条件随机场(CRF)的模型,然而模型在识别嵌套实体和重叠实体时效果不佳&a…...

鸿蒙NEXT小游戏开发:猜小球

1. 引言 “猜小球”是一个经典的益智游戏,通常由一名表演者和多名参与者共同完成。表演者会将一个小球放在一个杯子下面,然后将三个杯子快速地交换位置,参与者则需要猜出最终哪个杯子下面有小球。本文将介绍如何使用HarmonyOS NEXT技术&…...

[NCTF2019]Fake XML cookbook [XXE注入]

题目源代码 function doLogin(){var username $("#username").val();var password $("#password").val();if(username "" || password ""){alert("Please enter the username and password!");return;}var data "…...

Android 防抖和节流

文章目录 Android 防抖和节流概述工具类使用源码下载 Android 防抖和节流 概述 防抖(Debounce): 防抖是指在事件被触发后,等待一段时间,如果在这段时间内没有再触发事件,才执行处理函数。如果在这段时间内…...

安徽京准:NTP时间同步服务器操作使用说明

安徽京准:NTP时间同步服务器操作使用说明 3.1 连接天线 天线连接到“ANT”口。 3.2 连接电源 将220V电源线连到AC220V座上或将电源适配器(7.5V~12V)接到DC口上。也可以同时接上,提高供电可靠性。 3.3 LAN网口 网线连接到NTP…...

【学习记录】pytorch载入模型的部分参数

需要从PointNet网络框架中提取encoder部分的参数,然后赋予自己的模型。因此,需要从一个已有的.pth文件读取部分参数,加载到自定义模型上面。做了一些尝试,记录如下。 关于模型保存与载入 torch.save(): 使用Python的pickle实用程…...

Ubuntu Wayland启动腾讯会议并实现原生屏幕共享

Intro 众所周知,长期以来,由于腾讯会议项目组的尸位素餐、极度不作为,在Wayland成为Ubuntu 24.04 LTS的默认窗口环境下,仍然选择摆烂,甚至还“贴心”地在启动脚本下增加检测Wayland退出的代码;并且即使使用…...

写Prompt的技巧和基本原则

一.基本原则 1.一定要描述清晰你需要大模型做的事情,不要模棱两可 2.告诉大模型需要它做什么,不需要做什么 改写前: 请帮我推荐一些电影 改写后: 请帮我推荐2025年新出的10部评分比较高的喜剧电影,不要问我个人喜好等其他问题&#xff…...

前端Material-UI面试题及参考答案

目录 Material-UI 的设计理念与 Material Design 规范的关系是什么? 如何通过 npm/yarn/pnpm 安装 Material-UI 的核心依赖? Material-UI 的默认主题系统如何实现全局样式管理? 如何在项目中配置自定义字体和颜色方案? 什么是 emotion 和 styled-components,它们在 Ma…...

29、web前端开发之CSS3(六)

13. 多列布局(Multi-column Layout) 多列布局(Multi-column Layout)是一种通过CSS实现的布局方式,允许将内容组织成多列,类似于报纸或杂志的排版方式。这种布局方法能够有效地利用页面空间,提升…...

Go 语言语法精讲:从 Java 开发者的视角全面掌握

《Go 语言语法精讲:从 Java 开发者的视角全面掌握》 一、引言1.1 为什么选择 Go?1.2 适合 Java 开发者的原因1.3 本文目标 二、Go 语言环境搭建2.1 安装 Go2.2 推荐 IDE2.3 第一个 Go 程序 三、Go 语言基础语法3.1 变量与常量3.1.1 声明变量3.1.2 常量定…...

MySQL 复制与主从架构(Master-Slave)

MySQL 复制与主从架构(Master-Slave) MySQL 复制与主从架构是数据库高可用和负载均衡的重要手段。通过复制数据到多个从服务器,既可以实现数据冗余备份,又能分担查询压力,提升系统整体性能与容错能力。本文将详细介绍…...

水下成像机理分析

一般情况下, 水下环境泛指浸入到人工水体 (如水库、人工湖等)或自然水体(如海洋、河流、湖 泊、含水层等)中的区域。在水下环境中所拍摄 的图像由于普遍受到光照、波长、水中悬浮颗粒物 等因素的影响,导致生成的水下图像出现模糊、退 化、偏色等现象,图像…...

腾讯云智测试开发面经

1、投递时间线 2.20投递简历,3.11第一轮面试,3.30第二轮面试,4.4第三轮面试,4.10第四轮面试,4.11offer意向书 2、第一轮面试 第一轮面试技术面,面试官是导师,面试时长40多分钟 1)自我介绍 2)数组和列表的区别 3)了解哪些数据库 4)进程和线程的区别 5)了解哪…...

JVM类加载器详解

文章目录 1.类与类加载器2.类加载器加载规则3.JVM 中内置的三个重要类加载器为什么 获取到 ClassLoader 为null就是 BootstrapClassLoader 加载的呢? 4.自定义类加载器什么时候需要自定义类加载器代码示例 5.双亲委派模式类与类加载器双亲委派模型双亲委派模型的执行…...

@ComponentScan注解详解:Spring组件扫描的核心机制

ComponentScan注解详解:Spring组件扫描的核心机制 一、ComponentScan注解概述 ComponentScan是Spring框架中的一个核心注解,用于自动扫描和注册指定包及其子包下的Spring组件。它是Spring实现依赖注入和自动装配的基础机制之一。 Retention(Retention…...

rust Send Sync 以及对象安全和对象不安全

开头:菜鸟小明的疑惑 小明: “李哥,我最近学 Rust,感觉它超级严谨,啥 Send、Sync、对象安全、静态分发、动态分发的,我都搞晕了!为啥 Rust 要设计得这么复杂啊?” 小李&#xff0…...

从一到无穷大 #44:AWS Glue: Data integration + Catalog

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言Glue的历史,设计原则与挑战Serverless ETL 功能设计Glue StudioGlue …...

【Redis】如何处理缓存穿透、击穿、雪崩

Redis 缓存穿透、击穿和雪崩是高并发场景下的典型问题,以下是详细解决方案和最佳实践: 一、缓存穿透(Cache Penetration) 问题:恶意请求不存在的数据(如不存在的ID),绕过缓存直接访…...