【笔记】I/O总结王道强化视频笔记
文章目录
- 从中断控制器的角度来理解整个中断处理的过程
- 复习 处理器的中断处理机制
- **中断驱动I/O方式**
- printf——从系统调用到I/O控制方式的具体实现1
- 轮询方式下输出一个字符串(程序查询)
- 中断驱动方式下输出一个字符串
- 中断服务程序
- 中断服务程序与设备驱动程序之间的关系
- DMA方式下输出一个字符串
- scanf——中断方式下输入要给字符串的具体过程
从中断控制器的角度来理解整个中断处理的过程
深入理解中断机制——从中断控制器出发
当外设准备好时,便从CPU发出中断请求,CPU响应后,中止现行程序的执行,转入一个"中断服务程序"进行输入/出操作,实现主机和外设接口之间的数据传送,并启动外设工作。“中断服务程序”执行完后,返回原被中止的程序断点出继续执行。此时,外设和CPU并行工作。
复习 处理器的中断处理机制
关中断:将中断允许标志清零。在psw中一个标志位(中断允许标志位)
中断发生时,处理器必须做以下基本处理:
① 保护断点和程序状态: 将返回原程序的断电和程序状态保存到堆栈中或特殊寄存器中。
PC=>堆栈 或 特殊寄存器
PSWR=>堆栈 或 特殊寄存器
((PSW):程序状态字
PSWR(PSW寄存器):用于存放程序状态的寄存器。如x86的FLAGS)
② 识别中断事件
有两种不同的方式:软件识别和硬件识别(向量中断方式)
(1) 软件识别(MIPS采用):设置一个异常状态寄存器(MIPS中为Cause寄存器),用于记录异常原因。操作系统使用一个统一的异常处理程序(MIPS的入口为0x8000 0180),该程序按优先级顺序查询异常状态寄存器,识别出异常事件。
(2) 硬件识别(向量中断)(80x86采用):用专门的硬件查询电路按优先级顺序识别中断,得到一个“中断类型号”,根据此号,到中断向量表中读取对应的中断服务程序的入口地址。
PIC:可编程的硬件控制器,识别了中断事件之后,就会切换到某一个具体的中断服务程序执行。
③ 切换到具体的中断处理程序执行
中断控制器的基本结构:
- 问题一 形成中断号(向量地址)送到什么线上
送到数据线上。
数据线不仅能传送指令还能传送向量地址 - 第二个问题 何时采样
(当前指令周期结束后)每条指令执行的最后一个操作控制信号,就要求CPU去检测这个INTR是否有中断请求信号?那么CPU采样到这个INTR信号有效,就立即进入中断响应周期。 - 中断查询信号什么时候发出
在 CPU 进入中断响应周期后,CPU 会暂停当前正在执行的指令,并保存当前的执行状态(如程序计数器、寄存器等),以便在中断处理完成后能够恢复执行。*(经过了一个固定的延迟时间)*然后,CPU 会发出中断查询信号,以查询哪些中断请求是有效的且未被屏蔽的。*发出中断查询信号,这个信号的作用是触发系统中所有中断源的响应。*这个中断查询信号会发送给系统中的所有中断源,每个中断源都会根据自身的状态(是否有中断请求且未被屏蔽)来响应这个信号。如果某个中断源有有效的中断请求且未被屏蔽,它就会向判优电路发出信号。以便判优电路能够选择一个优先级最高的中断请求进行响应。
判优电路可以被看作是一个编码器,它将【多个中断请求信号】转换为一个【单一的中断向量号】,该向量号指向中断处理程序的入口地址。
CPU能不能检测到信号由中断处理优先级决定
响应顺序:A>B>C
处理顺序:C>B>A
它的完成的顺序就是先完成c,再完成b,
那么最后才完成a,它的响应的顺序是在执行a的过程当中,它先响应的b,然后后响应的c,
- 中断响应优先级:判优电路决定的
- 中断处理优先级:中断屏蔽字寄存器来决定的它。它是中断服务程序来设置的。能不能检测到中断请求信号有效。只有检测到中断请求信号又笑了才能进入到下一步。
在中断处理过程中,当系统内有ABC三个(中断源),且它们的中断响应优先级为a>b>c,中断处理优先级为c>b>a时
当前状态:CPU正在执行中断源a的中断服务程序。
中断请求:同时,中断源b和c发出中断请求。
中断检测:
CPU在执行完一条指令后,检查中断请求信号寄存器(intr)。
由于中断处理优先级c>b>a,当前执行的中断服务程序a无法屏蔽b和c的中断请求。
因此,b和c的中断请求使intr寄存器有效。
中断响应:
CPU检测到有效的中断请求信号。
CPU发出中断查询信号,以确定要响应哪个中断源。
由中断响应优先级b>c决定,判优电路选择中断源b,并形成中断源b的向量地址送到CPU。
CPU响应并处理中断源b的中断。
中断服务程序执行:
CPU执行中断源b的中断服务程序。
在中断服务程序中,b设置新的屏蔽字,并保存现场。
如果系统支持多重中断,b的中断服务程序会开启中断。
多重中断处理(如果系统支持):
在b的中断服务程序执行期间,CPU检测到中断源c的中断请求有效(因为c的处理优先级高于b,且此时未被屏蔽)。
CPU响应并处理中断源c的中断。
执行c的中断服务程序。
恢复与返回:
c的中断服务程序执行完毕后,返回到b的中断服务程序继续执行。
b的中断服务程序执行完毕后,最终返回到原来的中断源a的中断服务程序或主程序。
完成顺序:
响应顺序:在执行a的过程中,先响应b,后响应c(由中断响应优先级决定)。
完成顺序:先完成c,再完成b,最后完成a(由中断处理优先级和多重中断处理机制决定)。
中断驱动I/O方式
- 中断过程
- 中断响应(硬件实现)
- 中断处理(软件实现)
- 中断响应
中断响应是指主机发现外部中断请求,中止现行程序的执行,到调出中断服务程序这一过程。
(1)中断响应的条件- CPU处于开中断状态
- 在一条指令执行完
- 至少要有一个未被屏蔽的中断请求
问题:中断响应的时间点和异常处理的时间点是否相同,为什么?
中断一定是在一条指令执行结束后开始宣询有无中断请求,有的话立即响应,所以一定是在指令执行完时响应中断,而“异常”发生在指令执行过程中,所以不能等到指令执行完才进行异常处理,(缺页异常、非法操作码)
中断响应过程:
当CPU决定响应中断时,会执行一系列操作,包括关中断(以防止新的中断干扰当前中断处理)、保存断点(即保存下一条将要执行的指令的地址)和程序状态(如寄存器内容),然后识别中断源并跳转到相应的中断服务程序。
典型的中断处理(三阶段):
- 先行段(准备阶段)
- 保护现场及旧屏蔽字(通用寄存器当中的内容,中断返回需要恢复旧的屏蔽字)
- 查明原因(软件识别中断时)
- 设置新屏蔽字
- 开中断(多重中断需要)
- 本体段(具体的中断处理程序)
- 结束段(恢复阶段)
- 关中断
- 恢复现场及旧屏蔽字
- 清“中断请求”
- 开中断
- 中断返回
异常处理过程:
不同的中断源会调用不同的中断服务程序进行处理。
不同的异常类型也会触发不同的异常处理程序进行响应。
多重本断和中断处理优先权的动态分配
- 多重中断的概念
在一个中断处理(即执行中断服务程序)过程中,若又有新的中断请求发生,而新中断优先级高于正在执行的中断,则应立即中止正在执行的中断服务程序,转取处理新的中断。这种情况为多重中断,也称中断嵌套。
中断优先级的概念:
中断响应优先级----由查询程序或硬联排队线路决定的优先权,反映多个中断同时请求时选择哪个响应。
中断处理优先级----由各自的中断屏蔽字来动态设定,反映本中断与其它中断间的关系。
当我们正在执行用户程序时,假设中断源2和4同时发出中断请求。由于此时系统没有执行其他中断服务程序,因此这两个中断源都没有被屏蔽,它们会同时被送往硬件排队器进行排队。
在决定先响应哪个中断请求时,我们需要依据中断响应优先级。由于中断源2的优先级高于中断源4,因此CPU会首先响应中断源2的中断请求。在执行中断源2的中断服务程序过程中,我们需要先保存现场、旧的屏蔽字,并设置新的屏蔽字。
在具体的中断处理前,我们需要先开启中断。但需要注意的是,一旦开启中断,CPU会立即检测到当前系统中的其他中断请求,即中断源4的请求。由于中断源4的优先级仍然高于当前正在处理的中断源2(但低于已经决定先响应的2,这里指的是在开启中断后的即时检测),且此时没有其他更高优先级的中断请求,因此CPU会立即转到中断源4的中断服务程序去执行。等待中断源4执行完毕后,CPU会返回到中断源2的中断服务程序环境中,继续执行其剩余部分。
接下来,当中断源2的执行过程中,中断源1、3和5同时发出中断请求。根据中断处理优先级(1>5>2>3),中断源2能够屏蔽掉中断源3的请求,但无法屏蔽中断源1和5的请求。因此,这两个请求会被送往硬件排队器进行排队。
由中断响应优先级决定,CPU会先执行中断源1的中断服务程序。由于中断源1的优先级最高,因此它不会被中断源5打断。等待中断源1执行完毕后,CPU会返回到中断源2的中断服务程序环境中。一旦返回到此环境,由于中断源5的优先级高于中断源2(但此时是在中断源2恢复执行后的检测),CPU会立即响应中断源5的中断请求,并执行其中断服务程序。
等待中断源5执行完毕后,CPU再次返回到中断源2的中断服务程序环境中。此时,所有中断源1、4、5的中断服务程序都已执行完毕。系统中只剩下中断源3发出的中断请求。**由于中断源2的优先级高于中断源3,因此中断源3的请求被中断源2屏蔽。**等待中断源2执行完毕后,CPU会先返回到用户程序环境中。
在用户程序环境下,CPU才能够检测到中断源3发出的中断请求,并立即响应它,执行中断源3的中断服务程序。等待中断源3执行完毕后,CPU最终返回到用户程序继续执行。
- 在开启中断后,CPU会立即检测到当前系统中的其他中断请求。
- 中断屏蔽是指CPU在处理某个中断时,能够屏蔽掉其他低优先级的中断请求。
- 在处理完所有中断请求后,CPU需要返回到用户程序继续执行。需要理解这一步骤的必要性和作用。
printf——从系统调用到I/O控制方式的具体实现1
printf(“Hello World”);
用户层I/O软件
- 库函数
- 系统调用命令
- 假脱机(Spooling)系统
第一阶段的工作:由库函数完成
// printf在函数库中展开后的代码
char buf[20];
//申请一个字符数组
将字符串“Hello World”填入buf中;
write(1,buf,8);
//实际的系统调用命令
执行系统调用的操作:
- 传递系统调用参数
- 执行陷入指令
- 执行相应的服务程序
- 返回用户态
中断隐指令完成:保存断点和程序状态字、将CPU模式改为内核态
操作系统完成:保存通用寄存器的内容和执行系统调用服务例程
字符串输出最终是由内核中的sys_write系统调用例程实现
sys_write可用三种I/O方式实现:程序查询、中断和DMA
轮询方式下输出一个字符串(程序查询)
- I/O设备(包括设备控制器)将自己的状态放到状态寄存器中
- 显示器忙、未就绪等都是状态
- OS阶段性地查询状态寄存器中的特定状态,以决定下一步动作
- 如:未“就绪”时,则一直“等待”
- 例如:sys write进行字符串打印的程序段大致过程如下
copy_string_to kernel(strbuf,kernelbuf,n);/ 将字符串复制到内核缓冲区,系统调用write位于内核态,需要把用户缓冲区的内容复制到内核空间。
内存共享
for (i=0; i < n; i++){ // 对于每个打印字符循环执行
while ( printer status != READY);//等待直到显示器状态为“就绪”*printer_data port=kernelbuf[i];//向数据端口输出一个字符
*printer_control_port=START;// 发送“启动输出”命令
return_to_user();//返回用户态
如何判断就绪?如何"等待"?
读取状态寄存器,判断特定位(1-就绪;0-未就绪)是否为1
等待:读状态、判断是否为1?不是,则继续读状态、判断……
I/O接口(I/O控制器)的结构
通过I/O控制寄存器发送命令字来向设备发送命令
通过从状态寄存器读取状态字来获取外设或I/O控制器的状态信息
通过I/O控制器发送或读取数据来和外设进行数据交换
将I/O控制器中CPU能够访问的各类寄存器称为I/O端口
对外设的访问通过向I/O端口发命令、读状态、读/写数据来进行。
就绪的含义:
显示器控制器的数据缓冲中内容已经被取走,现为“空",可接受新的打印字符。由显示器控制器自动设置。
特点:
- 简单易控制、外围接口控制逻辑少
- CPU与外设串行工作,效率低、速度慢,适合于慢速设备.
- 查询开销极大(CPU完全在等待“外设完成”)
- 工作方式:完全串行或部分串行,CPU用100%的时间为I/O服务!
中断驱动方式下输出一个字符串
绿色部分是CPU和外设并行工作的时间
程序切换,响应中断是由硬件完成的,
就是执行中断隐指令。执行中断隐指令的时间又是绿色部分的这段时间。就是CPU和外设。程序切换,响应中断是由硬件完成的,
就是执行中断隐指令。
Q1:以上过程中,设备驱动程序在哪些过程中体现的?是以单独的进程的形式存在的吗?
Q2:以上过程中,设备驱动程序和中断处理程序全部在同一个进程中运行吗?
设备驱动程序一定有一部分是在发起系统调用的进程A当中执行的。而中断处理程序则不一定是在进程A中执行,取决于CPU响应中断时正在执行哪个进程。
Q3:以上过程中,如果不采用内核缓冲区,直接使用用户缓冲区会发生什么问题?
系统调用write位于内核态,需要把用户缓冲区中的内容复制到内核空间。
中断服务程序在运行的时候,是在进程B的资源平台上,进程B的页表与进程A的页表是不同的,而用户缓冲区buf进程A中的地址,它不能用进程B的页表来进行地址映射。而内核缓冲区中的数据,无论是进程A还是进程B,它们的内核地址空间中的内容都是相同的,因此能顺利的访问。
为什么有开中断?是在哪里进行关中断的?
在系统调用入内核态的时候,进行了关中断,所以此时有对应的关中断。
此程序段和轮巡方式下的sys write程序段最本质的区别在哪里
中断方式下,仅仅是把第一个字符放数据寄存器中然后就不管了,至于这个字符何时打印出来,以及剩余的字符如何打印出来就不是系统调用函数的任务了。
剩余的那些字符在哪里处理呢?
当然是在中断服务程序当中
什么时候调出中断服务程序呢?
当第一个字符输出完成之后,然后外设会向CPU发出一个中断请求,然后调出相应的中断服务程序。当显示器完成了第一个字符的输出之后,这个时候调出中断服务程序。
中断服务程序
sys_write 是如何调出来的?
系统调用
中断服务程序是如何调出来的?
外设完成任务!然后向CPU发出中断请求
总结:完成字符串输出需要两个函数:
- system_write
- 中断服务程序
过程:
-
用户进程A执行write,触发系统调用,进入内核态
-
把第一个字符“H”送到显示器的设备控制器。控制器命令显示器输出这个字符,与此同时,进程A被阻塞,调度另一个进程B执行
-
当“H”输出之后,控制器发出一个中断给CPU,并跳转到相应的中断处理程序,在中断处理程序中,进行后续的字符输出。
当“H”输出之后,控制器发出一个中断给CPU,并跳转到相应的中断处理程序,在中断处理程序进行后续的字符输出。
注意此时并没有发生进程的切换,仍然是进程B在运行,但执行的指令(中断服务程序)实际上是在做进程A的工作,是在帮助进程A完成此次I/O!
中断服务程序与设备驱动程序之间的关系
如果题目当中同时出现了中断服务程序和设备驱动程序,那么这里的中断服务程序垂解为中断总控程序!
如果题目当中只有中断服务程序,那么一般情况下,此时中断服务程序应该理解1,2,3,4,5,6整个过程。
数据传输过程:
计组里面强调是中断处理程序
而在操作系统里面,它强调的是设备驱动程序
DMA方式下输出一个字符串
DMA优先权高:
dma控制器当中的数据,如果不被及时的取出,那么就容易被后续的数据给它冲刷掉,但是CPU里面的数据,因为它是有通用寄存器的数据可以暂存在CPU里面的通用寄存器。
DMA控制器接受到“启动”命令后,控制总线进行DMA传送。通常用周期挪用法“:设备每准备好一个数据,挪用一次”存储周期“,使用一次总线事务进行数据传送,计数器减1。计数器为0时,发送DMA结束中断请求。
驱动程序:
scanf——中断方式下输入要给字符串的具体过程
中断驱动方式下输入一个字符串
基本思想:
首先是用户进程A执行,它执行了scanf函数,然后进入系统调用,然后到标准接口read函数,然后再到驱动程序foo read函数,这些都是普通的函数调用,都是在进程A的资源平台上运行的。接下来,在foo read函数中,在使用outb指令启动了这次I/O操作后,进程A就会被阻塞起来。然后进行进程切换,调度另一个进程B去运行。当B在运行时,如果I/O操作完成,就会发生一次中断,把进程B打断并跳转到中断处理程序foo interruptible去执行,然后在这里再去唤醒进程A。
通过sys_read字符输入核心程序段和中断处理程序foo_interruptible执行
这里的程序使用到了程序的PV同步互斥问题
关于I/O系统你还记得哪些?
计组里面着重讲三种I/O控制方式,操作系统里面着重讲I/0软件的处理过程,软硬件究竟是怎么协同工作的呢???
不同的I/O控制方式对应不同的设备驱动程序工作流程上到底有什么样的区别呢?
设备驱动程序和中断处理程序到底是什么呢?有什么区别呢?是什么关系呢?傻分不清楚?
什么是设备控制器?用户缓冲区?内核缓冲区?数据究竟是怎么一步一步一步的输入输出的呢?每一个过程是由什么程序来控制的呢?
系统调用在I/O里面起了什么作用呢?中断软件机制和中断硬件是怎么协同工作的呢?
关于I/O系统你是不是一团浆糊?
②①
③
键盘中断处理程序执行的时候还是处于阻塞态。CPU处于内核态。中断响应的过程中由硬件进行转换来完成。
相关文章:

【笔记】I/O总结王道强化视频笔记
文章目录 从中断控制器的角度来理解整个中断处理的过程复习 处理器的中断处理机制**中断驱动I/O方式** printf——从系统调用到I/O控制方式的具体实现1轮询方式下输出一个字符串(程序查询)中断驱动方式下输出一个字符串中断服务程序中断服务程序与设备驱动程序之间的关系 DMA方…...

XML XSLT:转换与呈现数据的力量
XML XSLT:转换与呈现数据的力量 XML(可扩展标记语言)和XSLT(XML样式表转换语言)是现代信息技术中不可或缺的工具,它们在数据交换、存储和呈现方面发挥着重要作用。本文将深入探讨XML和XSLT的概念、应用及其在信息技术领域的重要性。 XML:数据交换的标准 XML是一种用于…...

ES6总结
1.let和const以及与var区别 1.1 作用域 var: 变量提升(Hoisting):var 声明的变量会被提升到其作用域的顶部,但赋值不会提升。这意味着你可以在声明之前引用该变量(但会得到 undefined)。 con…...

晶体匹配测试介绍
一、晶体参数介绍 晶体的电气规格相对比较简单,如下: 我们逐一看看每个参数, FL就是晶体的振动频率,这个晶体是24.576MHz的。 CL就是负载电容,决定了晶体频率是否准确,包括外接的实际电容、芯片的等效电容以及PCB走线的寄生电容等,核心参数。 Frequency Tolerance是…...

超声波清洗机靠谱吗?适合学生党入手的四款眼镜清洗机品牌推荐!
有没有学生党还不知道双十一买什么?其实可以去看看超声波清洗机,说实话它的实用性真的很高,对于日常用于清洗眼镜真的非常合适,不仅可以帮助大家节约时间而且还能把眼镜清洗的干净透亮,接下来我就来为大家带来四款好用…...

Java生成图片_基于Spring AI
Spring AI 优势 过去,使用Java编写AI应用时面临的主要困境是没有统一且标准的封装库,开发者需自行对接各个AI服务提供商的接口,导致代码复杂度高、迁移成本大。如今,Spring AI Alibaba的出现极大地缓解了这一问题,它提…...

程序传入单片机的过程,以Avrdude为例分析
在市场上有各式各样的单片机,例如Arduino,51单片机,STM等。通常,我们都用其对应的IDE软件进行单片机的编程。这些软件既负责将程序代码转写成二进制代码,即机器语言,也负责将该二进制代码导入单片机。与此同…...

用YOLO和LLM增强的OCR
虽然最近我花了很多时间在大型语言模型 (LLM) 上进行实验,但我对计算机视觉的热情始终未减。因此,当我有机会将两者融合在一起时,我迫不及待地想要立即开始。在 Goodreads 上扫描书籍封面并将其标记为已读一直感觉有点神奇,我很兴…...

开源的云平台有哪些?
开源云平台为用户提供了构建、管理和运行云基础设施及应用的能力,同时允许社区参与开发和改进。以下是一些知名的开源云平台: 1. OpenStack 简介:OpenStack:一个广泛使用的开源云平台,它由多个组件组成,提…...

Spring Boot学习资源库:微服务架构的加速器
3 系统分析 3.1可行性分析 在进行可行性分析时,我们通常根据软件工程里方法,通过四个方面来进行分析,分别是技术、经济、操作和法律可行性。因此,在基于对目标系统的基本调查和研究后,对提出的基本方案进行可行性分析。…...

Pi4+wfb-ng+8812au
sudo apt update将如下文件拷入树莓派4 linux-6f921e98008589258f97243fb6658d09750f0a2f.tar.gz libsodium.zip rtl8812au.zip wfb-ng_Pi4_2.zip 安装libsodium unzip libsodium.zip cd libsodium ./configure make && make check sudo make install#安装8812AU驱动 …...

基于单片机的非接触智能测温系统设计
本设计主要由单片机STC8A8K64S4A12、OLED显示屏、非接触式测温模块MLX9061、无线通讯模块ESP8266以及声光报警模块等构成。系统通过非接触式测温模块MLX9061测量当前人员温度,温度通过OLED显示屏进行实时显示,当被测温度高于阈值,声光报警模块…...

第二十三篇:网络拥塞了,TCP/IP如何解决的?
一.显示拥塞通知 当发生网络拥塞时,发送主机应该减少数据包的发送量。作为IP上层协议,TCP虽然也能控制网络拥塞,不过它是通过数据包的实际损坏情况来判断是否发生拥塞。然而这种方法不能在数据包损坏之前减少数据包的发送量。 为了解决这个…...

登录注册静态网页实现(HTML,CSS)
实现效果图 实现效果 使用HTML编写页面结构,CSS美化界面,点击注册,跳转到注册界面,均为静态网页,是课上的一个小作业~ 使用正则表达式对输入进行验证,包括邮箱格式验证,用户名格式验证。 正则…...

基于FPGA的以太网设计(二)
一.以太网硬件架构概述 前文讲述了以太网的一些相关知识,本文将详细讲解以太网的硬件架构 以太网的电路架构一般由MAC、PHY、变压器、RJ45和传输介质组成,示意图如下所示: PHY:Physical Layer,即物理层。物理层定义了…...

OJ在线评测系统 后端微服务架构 注册中心 Nacos入门到启动
注册中心 服务架构中的注册中心是一个关键组件,用于管理和协助微服务之间的通信。注册中心的主要职责是服务的注册和发现,确保各个微服务能够相互找到并进行调用。 主要功能: 服务注册:微服务在启动时,将自身信息&am…...

升级到Ubuntu 24.04遇到的问题
升级过程中被别人关机重启到windows了,再启动到linux接着升级,还好能运行。但出现了些问题。 1.网络无法访问,发现是dns问题。最后在/etc/systemd/resov.conf文件中添加nameserver sudo nano /etc/systemd/resolv.conf cd /etc sudo ln -s …...

提示词格式化
利用jinja2,对提示词进行格式输出。以下是qwen2中tokenizer_config.json文件中的chat_template模块定义的提示词转换方式。 (1)查看qwen2的chat_template {"add_prefix_space": false,"added_tokens_decoder": {"…...

JAVA八股文1
1.Java 基础 1.1 语法基础 封装 利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内…...

yum仓库安装rabbitmq
yum仓库安装rabbitmq 1、配置yum仓库 vim /etc/yum.repos.d/rabbitmq.repo # In /etc/yum.repos.d/rabbitmq.repo## ## Zero dependency Erlang ##[rabbitmq_erlang] namerabbitmq_erlang baseurlhttps://packagecloud.io/rabbitmq/erlang/el/7/$basearch repo_gpgcheck1 gpg…...

go语言中的函数详解
1. 引言 函数是编程中不可或缺的组成部分,无论是在Go语言还是其他编程语言中,函数都扮演着重要的角色。函数能够将一系列的操作封装在一起,使得代码更加模块化、可重用和易于维护。 在本文中,我们将详细介绍Go语言中函数的概念和…...

ubuntu18.04运行OpenPCDet出现的问题
一、概述 在编译成功OpenPCDet的源代码之后,发现在运行demo时候,依旧出现了很多问题,在此对出现的问题进行总结记录。 二、问题分析 (一)ModuleNotFoundError:No module named av2 如图所示 这个问题比较简单&#x…...

【C++】——继承(下)
【C】——继承(下) 5 继承与友元6 继承与静态成员7 多继承7.1 继承模型7.2 菱形继承的问题7.3 虚继承7.4 多继承中的指针偏移问题 8 组合与继承 5 继承与友元 友元关系不能被继承。即一个函数是父类的友元函数,但不是子类的友元函数。也就是说…...

Pandas处理时间序列之光谱分析与聚类
import matplotlib.pylab as plt %matplotlib inline import numpy as np from numpy import fft import pandas as pd 一、光谱分析 • 将时间序列分解为许多正弦或余弦函数的总和 • 这些函数的系数应该具有不相关的值 • 对正弦函数进行回归 光谱分析应用场景 基于光谱的…...

【WebGIS】Cesium:GeoJSON加载
GeoJSON 是一种常用的地理空间数据格式,它用于表示简单的地理要素及其属性,并且被广泛应用于 Web 地图和 GIS 系统中。在 Cesium 中,GeoJSON 文件可以很方便地加载到三维场景中展示,并且可以添加样式和事件处理。本文将为你提供详…...

PageHelper实现分页查询
前端发送的请求参数 后端返回的对象类型 Controller类实现 /*** 员工分页查询* param employeePageQueryDTO* return*/GetMapping("/page")ApiOperation("员工分页查询")public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO)…...

边缘检测评估方法:FOM、RMSE、PSNR和SSIM对比实验和理论研究
图像分割与边缘检测是密切相关的计算机视觉任务。以下图1展示了一个海岸线分割模型的输出示例: 图1: 分割掩码到边缘图的转换过程(数据集:LICS) 模型将每个像素分类为陆地或海洋(分割掩码)。随后,海岸线被定义为分类发生变化的像素位置(边缘图)。边缘检测可以通过提取图像分割…...

MySql 多表查询
多表查询:指从多张表中查询数据。 笛卡儿积:笛卡儿积是指在数学中,两个集合(A集合 和 B集合)的所有组合情况。 连接查询 内连接:相当于查询A、B交集部分数据外连接 左外连接:查询左表所有数据…...

数学建模算法与应用 第11章 偏最小二乘回归及其方法
目录 11.1 偏最小二乘回归概述 11.2 Matlab 偏最小二乘回归命令 Matlab代码示例:偏最小二乘回归 11.3 案例分析:化学反应中的偏最小二乘回归 Matlab代码示例:光谱数据的PLS回归 习题 11 总结 偏最小二乘回归(Partial Least …...

【MATLAB代码】TDOA定位,4个基站、3个时间差、三维定位(可直接复制粘贴到MATLAB上运行)
文章目录 程序结构源代码运行结果代码结构输入输出解析该MATLAB代码实现了基于时间差定位(TDOA, Time Difference of Arrival)的方法,使用最小二乘法在三维空间中估计一个未知点的位置。该算法利用一个主锚点和三个副锚点的已知位置,通过计算信号传播时间差来推算出目标位置…...