硬件中断的PSW的CPL怎么变

时间: 2025-08-08 17:07:19 浏览: 6
<think>我们正在讨论硬件中断发生时程序状态字(PSW)中CPL(当前特权级)的变化。根据之前的上下文,我们知道硬件中断是外部中断,由外部设备触发。在x86架构中,当硬件中断发生时,CPU会切换到内核态(特权级0)以执行中断服务程序(ISR)。因此,CPL会从当前的特权级(可能是用户态3或内核态0)变为0。 具体过程: 1. 硬件中断触发时,CPU会检查当前是否允许中断(IF标志为1)以及中断优先级等条件。 2. 如果条件满足,CPU会保存当前的PSW(包括EFLAGS寄存器、CS、EIP等)到内核栈中。其中,CS寄存器包含当前代码段的段选择子,其中就包括CPL(当前特权级)。 3. 然后,CPU会从中断描述符表(IDT)中加载对应的中断门描述符。中断门描述符中指定了目标代码段的段选择子(新的CS)和中断处理程序的入口地址。 4. 新的CS段选择子中的特权级(DPL)为0,因此CPU会将CPL切换到0(内核态)。 5. 同时,根据中断门的设置,CPU会清除EFLAGS中的IF标志(关中断),以防止嵌套中断(除非中断处理程序手动开中断)。 因此,无论硬件中断发生在用户态(CPL=3)还是内核态(CPL=0),在进入中断服务程序后,CPL都会被设置为0(内核态)。但是,如果中断发生在内核态(CPL=0),那么中断处理完成后,返回时CPL会恢复为0;如果中断发生在用户态(CPL=3),中断处理完成后返回用户态,CPL会恢复为3。 注意:中断返回时,CPU通过IRET指令从栈中恢复原来的PSW,包括原来的CS(其中包含原来的CPL)。 引用说明: 根据引用[1]:通过中断门进入中断服务程序时,CPU会清除IF标志(关中断)。同时,中断门会将CPL切换到0(因为中断门描述符的目标代码段DPL为0,且中断门本身描述符的DPL通常为0或3,但中断处理程序必须运行在内核态)。 另外,引用[2]和[3]虽然主要讨论的是单片机中断,但关于中断优先级和嵌套的概念是类似的。在x86中,中断嵌套需要手动开启(在ISR中执行STI指令),否则在中断处理过程中不会响应新的中断。 所以,总结CPL的变化: - 中断发生时:无论之前CPL是多少,进入中断服务程序后CPL变为0(内核态)。 - 中断返回时:通过IRET指令恢复中断前的CPL。 数学表示: 设中断前的PSW为$\vec{PSW}_{old}$,其中CPL为$c_{old}$($c_{old} \in \{0,3\}$)。 中断服务程序执行时的PSW中CPL为0,即: $$ \vec{PSW}_{new} = \vec{PSW}_{old} \oplus (CPL \mapsto 0) $$ 中断返回后,恢复为$\vec{PSW}_{old}$。 注意:这里我们只关注CPL的变化,实际上PSW的其他标志位也会变化(如IF被清零等)。 下面用伪代码和文字详细描述:</think>### 硬件中断触发时PSW中CPL的变化机制 #### 核心变化原理 当硬件中断发生时,**当前特权级(CPL)会根据中断触发时的上下文自动切换为最高特权级(通常为0级)**,无论中断前处于用户态(CPL=3)还是内核态(CPL=0)。这是通过CPU自动加载中断门描述符中的目标代码段选择子实现的,该选择子强制设置CPL=0[^1]。 ```mermaid graph LR A[硬件中断触发] --> B{中断前特权级} B -->|用户态 CPL=3| C[CPL强制切换为0] B -->|内核态 CPL=0| C C --> D[执行中断服务程序] D --> E[IRET指令恢复原CPL] ``` #### 详细处理流程 1. **中断响应阶段**: - CPU自动保存当前PSW到内核栈(包含EFLAGS、CS、EIP) - 从中断描述符表(IDT)加载中断门描述符 - **关键操作**:将新代码段选择子的CPL字段设为0(内核态) - 清除IF标志(关中断)和TF标志(禁用单步调试)[^1] 2. **中断服务阶段**: ```c // 伪代码表示CPL切换 uint32_t old_psw = save_current_psw(); // 保存原PSW load_interrupt_gate_descriptor(); // 加载中断门 set_cpl(0); // CPL强制设为0 clear_flags(IF | TF); // 关中断 execute_isr(); // 执行中断服务程序 ``` 3. **中断返回阶段**: - 执行`IRET`指令从栈中恢复原PSW - **CPL还原**: - 若中断前在用户态 → 恢复为CPL=3 - 若中断前在内核态 → 恢复为CPL=0 - 恢复IF/TF标志位状态 #### 数学表示 设中断前PSW状态为: $$\vec{PSW}_{old} = (IF_{old}, TF_{old}, CPL_{old}, \cdots)$$ 中断服务程序执行时的PSW状态: $$\vec{PSW}_{new} = (IF \mapsto 0, TF \mapsto 0, CPL \mapsto 0) \oplus \vec{PSW}_{old}$$ 其中$\oplus$表示字段替换操作,其他标志位保持不变。 #### 关键特性验证 1. **特权级穿透**: - 用户程序(CPL=3)触发硬件中断 → 立即获得内核特权(CPL=0) - 确保中断服务程序能访问所有系统资源[^1] 2. **安全隔离**: ```asm ; x86汇编示例(硬件中断入口) isr_entry: push ds ; 保存数据段 mov ax, KERNEL_DS ; 加载内核数据段 mov ds, ax ; CPL=0时才能设置 ; 中断处理代码... pop ds ; 恢复原数据段 iret ; 恢复原PSW(含CPL) ``` 3. **与异常中断的区别**: - 硬件中断:**总是切换CPL=0**(即使已在内核态) - 缺页中断:若在内核态触发则保持CPL=0 - 访管中断:通过`syscall`指令显式切换CPL[^1] #### 典型场景 **用户态程序被时钟中断打断**: 1. 用户代码(CPL=3)执行中 2. 时钟芯片触发IRQ0 → CPU保存PSW(含CPL=3) 3. **强制设置CPL=0**,跳转到时钟中断处理程序 4. 处理完成后通过`IRET`恢复CPL=3 --- ### 相关问题 1. **硬件中断处理期间发生新的更高优先级中断会怎样?** > 需手动开启中断(`STI`指令)才允许嵌套,此时CPL保持0不变[^3]。 2. **为什么硬件中断要自动关闭中断(IF=0)?** > 防止中断服务程序被意外打断,确保关键操作原子性[^1]。 3. **在中断服务程序中如何安全访问用户空间数据?** > 需显式检查内存权限,因CPL=0可绕过用户空间保护机制[^1]。 4. **中断返回时如何保证特权级切换的安全性?** > `IRET`指令会验证目标代码段描述符的DPL,防止用户程序伪装成内核代码[^1]。
阅读全文

相关推荐

; 8051 交通灯控制程序 - 完整修正版 ; 修复问题: ; 1. 初始灯状态赋值错误(第二组绿灯未正确设置) ; 2. 程序循环卡死问题 ; 3. 绿灯最后1秒闪烁两次功能 ; 硬件连接: ; 第一组:P1.0(黄), P1.1(绿), P1.2(红), P0(倒计时显示) ; 第二组:P1.3(红), P1.4(绿), P1.5(黄), P2(倒计时显示) ; 状态定义 RED EQU 1 GREEN EQU 2 YELLOW EQU 3 ; 变量定义 STATE1 EQU 30H ; 第一组状态 STATE2 EQU 31H ; 第二组状态 COUNT1 EQU 32H ; 第一组倒计时 COUNT2 EQU 33H ; 第二组倒计时 TICK50 EQU 34H ; 50ms计数器(20次=1秒) BLINK1 EQU 35H ; 第一组闪烁标志 BLINK2 EQU 36H ; 第二组闪烁标志 BLINK_CNT EQU 37H ; 闪烁计数器 ORG 0000H LJMP MAIN ORG 000BH LJMP T0_ISR ; 定时器0中断入口 ORG 0030H MAIN: MOV SP, #60H MOV TMOD, #01H ; 定时器0模式1 MOV TH0, #3CH ; 50ms定时(12MHz晶振) MOV TL0, #0B0H SETB EA SETB ET0 SETB TR0 ; 初始化状态(关键修正) MOV STATE1, #RED MOV STATE2, #GREEN MOV COUNT1, #9 ; 第一组红灯9秒 MOV COUNT2, #7 ; 第二组绿灯7秒 MOV TICK50, #20 ; 1秒计数器(20*50ms) MOV BLINK1, #0 MOV BLINK2, #0 MOV BLINK_CNT, #0 ; 初始灯状态(关键修正) MOV P1, #00010100B ; 正确设置: ; 第一组:P1.2=红(1), P1.1=绿(0), P1.0=黄(0) ; 第二组:P1.5=黄(0), P1.4=绿(1), P1.3=红(0) MAIN_LOOP: ; 显示当前倒计时 MOV P0, COUNT1 MOV P2, COUNT2 SJMP MAIN_LOOP ; 无限循环 ; ============== 定时器中断服务程序 ============== T0_ISR: PUSH ACC PUSH PSW ; 重装定时器 MOV TH0, #3CH MOV TL0, #0B0H ; 处理50ms计数 DJNZ TICK50, CHECK_BLINK MOV TICK50, #20 ; 重置1秒计数器 ; ===== 1秒处理 ===== ; 先处理第二组(确保时序正确) LCALL PROCESS_GROUP2 ; 再处理第一组 LCALL PROCESS_GROUP1 SJMP T0_EXIT CHECK_BLINK: ; 处理绿灯闪烁(每50ms执行) LCALL HANDLE_BLINK T0_EXIT: POP PSW POP ACC RETI ; ============== 子程序 ============== ; 处理第一组状态 PROCESS_GROUP1: MOV A, STATE1 CJNE A, #RED, PG1_GREEN ; 红灯状态处理 DEC COUNT1 MOV A, COUNT1 JZ PG1_RED_END RET PG1_RED_END: ; 红灯结束 -> 绿灯 MOV STATE1, #GREEN MOV COUNT1, #7 ; 绿灯7秒 CLR P1.2 ; 关红灯 SETB P1.1 ; 开绿灯 MOV BLINK1, #0 ; 清除闪烁标志 RET PG1_GREEN: CJNE A, #GREEN, PG1_YELLOW ; 绿灯状态处理 DEC COUNT1 MOV A, COUNT1 JZ PG1_GREEN_END CJNE A, #1, PG1_RET ; 倒计时1秒时设置闪烁 MOV BLINK1, #1 ; 设置闪烁标志 MOV BLINK_CNT, #0 ; 初始化闪烁计数器 RET PG1_GREEN_END: ; 绿灯结束 -> 黄灯 MOV STATE1, #YELLOW MOV COUNT1, #2 ; 黄灯2秒 CLR P1.1 ; 关绿灯 SETB P1.0 ; 开黄灯 MOV BLINK1, #0 ; 清除闪烁标志 RET PG1_YELLOW: ; 黄灯状态处理 DEC COUNT1 MOV A, COUNT1 JZ PG1_YELLOW_END RET PG1_YELLOW_END: ; 黄灯结束 -> 红灯 MOV STATE1, #RED MOV COUNT1, #9 ; 红灯9秒 CLR P1.0 ; 关黄灯 SETB P1.2 ; 开红灯 PG1_RET: RET ; 处理第二组状态(关键修正) PROCESS_GROUP2: MOV A, STATE2 CJNE A, #GREEN, PG2_YELLOW ; 绿灯状态处理 DEC COUNT2 MOV A, COUNT2 JZ PG2_GREEN_END CJNE A, #1, PG2_RET ; 倒计时1秒时设置闪烁 MOV BLINK2, #1 ; 设置闪烁标志 MOV BLINK_CNT, #0 ; 初始化闪烁计数器 RET PG2_GREEN_END: ; 绿灯结束 -> 黄灯 MOV STATE2, #YELLOW MOV COUNT2, #2 ; 黄灯2秒 CLR P1.4 ; 关绿灯 SETB P1.5 ; 开黄灯 MOV BLINK2, #0 ; 清除闪烁标志 RET PG2_YELLOW: CJNE A, #YELLOW, PG2_RED ; 黄灯状态处理 DEC COUNT2 MOV A, COUNT2 JZ PG2_YELLOW_END RET PG2_YELLOW_END: ; 黄灯结束 -> 红灯 MOV STATE2, #RED MOV COUNT2, #9 ; 红灯9秒 CLR P1.5 ; 关黄灯 SETB P1.3 ; 开红灯 RET PG2_RED: ; 红灯状态处理 DEC COUNT2 MOV A, COUNT2 JZ PG2_RED_END RET PG2_RED_END: ; 红灯结束 -> 绿灯 MOV STATE2, #GREEN MOV COUNT2, #7 ; 绿灯7秒 CLR P1.3 ; 关红灯 SETB P1.4 ; 开绿灯 PG2_RET: RET ; 处理绿灯闪烁(关键修正) HANDLE_BLINK: ; 第一组闪烁处理 MOV A, BLINK1 JZ HB_CHECK2 INC BLINK_CNT MOV A, BLINK_CNT CJNE A, #5, HB_CHECK2 ; 5*50ms=250ms MOV BLINK_CNT, #0 CPL P1.1 ; 翻转绿灯状态 HB_CHECK2: ; 第二组闪烁处理 MOV A, BLINK2 JZ HB_RET INC BLINK_CNT MOV A, BLINK_CNT CJNE A, #5, HB_RET ; 5*50ms=250ms MOV BLINK_CNT, #0 CPL P1.4 ; 翻转绿灯状态 HB_RET: RET END 这个程序一到第一组黄灯后及到了16s后就卡死,循环不了修改循环的问题,给我修改这个程序循环问题,千万不要出现其他问题

/* LCD1602 显示程序 */ $include (STC8H.INC) Lcd1602_RS BIT P6.7 Lcd1602_RW BIT P6.6 Lcd1602_EN BIT P6.5 Lcd1602_data EQU P7 J_EN EQU 41H ; ;入口地址设置 ORG 0000H LJMP MainPrg ORG 001BH LJMP TIME ORG 0030H ;用户程序区 MainPrg: MOV SP, #5FH ORL P_SW2,#80H ;使能访问XFR MOV P0M0, #00H MOV P0M1, #00H MOV P1M0, #0FFH MOV P1M1, #0FFH MOV P2M0, #080H MOV P2M1, #00H MOV P3M0, #00H MOV P3M1, #0FFH MOV P4M0, #00H MOV P4M1, #00H MOV P5M0, #00H MOV P5M1, #00H MOV P6M0, #00H MOV P6M1, #00H MOV P7M0, #00H MOV P7M1, #00H CLR P1.0 CLR P2.7 NOP NOP LCALL LCD1602_Init MOV A,#10 ACALL DeLayXmS //Waiting the end of Init START: MOV SP,#60H MOV TMOD,#01H ;TIMER0,16bit,1,TIMING MOV TH0,#3CH ;12MHZ,50MS MOV TL0,#0B0H ; MOV R0,#20H MOV R5,#00H MOV R1,#37H MOV 30H,#00H ;S_L MOV 31H,#00H ;S_H MOV 32H,#0AH ;':' MOV 33H,#00H ;M_L MOV 34H,#00H ;M_H MOV 35H,#0AH ;':' MOV 36H,#00H ;H_L MOV 37H,#00H ;H_H MOV 38H,#00H ;Hour SETB ET0 SETB EA SETB TR0 LOOP: LCALL TIME LCALL DSPL ;LCD1602 SHOW LCALL JP32 ;START TEST BUTTON LCALL JP33 ;STOP TEST BUTTON LCALL JP13 ;HOUR +1 LCALL JP14 ;MINUTE +1 LCALL JP15 ;SECOND +1 LJMP LOOP DSPL: MOV A,#080H LCALL LCD1602_WrtCom ;设置第1行地址80+00H MOV A,#"T" ACALL LCD1602_WrtData MOV A,#081H LCALL LCD1602_WrtCom ;设置第1行地址80+01H MOV A,#"I" ACALL LCD1602_WrtData MOV A,#082H LCALL LCD1602_WrtCom ;设置第1行地址80+02H MOV A,#"M" ACALL LCD1602_WrtData MOV A,#083H LCALL LCD1602_WrtCom ;设置第1行地址80+03H MOV A,#"E" ACALL LCD1602_WrtData MOV A,#084H LCALL LCD1602_WrtCom ;设置第1行地址80+04H MOV A,#":" ACALL LCD1602_WrtData MOV A,#085H LCALL LCD1602_WrtCom MOV R7,#8 ;_ _:_ _:_ _,ALL 8 BIT MOV R1,#37H L1: MOV A,@R1 ;R1 = 37H,(37H)= H_H-->S_L ADD A,#30H ;ASCII NEED + '30' ACALL LCD1602_WrtData DEC R1 ;FROM H_H -->S_L SHOW DJNZ R7,L1 ;ALL 8 BIT ;显示1秒 MOV A,#250 ACALL DeLayXmS MOV A,#250 ACALL DeLayXmS MOV A,#250 ACALL DeLayXmS MOV A,#250 ACALL DeLayXmS ;WAIT 1S MOV A,#01H ; ACALL LCD1602_WrtCom ;清屏 ACALL DL1mS RET TIME: MOV TH0,#3CH MOV TL0,#0B0H JSTCE0: MOV A,J_EN CJNE A,#0,JSTCE1 CLR P2.7 ;J_EN==0,NOT WORK LJMP EXIT JSTCE1: MOV A,J_EN CJNE A,#1,EXIT ;J_EN==1,WORK LJMP COUNT COUNT: DJNZ R0,JSTCE0 ;1S? ;S_L MOV R0,#20H ;RESET S INC 30H ;S_L +1 INC 40H ;S +1 MOV A,30H ;A=0-9 ;S_H CJNE A,#10,WARN MOV 30H,#00H ;S_L =0 INC 31H ;S_H +1 MOV A,31H ;A=0-5 ;M_L CJNE A,#6,WARN MOV 31H,#00H ;S_H =0 MOV 40H,#00H ;S =0 INC 33H ;M_L +1 INC 39H ;M +1 MOV A,33H ;A=0-9 ;M_H CJNE A,#10,WARN MOV 33H,#00H ;M_L =0 INC 34H ;M_H +1 MOV A,34H ;A=0-5 ;H_L CJNE A,#6,WARN MOV 34H,#00H ;M_H =0 MOV 39H,#00H ;M =0 INC 36H ;H_L +1 INC 38H ;H +1 MOV A,36H ;A=0-9 MOV R5,38H ;R5=0-24 ;H_H CJNE R5,#24,CTN ;H_L=4? MOV 36H,#00H ;H_L =0 MOV 37H,#00H ;H_H =0 MOV 38H,#00H ;H =0 AJMP WARN CTN: CJNE A,#10,WARN MOV 36H,#00H ;H_L =0 INC 37H ;H_H +1 MOV A,37H ;A=0-2 ;WARN WARN: MOV A,40H ;S==0 CJNE A,#0,WARNOFF MOV A,39H ;M==0 CJNE A,#0,WARNOFF CPL P2.7 ;M_H,M_L == 0, WARN ON LJMP EXIT WARNOFF:CLR P2.7 ;WARN OFF LJMP EXIT EXIT: RET /******************************************************************* 功能描述:LCD1602初始化函数 入口参数:无 返回值:无 ********************************************************************/ LCD1602_Init: CLR Lcd1602_EN MOV R7,#5 ACALL DeLayXmS // MOV A,#38H ; ACALL LCD1602_WrtCom ;设置显示模式为:8位数据,双列,5*7字形 MOV A,#0EH ;0000- 1 D C B :Dsp on/off,Cursor on/off, Blink on/off ACALL LCD1602_WrtCom ;0000- 1 1 1 0 : on on off MOV A,#06H ;设置输入模式: 0000 01 I/D S :I/D-> +/- : S-> ACALL LCD1602_WrtCom ; 0000 01 1 :显示地址递增,即写一个数据后,显示位置右移一位 MOV A,#01H ; ACALL LCD1602_WrtCom ;清屏 RET /******************************************************************* 功能描述:LCD1602写数据函数 入口参数:ACC 返回值:无 ********************************************************************/ LCD1602_WrtData: ; MOV P6M0, #0E0H ; MOV P6M1, #00H ;设置RS(p6.7),RW(p6.6),EN(p6.5)为推挽 CLR Lcd1602_EN SETB Lcd1602_RS //选择数据寄存器 CLR Lcd1602_RW //选择写操作 MOV Lcd1602_data,A //把命令送入到LCD1602屏8位数据口 SETB Lcd1602_EN LCALL DL1mS CLR Lcd1602_EN RET /******************************************************************* 功能描述:LCD1602写命令函数 入口参数ACC 返回值:无 ********************************************************************/ LCD1602_WrtCom: ; MOV P6M0, #0E0H ; MOV P6M1, #00H ;设置RS(p6.7),RW(p6.6),EN(p6.5)为推挽 CLR Lcd1602_EN CLR Lcd1602_RS //选择指令寄存器 CLR Lcd1602_RW //选择写操作 MOV Lcd1602_data,A //把命令送入到LCD1602屏8位数据口 SETB Lcd1602_EN LCALL DL1mS CLR Lcd1602_EN RET /******************************************************************* 功能描述:BUTTON TEST ********************************************************************/ ;START TEST JP32: ;INT0 JB P3.2,P32_OUT ;IF P3.2==1,JUMP TO P32_OUT LCALL DL1mS ;WAIT JB P3.2,P32_OUT ;IF P3.2==1,JUMP TO P32_OUT JNB P3.2,$ ;WAITING OVER PUSH MOV J_EN,#1 ;TEST EN==1 P32_OUT: RET ;FINISH TEST JP33: ;INT1 JB P3.3,P33_OUT ;IF P3.3==1,JUMP TO P33_OUT LCALL DL1mS ;WAIT JB P3.3,P33_OUT ;IF P3.3==1,JUMP TO P33_OUT JNB P3.3,$ ;WAITING OVER PUSH MOV J_EN,#0 ;TEST EN==0 P33_OUT: RET ;HOUR +1 JP13: JB P1.3,P13_OUT ;IF P1.3==1,JUMP TO P13_OUT LCALL DL1mS ;WAIT JB P1.3,P13_OUT ;IF P1.3==1,JUMP TO P13_OUT JNB P1.3,$ ;WAITING OVER PUSH INC 38H ;H +1 INC 36H MOV A,38H CJNE A,#24,JH_L ;MAX==23 MOV 38H,#0 MOV 37H,#0 MOV 36H,#0 AJMP P13_OUT JH_L: MOV A,36H CJNE A,#10,P13_OUT MOV 36H,#0 INC 37H P13_OUT: RET ;MINUTE +1 JP14: JB P1.4,P14_OUT ;IF P1.4==1,JUMP TO P14_OUT LCALL DL1mS ;WAIT JB P1.4,P14_OUT ;IF P1.4==1,JUMP TO P14_OUT JNB P1.4,$ ;WAITING OVER PUSH INC 39H ;M +1 INC 33H MOV A,39H CJNE A,#60,JM_L ;MAX==59 MOV 39H,#0 MOV 33H,#0 MOV 34H,#0 AJMP P14_OUT JM_L: MOV A,33H CJNE A,#10,P14_OUT MOV 33H,#0 INC 34H P14_OUT: RET ;SECOND +1 JP15: JB P1.5,P15_OUT ;IF P1.5==1,JUMP TO P15_OUT LCALL DL1mS ;WAIT JB P1.5,P15_OUT ;IF P1.5==1,JUMP TO P15_OUT JNB P1.5,$ ;WAITING OVER PUSH INC 40H ;S +1 INC 30H MOV A,40H CJNE A,#60, JS_L;MAX==59 MOV 40H,#0 MOV 30H,#0 MOV 31H,#0 AJMP P15_OUT JS_L: MOV A,30H CJNE A,#10,P15_OUT MOV 30H,#0 INC 31H P15_OUT: RET /******************************************************************* 功能描述:延时函数,延时约1-256us,在11.0592MHZ下 入口参数:A(USING 3),1-256 返回值:无 ********************************************************************/ DeLayXuS: PUSH PSW SETB RS1 SETB RS0 MOV R7,A _DyX10us: ACALL DL10uS DJNZ R6,_DyX10us POP PSW RET /******************************************************************* 功能描述:延时函数,延时约1-256ms,在11.0592MHZ下 入口参数:A(USING 3),1-256 返回值:无 ********************************************************************/ DeLayXmS: PUSH PSW SETB RS1 SETB RS0 MOV R7,A _Dly1ms: ACALL DL1mS DJNZ R7,_Dly1ms POP PSW RET /******************************************************************* 功能描述:延时函数,延时约1ms,在11.0592MHZ下 入口参数:无 返回值:无 ********************************************************************/ DL1mS: PUSH 29H PUSH 2AH NOP MOV 29H,#100 _Dly10us: MOV 2AH,#36 _dl0us: DJNZ 2AH,_dl0us DJNZ 29H,_Dly10us POP 2AH POP 29H RET /******************************************************************* 功能描述:延时函数,延时约10us,@11.0592MHZ:#35 //@12MHZ:#38 入口参数:无 返回值:无 ********************************************************************/ DL10uS: PUSH 28H NOP MOV 28H,#35 _dl: DJNZ 28H,_dl POP 28H RET SJMP $ END 将该代码中关于在LCD1602上显示的代码更改为在数码管上显示的代码,最后给我完整的代码

大家在看

recommend-type

《操作系统教程》(第六版)习题答案

教材:《操作系统教程》(第六版)骆斌,葛季栋,费翔林编著 内容为该教材的习题答案(仅供参考,不确保是否有遗漏)
recommend-type

HA_PandoraRecovery211 数据恢复

HA_PandoraRecovery211 数据恢复
recommend-type

删除ip gurad软件,拒绝监管

删除ip gurad 拒绝监管,放心使用,运行完成请重启动! 如果不成功可能是个人机器设置问题,不要喷我!
recommend-type

RetweetBot::pizza:实现自动转发最新twitter到QQ的机器人

RetwitterBot 实现自动转发最新twitter到QQ的机器人 Retweet newest tweets to QQ by using this bot, which based on tweepy and QQbot. Just make more convenience for people in our daily life (^_^) 感谢提供的代理服务 施工中……………… 基本功能 2018年7月4日更新 实现基本的转推功能,可以将最新的tweet转发到qq群中 实现简单的回复功能:私聊或者在群中check数字(无空格)可查看最新的某条tweet 私聊时若无设定匹配语句则会随机选择一条回复语句,目前匹配语句:hi、现在几点、check 2018年7月5日更新 考虑加入googleAPI实现更多功能 加入学习功能:在群中回复“学习A回答B”即可让机器人在群中接受到消息A后
recommend-type

vindr-cxr:VinDr-CXR

VinDr-CXR:带有放射科医生注释的胸部 X 射线开放数据集 VinDr-CXR 是一个大型公开可用的胸片数据集,带有用于常见胸肺疾病分类和关键发现定位的放射学注释。 它由 Vingroup 大数据研究所 (VinBigdata) 创建。 该数据集包含 2018 年至 2020 年从越南两家主要医院收集的超过 18,000 次 CXR 扫描。这些图像被标记为存在 28 种不同的放射学发现和诊断。 训练集中的每次扫描都由一组三名放射科医生进行注释。 对于测试集,五位经验丰富的放射科医生参与了标记过程,并根据他们的共识来建立测试标记的最佳参考标准。 要下载数据集,用户需要注册并接受我们网页上描述的数据使用协议 (DUA)。 通过接受 DUA,用户同意他们不会共享数据,并且数据集只能用于科学研究和教育目的。 代码 该存储库旨在支持使用 VinDr-CXR 数据。 我们提供了用于从 DICO

最新推荐

recommend-type

2014年直流电压电流采样仪生产方案:电路板、BOM单、STM单片机程序及应用 核心版

2014年设计的一款直流电压电流采样仪的整套产品生产方案。该产品已量产1000余套,适用于电力、电子、通信等领域。文中涵盖了硬件和软件两大部分的内容。硬件方面,包括电路板设计、BOM单、外围器件清单以及外壳设计;软件方面,则涉及STM单片机程序和配套的上位机电脑软件。该采样仪的最大测量范围为1000V/100A,具备高精度、高稳定性的特点,能记录并存储8组电压电流数据,并带有触发模式用于实时监测和故障诊断。 适合人群:从事电力、电子、通信领域的工程师和技术人员,尤其是对直流电压电流采样仪有需求的研发人员。 使用场景及目标:①帮助工程师和技术人员了解直流电压电流采样仪的整体设计方案;②提供详细的硬件和软件资料,便于实际生产和应用;③适用于需要高精度、高稳定性的电压电流测量场合。 其他说明:该产品已经成功量产并获得市场好评,文中提供的方案对于相关领域的项目开发具有重要参考价值。
recommend-type

springboot基于安卓的旅游景点导览APP的设计与实现论文

springboot旅游景点导览APP的设计与实现
recommend-type

SaaS 被 AI 工具替代风险与安全治理对比.doc

SaaS 被 AI 工具替代风险与安全治理对比.doc
recommend-type

快速编写 Platform Engineering 工具蓝图.doc

快速编写 Platform Engineering 工具蓝图.doc
recommend-type

基于K折交叉验证的BP神经网络回归预测MATLAB代码教程——Excel数据读取与应用 全集

内容概要:本文档详细介绍了利用MATLAB进行基于K折交叉验证的BP神经网络回归预测的方法。主要内容涵盖从Excel读取数据、数据预处理(如归一化)、构建并配置BP神经网络模型、执行交叉验证以及最终结果的可视化展示。文档提供了完整的代码示例,每个步骤都有详细的解释,确保初学者能够轻松理解和操作。此外,还特别强调了一些常见的注意事项和技术细节,比如如何正确地设置网络参数以避免过拟合等问题。 适合人群:对于希望快速掌握BP神经网络及其在MATLAB环境下具体实现的新手程序员或者学生。 使用场景及目标:适用于需要对小规模数据集进行非线性关系建模和预测的研究项目。通过本教程的学习,用户将学会如何搭建一个简单的BP神经网络来解决实际问题,并能灵活调整相关参数以适应不同的应用场景。 其他说明:文中提供的案例为水泥强度预测任务,但用户可以根据自身需求替换相应的数据集,只要保证数据格式符合要求即可。同时提醒使用者,在处理较小规模的数据集时应注意选择合适的K值以获得更好的泛化性能。
recommend-type

Python程序TXLWizard生成TXL文件及转换工具介绍

### 知识点详细说明: #### 1. 图形旋转与TXL向导 图形旋转是图形学领域的一个基本操作,用于改变图形的方向。在本上下文中,TXL向导(TXLWizard)是由Esteban Marin编写的Python程序,它实现了特定的图形旋转功能,主要用于电子束光刻掩模的生成。光刻掩模是半导体制造过程中非常关键的一个环节,它确定了在硅片上沉积材料的精确位置。TXL向导通过生成特定格式的TXL文件来辅助这一过程。 #### 2. TXL文件格式与用途 TXL文件格式是一种基于文本的文件格式,它设计得易于使用,并且可以通过各种脚本语言如Python和Matlab生成。这种格式通常用于电子束光刻中,因为它的文本形式使得它可以通过编程快速创建复杂的掩模设计。TXL文件格式支持引用对象和复制对象数组(如SREF和AREF),这些特性可以用于优化电子束光刻设备的性能。 #### 3. TXLWizard的特性与优势 - **结构化的Python脚本:** TXLWizard 使用结构良好的脚本来创建遮罩,这有助于开发者创建清晰、易于维护的代码。 - **灵活的Python脚本:** 作为Python程序,TXLWizard 可以利用Python语言的灵活性和强大的库集合来编写复杂的掩模生成逻辑。 - **可读性和可重用性:** 生成的掩码代码易于阅读,开发者可以轻松地重用和修改以适应不同的需求。 - **自动标签生成:** TXLWizard 还包括自动为图形对象生成标签的功能,这在管理复杂图形时非常有用。 #### 4. TXL转换器的功能 - **查看.TXL文件:** TXL转换器(TXLConverter)允许用户将TXL文件转换成HTML或SVG格式,这样用户就可以使用任何现代浏览器或矢量图形应用程序来查看文件。 - **缩放和平移:** 转换后的文件支持缩放和平移功能,这使得用户在图形界面中更容易查看细节和整体结构。 - **快速转换:** TXL转换器还提供快速的文件转换功能,以实现有效的蒙版开发工作流程。 #### 5. 应用场景与技术参考 TXLWizard的应用场景主要集中在电子束光刻技术中,特别是用于设计和制作半导体器件时所需的掩模。TXLWizard作为一个向导,不仅提供了生成TXL文件的基础框架,还提供了一种方式来优化掩模设计,提高光刻过程的效率和精度。对于需要进行光刻掩模设计的工程师和研究人员来说,TXLWizard提供了一种有效的方法来实现他们的设计目标。 #### 6. 系统开源特性 标签“系统开源”表明TXLWizard遵循开放源代码的原则,这意味着源代码对所有人开放,允许用户自由地查看、修改和分发软件。开源项目通常拥有活跃的社区,社区成员可以合作改进软件,添加新功能,或帮助解决遇到的问题。这种开放性促进了技术创新,并允许用户根据自己的需求定制软件。 #### 7. 压缩包子文件的文件名称列表 文件名称列表中的“txlwizard-master”可能指的是TXLWizard项目的主版本库或主分支。这个名称表明了这是项目源代码的中心点,其他开发者会从这个主分支拉取代码进行合作开发或部署。以“-master”结尾通常是版本控制系统中表示主要开发线路的常见约定,例如Git中的master(现在更常被称为main)分支。 通过这些知识点的详细解释,我们可以看到TXLWizard不仅是一个用于生成TXL文件的工具,它还整合了一系列的功能,使得电子束光刻掩模的设计工作更为高效和直观。同时,作为一个开源项目,它能够借助社区的力量不断进步,为用户带来更多的便利和创新。
recommend-type

【创新图生成:扣子平台的技术前沿与创新思维】:引领图像生成技术的新潮流

# 1. 扣子平台的图像生成技术概述 在当今数字化时代,图像生成技术正成为推动技术创新和社会变革的关键力量。扣子平台正是这一技术革新的代表。本章将对扣子平台的图像生成技术进行一个全面概述,探究它如何将理论技术转化为实际应用,并带来显著的社会影响。 扣子平台运用了先进的图像生成技术,将现实世界和数字空间无缝融合,打造了沉浸式的视觉体验。其技术的核心是通过高度复杂的算法模型,快速生成高质
recommend-type

海康威视机器视觉工程师考核

<think>好的,我现在需要帮助用户了解海康威视机器视觉工程师的考核内容和要求。根据用户提供的引用资料,特别是引用[1]和[2],里面提到了考核素材包分为初级和中级,涵盖理论、算法、应用案例等。首先,我要整理这些信息,确保结构清晰,符合用户要求的格式。 接下来,我需要确认素材包的具体内容,比如初级和中级的不同点。引用[2]提到初级包含基础理论、算法实现和实际案例,中级则增加复杂算法和项目分析。这部分需要分点说明,方便用户理解层次。 另外,用户可能想知道如何准备考核,比如下载素材、学习顺序、模拟考核等,引用[2]中有使用说明和注意事项,这部分也要涵盖进去。同时要注意提醒用户考核窗口已关闭,
recommend-type

Linux环境下Docker Hub公共容器映像检测工具集

在给出的知识点中,我们需要详细解释有关Docker Hub、公共容器映像、容器编排器以及如何与这些工具交互的详细信息。同时,我们会涵盖Linux系统下的相关操作和工具使用,以及如何在ECS和Kubernetes等容器编排工具中运用这些检测工具。 ### Docker Hub 和公共容器映像 Docker Hub是Docker公司提供的一项服务,它允许用户存储、管理以及分享Docker镜像。Docker镜像可以视为应用程序或服务的“快照”,包含了运行特定软件所需的所有必要文件和配置。公共容器映像指的是那些被标记为公开可见的Docker镜像,任何用户都可以拉取并使用这些镜像。 ### 静态和动态标识工具 静态和动态标识工具在Docker Hub上用于识别和分析公共容器映像。静态标识通常指的是在不运行镜像的情况下分析镜像的元数据和内容,例如检查Dockerfile中的指令、环境变量、端口映射等。动态标识则需要在容器运行时对容器的行为和性能进行监控和分析,如资源使用率、网络通信等。 ### 容器编排器与Docker映像 容器编排器是用于自动化容器部署、管理和扩展的工具。在Docker环境中,容器编排器能够自动化地启动、停止以及管理容器的生命周期。常见的容器编排器包括ECS和Kubernetes。 - **ECS (Elastic Container Service)**:是由亚马逊提供的容器编排服务,支持Docker容器,并提供了一种简单的方式来运行、停止以及管理容器化应用程序。 - **Kubernetes**:是一个开源平台,用于自动化容器化应用程序的部署、扩展和操作。它已经成为容器编排领域的事实标准。 ### 如何使用静态和动态标识工具 要使用这些静态和动态标识工具,首先需要获取并安装它们。从给定信息中了解到,可以通过克隆仓库或下载压缩包并解压到本地系统中。之后,根据需要针对不同的容器编排环境(如Dockerfile、ECS、Kubernetes)编写配置,以集成和使用这些检测工具。 ### Dockerfile中的工具使用 在Dockerfile中使用工具意味着将检测工具的指令嵌入到构建过程中。这可能包括安装检测工具的命令、运行容器扫描的步骤,以及将扫描结果集成到镜像构建流程中,确保只有通过安全和合规检查的容器镜像才能被构建和部署。 ### ECS与Kubernetes中的工具集成 在ECS或Kubernetes环境中,工具的集成可能涉及到创建特定的配置文件、定义服务和部署策略,以及编写脚本或控制器来自动执行检测任务。这样可以在容器编排的过程中实现实时监控,确保容器编排器只使用符合预期的、安全的容器镜像。 ### Linux系统下的操作 在Linux系统下操作这些工具,用户可能需要具备一定的系统管理和配置能力。这包括使用Linux命令行工具、管理文件系统权限、配置网络以及安装和配置软件包等。 ### 总结 综上所述,Docker Hub上的静态和动态标识工具提供了一种方法来检测和分析公共容器映像,确保这些镜像的安全性和可靠性。这些工具在Linux开发环境中尤为重要,因为它们帮助开发人员和运维人员确保他们的容器映像满足安全要求。通过在Dockerfile、ECS和Kubernetes中正确使用这些工具,可以提高应用程序的安全性,减少由于使用不安全的容器镜像带来的风险。此外,掌握Linux系统下的操作技能,可以更好地管理和维护这些工具,确保它们能够有效地发挥作用。
recommend-type

【扣子平台图像艺术探究:理论与实践的完美结合】:深入学习图像生成的艺术

# 1. 图像艺术的理论基础 艺术领域的每一个流派和技巧都有其理论基础。在图像艺术中,理论基础不仅是对艺术表现形式的认知,也是掌握艺术创作内在逻辑的关键。深入理解图像艺术的理论基础,能够帮助艺术家们在创作过程中更加明确地表达自己的艺术意图,以及更好地与观众沟通。 图像艺术的理论