LV.12 D18 中断处理 学习笔记
一、ARM的异常处理机制及工程代码结构
1.1异常概念
处理器在正常执行程序的过程中可能会遇到一些不正常的事件发生 这时处理器就要将当前的程序暂停下来转而去处理这个异常的事件 异常事件处理完成之后再返回到被异常打断的点继续执行程序。
1.2异常处理机制
不同的处理器对异常的处理的流程大体相似,但是不同的处理器在具体实现的机制上有所不同;比如处理器遇到哪些事件认为是异常事件遇到异常事件之后处理器有哪些动作、处理器如何跳转到异常处理程序如何处理异常、处理完异常之后又如何返回到被打断的程序继续执行等我们将这些细节的实现称为处理器的异常处理机制.
1.3ARM异常源
概念:导致异常产生的事件称为异常源
ARM异常源
FIQ 快速中断请求引脚有效
IRQ 外部中断请求引脚有效
Reset 复位电平有效
Software Interrupt 执行swi指令
Data Abort 数据终止
Prefetch Abort 指令预取终止
Undefined Instruction 遇到不能处理的指令
1.4异常模式
在ARM的基本工作模式中有5个属于异常模式,即ARM遇到异常后会切 换成对应的异常模式
1.5ARM异常响应
ARM产生异常后的动作(自动完成)
1.拷贝CPSR中的内容到对应异常模式下的SPSR_<mode>
2.修改CPSR的值
2.1.修改中断禁止位禁止相应的中断
2.2.修改模式位进入相应的异常模式
2.3.修改状态位进入ARM状态
3.保存返回地址到对应异常模式下的LR_<mode>
4.设置PC为相应的异常向量(异常向量表对应的地址)
1.6异常向量表
异常向量表
> 异常向量表的本质是内存中的一段代码
> 表中为每个异常源分配了四个字节的存储空间
> 遇到异常后处理器自动将PC修改为对应的地址
> 因为异常向量表空间有限一般我们不会再这里写异常处理程序,而是在对应的位置写一条跳
转指令使其跳转到指定的异常处理程序的入口
注:ARM的异常向量表的基地址默认在0x00地址但可以通过配置协处理器来修改其地址
1.7异常返回
ARM异常返回的动作(自己编写)
1.将SPSR_<mode>的值复制给CPSR使处理器恢复之前的状态
2.将LR_<mode>的值复制给PC使程序跳转回被打断的地址继续执行
1.8 IRQ异常举例
注:整个过程CPSR保存的永远是当前程序运行状态,SPSR只是异常时对原来的CPSR进行备份
二、工程模板代码结构分析
common:老师写好的库函数文件,里面实现了很多功能,比如把所有的寄存器封装,比如手搓了一个printf。
interface.c: 我们自己要实现的c源文件
start: 启动文件,任何芯片一上电执行的第一个程序一定是汇编程序,要初始化栈,初始化芯片,将异常向量表基地址位置改变,打开FIQ、IRQ然后跳转到C程序。
makefile: 编译规则
map.lds: 链接脚本,这个工程模板内有很多的C文件S文件H文件,他们编译链接后只生成一个.bin文件写入开发板,哪个文件放入哪个位置,我们写好的文件在内存中的位置都由它决定
三、中断处理框架搭建
LR保存的是被打断的下一条指令的地址(指的是汇编指令,一条c语言可能会编译成很多条汇编指令)
在遇到IRQ时会跳转到以_start:为基地址偏移0x18。
然后我们在 b main 后面来写这个中断服务程序,因为b main之前的代码都是启动代码,一开始就会执行。而 irq_handler是异常处理程序,芯片刚启动时我们不希望它执行,我们希望它遇到异常的时候再执行。
但是我们不能直接在这里写,因为IRQ模式下有很多寄存器都是和USER模式共用的如果在这里写,可定会用到一些寄存器,这样就会覆盖掉寄存器中本来的内容,返回主程序就不能正确返回这个状态了
所以我们需要先压栈保护现场
这个是时候就可以写了吗,还是不能,我们来复习一下LR寄存器
R14(LR,Link Register)
链接寄存器,一般有以下两种用途:
> 执行跳转指令(BL/BLX)时,LR会自动保存跳转指令下一条指令的地址程序需要返回时将LR的值复制到PC即可实现。
> 产生异常时,对应异常模式下的LR会自动保存被异常打断的指令的下一条指令的地址,异常处理结束后将LR的值复制到PC可实现程序返回。
原理
当执行跳转指令或产生异常时,LR寄存器中不会凭空产生一个返回地址。其原理是当执行跳转指令或产生异常时,处理器内部会将PC寄存器中的值拷贝到LR寄存器中,然后再将LR寄存器中的值自减4。
BL
当执行BL指令时,指令执行过程中处理器内部就会将PC寄存器的值拷贝到LR寄存器,然后再将LR寄存器中的值自减4, 所以LR寄存器中保存的就是BL指令下一条指令的地址。
该时刻PC=N+8 LR=N+4
IRQ中断
当执行一条指令时产生了一个IRQ中断,执行这条指令过程中处理器不会保存返回地址,而是执行完成后才会保存,但执行完成后PC的值又会自动增4,所以对于IRQ来说LR中保存的是被中断打断的指令的下下条指令的地址。
该时刻PC=N+12 LR=N+8
因为产生IRQ异常后自动保存到LR寄存器中的返回地址是被IRQ打断的指令下一条在下一条指令,所以需要我们人为的修复一下。
那么为什么不直接让他返回一个正确的呢,因为ARM是精简指令集,要想直接返回正确的必须要再加一个电路,这样会增加硬件成本,所以不如软件修复一条指令就解决了。
由于这是一个非叶子函数,在这段程序中可能还会有跳转,所以我们干脆把LR也压栈保护一下。
异常处理程序既可以用汇编写,也可以通过混合编程用C语言写,但前面修改LR和压栈两条指令,只能用汇编写。
四、中断处理程序编程
interface.c
#include "exynos_4412.h"//异常处理程序
void do_irq(void)
{printf("Key2 pressed\n");
}void Delay(unsigned int Time)
{while(Time--);
}int main()
{/*外设层次 —— 让外部的硬件控制器产生一个中断信号并发送给中断控制器*//*将GPX1_1设置成中断功能*/GPX1.CON = GPX1.CON | (0xF << 4);/*设置GPX1_1中断触发方式:下降沿触发*/EXT_INT41_CON = EXT_INT41_CON & (~(0x7 << 4)) | (0x2 << 4);/*使能GPX1_1的中断功能*/EXT_INT41_MASK = EXT_INT41_MASK & (~(1 << 1)); /*中断控制器层次 —— 让中断控制器接收外设发来的中断信号并对其进行管理然后再转发给一个合适的CPU去处理*//*全局使能中断控制器,使其能够接收外部设备产生的中断信号并转发给CPU接口*/ICDDCR = ICDDCR | 1;/*在中断控制器中使能57号中断,使中断控制器在接收到57号中断后,能将其进一步转发到CPU接口*/ICDISER.ICDISER1 = ICDISER.ICDISER1 | (1 << 25);/*选择CPU0来处理57号中断*/ICDIPTR.ICDIPTR14 = ICDIPTR.ICDIPTR14 & (~(0xFF << 8)) | (0x1 << 8);/*将中断控制器和CPU0之间的接口使能,使得中断控制器转发的信号能够到达CPU0*/CPU0.ICCICR = CPU0.ICCICR | 1;GPX2.CON = GPX2.CON & (~(0xF << 28)) | (0x1 << 28);while(1){/*点亮LED2*/GPX2.DAT = GPX2.DAT | (1 << 7);/*延时*/Delay(1000000);/*熄灭LED2*/GPX2.DAT = GPX2.DAT & (~(1 << 7));/*延时*/Delay(1000000);}return 0;
}
start.S
.text
.global _start
_start:/** Vector table*/ b resetb .b .b .b .b .//从异常向量表再跳转到IRQ的异常处理程序b irq_handlerb .reset:/** Set vector address in CP15 VBAR register*/ ldr r0, =_startmcr p15, 0, r0, c12, c0, 0 @Set VBAR/** Set the cpu to SVC32 mode, Disable FIQ/IRQ*/ mrs r0, cpsrbic r0, r0, #0x1forr r0, r0, #0xd3msr cpsr ,r0/** Defines access permissions for each coprocessor*/ mov r0, #0xfffffffmcr p15, 0, r0, c1, c0, 2 /** Invalidate L1 I/D */mov r0, #0 @Set up for MCRmcr p15, 0, r0, c8, c7, 0 @Invalidate TLBsmcr p15, 0, r0, c7, c5, 0 @Invalidate icache/** Set the FPEXC EN bit to enable the FPU*/ mov r3, #0x40000000fmxr FPEXC, r3/** Disable MMU stuff and caches*/mrc p15, 0, r0, c1, c0, 0bic r0, r0, #0x00002000 @Clear bits 13 (--V-)bic r0, r0, #0x00000007 @Clear bits 2:0 (-CAM)orr r0, r0, #0x00001000 @Set bit 12 (---I) Icacheorr r0, r0, #0x00000002 @Set bit 1 (--A-) Alignorr r0, r0, #0x00000800 @Set bit 11 (Z---) BTBmcr p15, 0, r0, c1, c0, 0/** Initialize stacks */
init_stack: /*svc mode stack*/msr cpsr, #0xd3ldr sp, _stack_svc_end/*undef mode stack*/msr cpsr, #0xdbldr sp, _stack_und_end/*abort mode stack*/ msr cpsr,#0xd7ldr sp,_stack_abt_end/*irq mode stack*/ msr cpsr,#0xd2ldr sp, _stack_irq_end/*fiq mode stack*/msr cpsr,#0xd1ldr sp, _stack_fiq_end/*user mode stack, enable FIQ/IRQ*/msr cpsr,#0x10ldr sp, _stack_usr_end/*Call main*/b main//IRQ的异常处理程序
irq_handler://因为产生IRQ异常后自动保存到LR中的返回地址是被IRQ打断指令的//下一条再下一条指令的地址,所以我们需要人为的去修复一下sub lr, lr, #4//因为IRQ模式下使用的R0-R12寄存器和USER模式下使用的是同一组//所以在处理异常之前需要先将之前USER模式下寄存器的值压栈保护stmfd sp!,{r0-r12}//处理异常bl do_irq//异常返回//1.将R0-R12寄存器中的值出栈,使其恢复到被异常打断之前的值//2.将SPSR寄存器中的值恢复到CPSR,使CPU的状态恢复到被异常打断之前的状态//3.将栈中LR寄存器中的值出栈给PC,实现程序的返回ldmfd sp!,{r0-r12,pc}^_stack_svc_end: .word stack_svc + 512
_stack_und_end: .word stack_und + 512
_stack_abt_end: .word stack_abt + 512
_stack_irq_end: .word stack_irq + 512
_stack_fiq_end:.word stack_fiq + 512
_stack_usr_end: .word stack_usr + 512.data
stack_svc: .space 512
stack_und:.space 512
stack_abt: .space 512
stack_irq: .space 512
stack_fiq: .space 512
stack_usr: .space 512
只按了一次按键,就会一直打印Key2 pressed。
中断挂起寄存器, EXT_INT41_PEND[1]对应GPX1_1引脚,会自动置1,置1就会把这个中断挂。当你处理完中断,返回到main函数,此时EXT_INT41_PEND[1]依旧是1,不会自动清零,所以还会给中断控制器发送中断信号,中断控制器还会将中断信号转发给CPU,还会触发中断。所以我们需要在CPU处理完中断后,把挂起位清零。
中断挂起寄存器比较特殊,写1才会清零,写0则保持不变。
我们在异常处理程序中对中断挂起寄存器的第一位进行修改,则按一次按键,只会产生一次中断。
但是有个新问题所有的IRQ异常都会跳到这里,那么我们需要区分一下,但是CPU不知道是谁发来的,所以需要询问中断控制器。
ICCIAR寄存器,后面[31:10]位与本次实验无关,我们只看[9:0]位,中断控制器把几号中断转给CPU,就会往这个寄存器的[9:0]位写几。所以我们可以让CPU在处理中断之前先读取这个寄存器的值,来写不同的中断处理程序。
#include "exynos_4412.h"//异常处理程序
void do_irq(void)
{unsigned int IrqNum = 0;/*从中断控制器中获取当前中断的中断号*/IrqNum = CPU0.ICCIAR & 0x3FF;switch(IrqNum){case 0://0号中断的处理程序break;case 1://1号中断的处理程序break;/** ......*/case 57:printf("Key2 pressed\n");/*清除GPIO控制器中的中断挂起位*/EXT_INT41_PEND = (1 << 1);break;/** ......*/case 159://159号中断的处理程序break;default:break;}}void Delay(unsigned int Time)
{while(Time--);
}int main()
{/*外设层次 —— 让外部的硬件控制器产生一个中断信号并发送给中断控制器*//*将GPX1_1设置成中断功能*/GPX1.CON = GPX1.CON | (0xF << 4);/*设置GPX1_1中断触发方式:下降沿触发*/EXT_INT41_CON = EXT_INT41_CON & (~(0x7 << 4)) | (0x2 << 4);/*使能GPX1_1的中断功能*/EXT_INT41_MASK = EXT_INT41_MASK & (~(1 << 1)); /*中断控制器层次 —— 让中断控制器接收外设发来的中断信号并对其进行管理然后再转发给一个合适的CPU去处理*//*全局使能中断控制器,使其能够接收外部设备产生的中断信号并转发给CPU接口*/ICDDCR = ICDDCR | 1;/*在中断控制器中使能57号中断,使中断控制器在接收到57号中断后,能将其进一步转发到CPU接口*/ICDISER.ICDISER1 = ICDISER.ICDISER1 | (1 << 25);/*选择CPU0来处理57号中断*/ICDIPTR.ICDIPTR14 = ICDIPTR.ICDIPTR14 & (~(0xFF << 8)) | (0x1 << 8);/*将中断控制器和CPU0之间的接口使能,使得中断控制器转发的信号能够到达CPU0*/CPU0.ICCICR = CPU0.ICCICR | 1;GPX2.CON = GPX2.CON & (~(0xF << 28)) | (0x1 << 28);while(1){/*点亮LED2*/GPX2.DAT = GPX2.DAT | (1 << 7);/*延时*/Delay(1000000);/*熄灭LED2*/GPX2.DAT = GPX2.DAT & (~(1 << 7));/*延时*/Delay(1000000);}return 0;
}
此时,我们又发现按键只有第一次有效,之后再按按键就没有反应。
因为中断控制器不知道CPU0已经处理完中断处理程序了,所以并没有将新的中断信号发送给CPU0。
ICCEOIR寄存器,本次实验只看[9:0]位,CPU处理完中断后,会把中断号写入该寄存器。
将当前中断的中断号写回到中断控制器,以这种方式来告知中断控制器当前的中断已经处理完成,可以发送其他中断
#include "exynos_4412.h"//异常处理程序
void do_irq(void)
{unsigned int IrqNum = 0;/*从中断控制器中获取当前中断的中断号*/IrqNum = CPU0.ICCIAR & 0x3FF;switch(IrqNum){case 0://0号中断的处理程序break;case 1://1号中断的处理程序break;/** ......*/case 57:printf("Key2 pressed\n");/*清除GPIO控制器中的中断挂起位*/EXT_INT41_PEND = (1 << 1);/*将当前中断的中断号写回到中断控制器,以这种方式来告知中断控制器当前的中断已经处理完成,可以发送其他中断*/CPU0.ICCEOIR = CPU0.ICCEOIR & (~(0x3FF)) | 57;break;/** ......*/case 159://159号中断的处理程序break;default:break;}}void Delay(unsigned int Time)
{while(Time--);
}int main()
{/*外设层次 —— 让外部的硬件控制器产生一个中断信号并发送给中断控制器*//*将GPX1_1设置成中断功能*/GPX1.CON = GPX1.CON | (0xF << 4);/*设置GPX1_1中断触发方式:下降沿触发*/EXT_INT41_CON = EXT_INT41_CON & (~(0x7 << 4)) | (0x2 << 4);/*使能GPX1_1的中断功能*/EXT_INT41_MASK = EXT_INT41_MASK & (~(1 << 1)); /*中断控制器层次 —— 让中断控制器接收外设发来的中断信号并对其进行管理然后再转发给一个合适的CPU去处理*//*全局使能中断控制器,使其能够接收外部设备产生的中断信号并转发给CPU接口*/ICDDCR = ICDDCR | 1;/*在中断控制器中使能57号中断,使中断控制器在接收到57号中断后,能将其进一步转发到CPU接口*/ICDISER.ICDISER1 = ICDISER.ICDISER1 | (1 << 25);/*选择CPU0来处理57号中断*/ICDIPTR.ICDIPTR14 = ICDIPTR.ICDIPTR14 & (~(0xFF << 8)) | (0x1 << 8);/*将中断控制器和CPU0之间的接口使能,使得中断控制器转发的信号能够到达CPU0*/CPU0.ICCICR = CPU0.ICCICR | 1;GPX2.CON = GPX2.CON & (~(0xF << 28)) | (0x1 << 28);while(1){/*点亮LED2*/GPX2.DAT = GPX2.DAT | (1 << 7);/*延时*/Delay(1000000);/*熄灭LED2*/GPX2.DAT = GPX2.DAT & (~(1 << 7));/*延时*/Delay(1000000);}return 0;
}
这次代码我们需要实现按一次按键就产生一次中断,但个人原因,没有实现,也没找出问题,后续再解决。
五、中断编程补充
中断和轮询:轮询是CPU主动去查看硬件有没有异常产生,而中断是硬件主动通知CPU。中断的效率更高一些,用的较多。
真正开发时有操作系统,我们其实只需要写中断程序,然后打开对应中断就可以
FIQ为什么比IRQ快:
1)FIQ的优先级比IRQ高
2)FIQ可以打断IRQ
3)FIQ在异常向量表的最末,别的中断处理程序需要跳转,而FIQ可以直接往后写
4)FIQ有四组直接独有的寄存器,如果只需要r8-r12的话,他不需要压栈保护现场。但是如果用到了r0-r7还是要压栈保护现场的。
作业
1.使用中断的方式检测Key3按键的状态,实现按一次按键,LED2点亮,再次按下,LED2熄灭
EINT[10]的中断号是58。
本次实验依旧采用下降沿触发方式,GPX1_2对应EXT_INT41_CON[2]。
EXT_INT41_MASK[1]对应GPX1_1的开和关。0x0打开中断,0x1关闭中断。我们把它打开。
我们把ICDDCR寄存器写1 ,监控所有的外部中断,并将挂起的中断转发到CPU的接口
ICCDCR寄存器相当于GIC(中断控制器)的总开关。
ICDISER_CPU寄存器的作用:寄存器接收到中断信号,通过配置该寄存器对应的位,控制该中断信号发送或不发送给CPU。
下面这个寄存器是ICDIPTR_CPU,它的作用是为每一个中断选择处理他的CPU。
哪一位置1,中断信号就发给哪个CPU处理。但4412是一个四核的CPU,所以高四位是没有用的。
一共需要40个寄存器来管理这160个中断归属于哪一个CPU处理
想把58号中断交给CPU0处理,则把偏移地址为0x838的寄存器的[23:16]写为00000001即可。
ICCICR_CPUn寄存器是中断控制器和CPU之间的接口,他就像一个开关,用哪个CPU就要打开哪个。
EXT_INT41_PEND[2]对应GPX1_2引脚,会自动置1,置1就会把这个中断挂。当你处理完中断,返回到main函数,此时EXT_INT41_PEND[2]依旧是1,不会自动清零,所以还会给中断控制器发送中断信号,中断控制器还会将中断信号转发给CPU,还会触发中断。所以我们需要在CPU处理完中断后,把挂起位清零。
中断挂起寄存器比较特殊,写1才会清零,写0则保持不变。
ICCIAR寄存器,后面[31:10]位与本次实验无关,我们只看[9:0]位,中断控制器把几号中断转给CPU,就会往这个寄存器的[9:0]位写几。所以我们可以让CPU在处理中断之前先读取这个寄存器的值,来写不同的中断处理程序。
ICCEOIR寄存器,本次实验只看[9:0]位,CPU处理完中断后,会把中断号写入该寄存器。
将当前中断的中断号写回到中断控制器,以这种方式来告知中断控制器当前的中断已经处理完成,可以发送其他中断
#include "exynos_4412.h"unsigned int flag = 1;//异常处理程序
void do_irq(void)
{unsigned int IrqNum;/*从中断控制器中获取当前中断的中断号*/IrqNum = CPU0.ICCIAR & 0x3FF;switch(IrqNum){case 0://0号中断的处理程序break;case 1://1号中断的处理程序break;/** ......*/case 58:printf("Key3 pressed\n");if(flag == 1){GPX2.DAT = GPX2.DAT | (1 << 7);flag = 0;}else{GPX2.DAT = GPX2.DAT & (~(1 << 7));flag = 1;}/*清除GPIO控制器中的中断挂起位*/EXT_INT41_PEND = (1 << 2);/*将当前中断的中断号写回到中断控制器,以这种方式来告知中断控制器当前的中断已经处理完成,可以发送其他中断*/CPU0.ICCEOIR = CPU0.ICCEOIR & (~(0x3FF)) | 58;break;/** ......*/case 159://159号中断的处理程序break;default:break;}}void Delay(unsigned int Time)
{while(Time--);
}int main()
{/*外设层次 —— 让外部的硬件控制器产生一个中断信号并发送给中断控制器*//*将GPX1_2设置成中断功能*/GPX1.CON = GPX1.CON | (0xF << 8);/*设置GPX1_2中断触发方式:下降沿触发*/EXT_INT41_CON = EXT_INT41_CON & (~(0x7 << 8)) | (0x2 << 8);/*使能GPX1_2的中断功能*/EXT_INT41_MASK = EXT_INT41_MASK & (~(1 << 2)); /*中断控制器层次 —— 让中断控制器接收外设发来的中断信号并对其进行管理然后再转发给一个合适的CPU去处理*//*全局使能中断控制器,使其能够接收外部设备产生的中断信号并转发给CPU接口*/ICDDCR = ICDDCR | 1;/*在中断控制器中使能58号中断,使中断控制器在接收到58号中断后,能将其进一步转发到CPU接口*/ICDISER.ICDISER1 = ICDISER.ICDISER1 | (1 << 26);/*选择CPU0来处理58号中断*/ICDIPTR.ICDIPTR14 = ICDIPTR.ICDIPTR14 & (~(0xFF << 16)) | (0x1 << 16);/*将中断控制器和CPU0之间的接口使能,使得中断控制器转发的信号能够到达CPU0*/CPU0.ICCICR = CPU0.ICCICR | 1;GPX2.CON = GPX2.CON & (~(0xF << 28)) | (0x1 << 28);//LED2while(1){/*点亮LED2*/GPX2.DAT = GPX2.DAT | (1 << 7);/*延时*/Delay(1000000);/*熄灭LED2*/GPX2.DAT = GPX2.DAT & (~(1 << 7));/*延时*/Delay(1000000);}return 0;
}
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 详细讲解什么是工厂模式
当我们谈论工厂模式时,我们实际上是在讨论一种创建对象的设计模式。工厂模式的目的是封装对象的创建过程,并将其交给一个单独的工厂类来处理。这种方式有助于解耦对象的创建和使用,使得系统更加灵活、可维护。 有三种主要的工厂模式…...
2023/12/5 2:24:45 - 下厨房网站月度最佳栏目菜谱数据获取及分析
目录 概要 源数据获取 写Python代码爬取数据 Scala介绍与数据处理 1.Sacla介绍...
2023/12/4 9:00:26 - Spring中用了哪些设计模式
一.简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。 spring中的BeanFactory就是简单工厂模式的体现…...
2023/12/5 6:47:27 - React新手必懂的知识点
react思想:组件化开发 React 的核心概念是组件化开发,将用户界面拆分成独立的可复用组件。学习如何创建和使用 React 组件,以及组件之间的数据传递和通信是非常重要的。 React的思想就是拆分组件与使用组件。 import React from react;// 定…...
2023/12/4 23:15:12 - 力扣刷题篇之位运算
系列文章目录 目录 系列文章目录 前言 一、位运算的基本运算 二、位运算的技巧 三、布隆过滤器 总结 前言 本系列是个人力扣刷题汇总,本文是数与位。刷题顺序按照[力扣刷题攻略] Re:从零开始的力扣刷题生活 - 力扣(LeetCode࿰…...
2023/12/4 14:27:56 - 《LeetCode力扣练习》代码随想录——链表(链表相交---Java)
《LeetCode力扣练习》代码随想录——链表(链表相交—Java) 刷题思路来源于 代码随想录 面试题 02.07. 链表相交 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* …...
2023/12/5 2:24:43 - windows 安装 Oracle Database 19c
目录 什么是 Oracle 数据库 下载 Oracle 数据库 解压文件 运行安装程序 测试连接 什么是 Oracle 数据库 Oracle数据库是由美国Oracle Corporation(甲骨文公司)开发和提供的一种关系型数据库管理系统,它是一种强大的关系型数据库管理系统…...
2023/12/4 21:35:36 - WSL2环境下Debian 12的Docker安装与配置
WSL设置相关: wsl -l -v # 查看当前配置情况正常配置如下: NAME STATE VERSION * Debian Running 2如果与以上有差异,按如下步骤进行配置: wsl --set-version 2 wsl --set-default-version 2 wsl --s…...
2023/12/4 16:41:55 - OpenAI暂停新的ChatGPT Plus注册 | OpenAI 的 GPT Builder 创建您的 GPTs
OpenAI DevDay 才过去仅仅一周时间,伴随着开发者大会上发布的一系列重磅升级和新特性,无疑这样的进化速度让广大网友炸锅了,其火热程度可见一斑。 就在四个小时前,OpenAI的CEO Sam Altma突然宣布,ChatGPT Plus账号暂停…...
2023/12/4 21:09:01 - LeetCode:689. 三个无重叠子数组的最大和(dp C++)
目录 689. 三个无重叠子数组的最大和 题目描述: 实现代码与解析: dp 原理思路: 滑动窗口: 原理思路: 689. 三个无重叠子数组的最大和 题目描述: 给你一个整数数组 nums 和一个整数 k ,找…...
2023/12/4 22:27:28 - 系列六、Java垃圾回收器主要有哪些?
一、Java垃圾回收器主要有哪些? UseSerialGC、UseParallelGC、UseConcMarkSweepGC、UseParallelNewGC、UseParallelOldGC、UseG1GC...
2023/12/5 2:25:12 - 【ATTCK】MITRE Caldera-emu插件
CALDERA是一个由python语言编写的红蓝对抗工具(攻击模拟工具)。它是MITRE公司发起的一个研究项目,该工具的攻击流程是建立在ATT&CK攻击行为模型和知识库之上的,能够较真实地APT攻击行为模式。 通过CALDERA工具,安全…...
2023/12/4 22:14:22 - 系列四、JVM的内存结构【本地接口(Native Interface)】
一、组成 本地接口由本地方法栈(Native Method Stack)、本地方法接口(Native Interface)、本地方法库组成。 二、本地接口的作用 本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C程序,Jav…...
2023/12/5 2:25:12 - flutter TabBar指示器
第一层tabView import package:jade/configs/PathConfig.dart; import package:jade/customWidget/MyCustomIndicator.dart; importpackage:jade/homePage/promotion/promotionPost/MyPromotionListMainDesc.dart; import package:jade/homePage/promotion/promotionPost/MyPr…...
2023/12/5 2:25:11 - CnosDB有主复制演进历程
分布式存储系统的复杂性涉及数据容灾备份、一致性、高并发请求和大容量存储等问题。本文结合CnosDB在分布式环境下的演化历程,分享如何将分布式理论应用于实际生产,以及不同实现方式的优缺点和应用场景。 分布式系统架构模式 分布式存储系统下按照数据复…...
2023/12/4 21:11:02 - mac控制台命令小技巧
shigen日更文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 hello伙伴们,作为忠实的mac骨灰级别的粉丝,它真的给我带来了很多效率上的提升。那作为接…...
2023/12/5 0:05:37 - Java 设计模式——组合模式
目录 1.概述2.结构3.实现3.1.抽象构件3.2.容器构件3.3.叶子节点3.4.测试 4.分类5.使用场景6.优点 1.概述 (1)大家对于上面这个图片肯定非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可…...
2023/12/5 0:56:00 - 这个双11,阿里云经历了可能是历史级的大故障!
2023年11月12日17:44开始,阿里云发生严重故障,导致阿里巴巴大量产品无法连接,一时间,“阿里云盘崩了”、“淘宝又崩了”、“闲鱼崩了”、“钉钉崩了”等话题相继登上热搜。 此外,像纳思云充电桩、乐爽coole…...
2023/12/4 22:33:54 - Docker Golang 开发环境搭建指南
Docker Golang 开发环境搭建指南 概述 在 Golang 开发中,搭建合适的开发环境是非常重要的。然而,由于 Golang 的跨平台特性,不同操作系统之间的配置差异可能会导致环境搭建过程变得复杂。为了简化这个过程并保持开发环境的一致性࿰…...
2023/12/4 22:48:28 - AVL树和红黑树
AVL树和红黑树 一、AVL树1. 概念2. 原理AVL树节点的定义插入不违反AVL树性质违反AVL树性质左单旋右单旋左右双旋右左双旋总结 删除 3. 验证代码4. AVL树完整实现代码 二、红黑树1. 概念2. 性质3. 原理红黑树节点的定义默认约定插入情况一 (u存在且为红)情…...
2023/12/4 22:43:25
最新文章
- Flask 快速入门
引言 Flask 是一个轻量级的Web框架,以简洁和灵活而著称。它提供了构建Web应用所需的基本工具,同时保持了足够的可扩展性,使其成为初学者和有经验的开发人员的首选。本系列专栏将带领大家逐步深入学习 Flask,从最基础的概念开始&a…...
2023/12/5 7:07:49 - EM32DX-C4【C#】
1外观: J301 直流 24V 电源输入 CAN0 CAN0 总线接口 CAN1 CAN1 总线接口 J201 IO 接线段子 S301-1、S301-2 输出口初始电平拨码设置 S301-3~S301-6 模块 CAN ID 站号拨码开关 S301-7 模块波特率拨码设置 S301-8 终端电阻选择开关 2DI: 公共端是…...
2023/12/5 7:06:47 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2023/12/4 8:54:01 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2023/12/4 16:17:14 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2023/12/5 2:24:51 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2023/12/5 2:24:51 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2023/12/5 2:24:51 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2023/12/5 2:24:50 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2023/12/5 2:24:50 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2023/12/5 2:24:49 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2023/12/5 2:24:49 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2023/12/4 15:40:28 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2023/12/5 2:24:48 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2023/12/5 2:24:48 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2023/12/5 2:24:48 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2023/12/5 2:24:47 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2023/12/4 13:07:58 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2023/12/4 15:19:53 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2023/12/5 2:24:46 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2023/12/5 6:10:11 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2023/12/4 10:47:24 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2023/12/5 2:24:45 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57