ARMCortex-M3权威指南-中断和异常(2)

ARMCortex-M3权威指南-中断和异常(2)
中断和异常
它⽀持16-4-1=11 种系统异常(同步)(保留了 4+1 个档位),外加 240 个外部中断输⼊(异步)。在 CM3 中取消了 FIQ 的概念(v7 前的ARM 都有这个 FIQ,快中断请求),这是因为有了更新更好的机制——中断优先级管理以及嵌套中断⽀持,它们被纳⼊ CM3 的中断管理逻辑中。因此,⽀持嵌套中断的系统就更容易实现 FIQ。虽然 CM3 是⽀持 240 个外中断的,但具体使⽤了多少个是由芯⽚⽣产商决定。 CM3还有⼀个NMI(不可屏蔽中断)输⼊脚。当它被置为有效(assert)时, NMI 服务例程会⽆条件地执⾏。 NMI 究竟被拿去做什么,还要视处理器的设计⽽定。在多数情况下, NMI 会被连接到⼀个看门狗定时器,有时也会是电压监视功能块,以便在电压掉⾄危险级别后警告处理器。
当 CM3 内核响应了⼀个发⽣的异常后,对应的异常服务例程(ESR)就会执⾏。为了决定 ESR 的⼊⼝地址, CM3 使⽤了“向量表查表机制”。这⾥使⽤⼀张向量表。向量表其实是⼀个 WORD(32 位整数)数组,每个下标对应⼀种异常,该下标元素的值则是该 ESR 的⼊⼝地址。向量表在地址空间中的位置是可以设置的,通过 NVIC 中的⼀个重定位寄存器来指出向量表的地址。在复位后,该寄存器的值为 0。因此,在地址 0 处必须包含⼀张向量表,⽤于初始时的异常分配。举个例⼦,如果发⽣了异常 11(SVC),
机控网则 NVIC 会计算出偏移移量是
11x4=0x2C,然后从那⾥取出服务例程的⼊⼝地址并跳⼊。要注意的是这⾥有个另类: 0 号类型并不是什么⼊⼝地址,⽽是给出了复位后MSP 的初值。
CM3允许向量表重定位即从其它地址处开始执⾏各异常向量。这些地址对应的区域可以是代码区,但也可以是 RAM 区。在 RAM区就可以修改向量的⼊⼝地址了。为了实现这个功能, NVIC中有⼀个寄存器,称为“向量表偏移量寄存器”(在地址 0xE000_ED08 处),通过修改它的值就能定位向量表。
异常堆栈操作
内核还会在异常处理的始末⾃动地执⾏ PUSH 与 POP 操作。注意:在寄存器列表中,不管寄存器的序号是以什么顺序给出的,汇编器都将把它们升序排序。然后先 push 序号⼤的寄存器,所以也就先 pop 序号⼩的寄存器。如果不按升序写寄存器,也许有些汇编器会给出语法错误。在进⼊ ESR 时, CM3 会⾃动把⼀些寄存器压栈,这⾥使⽤的是发⽣本异常的瞬间正在使⽤的 SP指针(MSP 或者是 PSP)。离开ESR 后,只要 ESR 没有更改过 CONTROL[1],就依然使⽤发⽣本次异常的瞬间正在使⽤的 SP 指针来执⾏出栈操作。
异常复位流程
复位流程:1)从地址 0x0000,0000 处取出 MSP 的初始值。2)从地址 0x0000,0004 处取出 PC 的初始值——这个值是复位向量, LSB 必须是 1。然后从这个值所对应的地址处取指。
请注意,这与传统的 ARM 架构不同——其实也和绝⼤多数的其它单⽚机不同。传统的 ARM 架构总是从 0 地址开始执⾏第⼀条指令。它们的 0 地址处总是⼀条跳转指令。在 CM3 中,在 0 地址处提供 MSP 的初始值,然后紧跟着就是向量表。向量表中的数值是 32 位的地址,⽽不是跳转指令。向量表的第⼀个条⽬指向复位后应执⾏的第⼀条指令。
向量表跟随在 MSP 的初始值之后——也就是第 2 个表⽬。要注意因为 CM3 是在 Thumb 态下执⾏,所以向量表中的每个数值都必须把 LSB 置 1(也就是奇数)。正是因为这个原因,图 3.18 中使⽤0x101 来表达地址 0x100。当 0x100 处的指令得到执⾏后,就正式开始了程序的执⾏。在此之前初始化 MSP 是必需的,因为可能第 1 条指令还没来得及执⾏,就发⽣了 NMI 或是其它 fault。 MSP 初始化好后就已经为它们的服务例程准备好了堆栈
中断与异常的区别
中断对 CM3 核来说都是“意外突发事件” ——也就是说,该请求信号来⾃ CM3 内核的外⾯,来⾃各种⽚上外设和外扩的外设,
对 CM3 来说是“异步”的;⽽异常则是因 CM3 内核的活动产⽣的——在执⾏指令或访问存储器时产⽣,因此对 CM3 来说是“同步”的。pending悬起的功能
如果⼀个发⽣的异常不能被即刻响应,就称它被“悬起” (pending)。不过,少数 fault 异常是不允许被悬起的。⼀个异常被悬起的原因,可能是系统当前正在执⾏⼀个更⾼优先级异常的服务例程,或者因相关掩蔽位的设置导致该异常被除能。对于每个异常源,在被悬起的情况下,都会有⼀个对应的“悬起状态寄存器”保存其异常请求。待到该异常能够响应时,执⾏其服务例程,这与传统的 ARM 是完全不同的。在以前,是由产⽣中断的设备保持住请求信号;CM3 则由 NVIC 的悬起状态寄存器来解决这个问题。于是,哪怕设备在后来已经释放了请求信号,曾经的中断请求也不会错失。
中断优先级
CM3⽀持中断抢占。优先级的数值越⼩,则优先级越⾼有3个系统异常:复位, NMI 以及硬fault,它们有固定的优先级,并且它们的优先级号是负数,从⽽⾼于所有其它异常。所有其它异常的优先级则都是可编程的,但不能被编程为负数。
如果使⽤更多的位来表达优先级,则可以使⽤的值也更多,同时需要的门也更多——带来更多的成本和功耗。 CM3 允许的最少使⽤位数为3 个位,亦即⾄少要⽀持 8 级优先级。
抢占优先级决定了抢占⾏为:当系统正在响应某异常 L 时,如果来了抢占优先级更⾼的异常 H,则 H 可以抢占 L。亚优先级则处理“内务”:当抢占优先级相同的异常有不⽌⼀个悬起时,就优先响应亚优先级最⾼的异常。在计算抢占优先级和亚优先级的有效位数时,芯⽚实际使⽤了多少位来表达优先级;优先级组是如何划分的。举个例⼦,如果只使⽤ 3 个位来表达优先级([7:5]),并且优先级组的值是 5(从⽐特 5处分组),则你得到 4 级抢占优先级,且在每个抢占优先级的内部有 2 个亚优先级。如果优先级完全相同的多个异常同时悬起,则先响应异
常编号最⼩的那⼀个。
中断处理时序图
当中断输⼊脚被 assert后,该中断就被悬起。当某中断的服务例程开始执⾏时,就称此中断进⼊了“活跃”状态,并且其悬起位会被硬件⾃动清除,在⼀个中断活跃后,直到其服务例程执⾏完毕,并且返回了,才能对该中断的新请求予以响应。当然,新请求的响应亦是由硬件⾃动清零悬起标志位。
如果中断源咬住请求信号不放,该中断就会在其上次服务例程返回后再次被置为悬起状态。
异常类型
总线faults异常
当 AHB 接⼝上正在传送数据时,如果回复了⼀个错误信号(error response),则会产⽣总线faults,产⽣的场合可以是,1)取指,通常被称作“预取流产”(prefetch abort);2)数据读/写,通常被称作“数据流产”(data abort)
哪些因素会导致 AHB 回复⼀个错误信号?
AHB 回复的错误信号会触发总线 fault,诱因可以是:
1. 企图访问⽆效的存储器 region。常见于访问的地址没有相对应的存储器。
2. 设备还没有作好传送数据的准备。⽐如,在尚未初始化 SDRAM 控制器的时候试图访问 SDRAM。
3. 在企图启动⼀次数据传送时,传送的尺⼨不能为⽬标设备所⽀持。例如,某设备只接受字型数据,却试图送给它字节型数据。
4. 因为某些原因,设备不能接受数据传送。例如,某些设备只有在特权级下才允许访问,可当前却是⽤户级。
使能总线fault需要在NVIC中配置BUSFAULTENA位,并且配置好中断向量表。发⽣总线fault后,NVIC提供了事故原因的状态寄存器,总线fault状态寄存器(BFSR):是在数据访问时,在取指时,还是在中断的堆栈操作时。总线 fault 地址寄存器(BFAR):存储异常指令地址。磁悬浮鼠标
数据访问产⽣的总线 fault可分为精确的总线fault和不精确的总线fault:例如缓冲区写⼊就是不精确总线fault,启动缓冲区写⼊时指令早已执⾏,中途触发了总线fault。
存储器管理fault
存储器管理 faults 多与 MPU 有关,其诱因常常是某次访问触犯了 MPU 设置的保护规范。另外,某些⾮法访问,例如,在不可执⾏的存储器区域试图取指,也会触发⼀个 MemManage fault,⽽且在这种场合下,即使没有 MPU 也会触发 MemMange fault。
MemManage faults 的常见诱因如下所⽰:
访问了所有 MPU regions 覆盖范围之外的地址
访问了没有存储器与之对应的空地址
往只读 region 写数据
⽤户级下访问了只允许在特权级下访问的地址
在 MemManage fault 发⽣后,如果其服务例程是使能的,则执⾏服务例程。如果同时还发⽣了其它
⾼优先级异常,则优先处理这些⾼优先级的异常, MemManage 异常被悬起。如果 MemMange fault是被同级或⾼优先级异常的服务例程引发的,或者MemManage fault被除能,则和总线fault⼀样:上访成硬 fault,最终执⾏的是硬 fault 的服务例程。如果硬 fault 服务例程或 NMI 服务例程的执⾏也导致了 MemManage fault,那就不可救要了——内核将被锁定。
为了调查 MemManage fault 的案发现场, NVIC 中有⼀个“存储器管理 fault 状态寄存器(MFSR)”,它指出导致 MemManage fault 的原因。如果是因为⼀个数据访问违例(DACCVIOL 位)或是⼀个取指访问违例(IACCVIOL 位),则违例指令的地址已经被压⼊栈中。如果还有 MMARVALID位被置位,则还能进⼀步查出引发此 fault 时访问的地址——读取 NVIC“存储器管理地址寄存器(MMAR)”的值。
⽤法fault
⽤法 faults 发⽣的场合可以是:
靶板1. 执⾏了协处理器指令。 Cortex-M3 本⾝并不⽀持协处理器,但是通过 fault 异常机制,可以建⽴⼀套“软件模拟”的机制,来执⾏⼀段程
序模拟协处理器的功能,从⽽可以⽅便地在其它 Cortex 处理器间移植。
2. 执⾏了未定义的指令。同上⼀点的道理,亦可以软件模拟未定义指令的功能。
3. 尝试进⼊ ARM 状态。因为 CM3 不⽀持 ARM 状态,所以⽤法 fault 会在切换时产⽣。软件可以利⽤此机制来测试某处理器是否⽀持
ARM 状态。
4. ⽆效的中断返回(LR 中包含了⽆效/错误的值)
5. 使⽤多重加载/存储指令时,地址没有对齐。
硬fault
硬 fault 是上⽂讨论的总线 fault、存储器管理 fault 以及⽤法 fault 上访的结果。在取向量(异常处理时对异常向量表的读取)时产⽣的总线fault 也按硬 fault 处理。在 NVIC中有⼀个硬 fault 状态寄存器(HFSR),它指出产⽣硬 fault 的原因。如果不是由于取向量造成的,则硬fault 服务例程必须检查其它的 fault 状态寄存器,以最终决定是谁上访的。硬 fault 状态寄存器(地址: 0xE000_ED2C):
应对fault策略
在软件开发过程中,我们可以根据各种 fault 状态寄存器的值来判定程序错误,并且改正它们。
在⼀个RTOS实时系统中,发⽣了 Faults 后,如果不加以处理常会危及系统的运⾏。因此在出了导致 fault 的原因后,软件必须决定下⼀步该怎么办。下⾯就给出⼀些应付 fault 的常⽤⽅法。
1. 复位:这通常是最后⼀招。通过设置 NVIC“应⽤程序中断及复位控制寄存器”中的 VECTRESET位,将只复位处理器内核⽽不复位其它
⽚上设施。取决于芯⽚的复位设计,有些 CM3 芯⽚可以使⽤该寄存器的 SYSRESETREQ 位来复位。这种只限于内核中的复位不会殃及其它的系统部件。
2. 恢复:在⼀些场合下,还是有希望解决产⽣ fault 的问题的。例如,如果程序尝试访问了协处理器,可以通过⼀个协处理器的软件模拟
器来解决此问题——当然是以牺牲性能为代价的,要不然还要硬件加速⼲啥。
3. 中⽌相关任务:如果系统运⾏了⼀个 RTOS,则相关的任务可以被终结或者重新开始。各个 fault 状态寄存器(FSRs)都保持住它们的状
态,直到⼿⼯清除。 Fault 服务例程在处理了相应的 fault 后不要忘记清除这些状态,否则如果下次⼜有新的 fault 发⽣,服务例程在检视fault 源时,⼜将看到早先已经处理的 fault 遗留下来的状态标志。此时,将⽆法判断哪个 fault是新发⽣的。 FSRs 采⽤⼀个写时清除机制(写 1 时清除)。芯⽚⼚商也
可以再添加⾃⼰的 FSR,以表⽰其它 fault 情况。
CM3 中的 fault 状态寄存器组
SVC和PendSV
SVC⽤于产⽣系统函数的调⽤,⽬的是不让⽤户程序直接访问硬件,⽽是通过⼀些系统服务函数,让⽤户程序使⽤SVC发出对系统服务函数的呼叫请求。好处是:
1. 解耦⽤户程序与底层驱动,由os控制具体的硬件,⽤户程序移植更⽅便。
2. 使⽤特权等级优势,由os操作硬件,提⾼了系统的健壮性和可靠性。
SVC指令需要⼀个⽴即数来充当系统调⽤代号,从⽽获取响应的服务函数。在 SVC 服务例程中不能嵌套使⽤ SVC 指令,因为同优先级的异常不能抢占⾃⾝。这种作法会产⽣⼀个⽤法 fault。同理,在 NMI服务例程中也不得使⽤ SVC,否则将触发硬 fault。
PendSV是让请求缓期执⾏,当其他中断完毕后再执⾏,因此PendSV优先级最低。
NVIC控制器与中断控制
NVIC 的寄存器以存储器映射的⽅式来访问,除了包含控制寄存器和中断处理的控制逻辑之外, NVIC 还包含了 MPU、 SysTick 定时器以及调试控制相关的寄存器。NVIC 的访问地址是 0xE000_E000。
中断配置基础
每个外部中断都在 NVIC 的下列寄存器中“挂号”:
使能与除能寄存器
悬起与“解悬”寄存器
优先级寄存器
活动状态寄存器
另外,下列寄存器也对中断处理有重⼤影响
异常掩蔽寄存器(PRIMASK, FAULTMASK 以及 BASEPRI)
向量表偏移量寄存器
软件触发中断寄存器
优先级分组位段
中断使能与除能
CM3 中可以有 240 对使能位/除能位,每个中断拥有⼀对。这 240 个对⼦分布在 8 对 32 位寄存器中(最后⼀对没有⽤完)。欲使能⼀个中断,你需要写 1 到对应 SETENA 的位中;欲除能⼀个中断,你需要写 1 到对应的 CLRENA 位中。
地址:SETENAs: xE000_E100 – 0xE000_E11C ; CLRENAs:0xE000E180 - 0xE000_E19C
中断的悬起与解悬
如果中断发⽣时,正在处理同级或⾼优先级异常,或者被掩蔽,则中断不能⽴即得到响应。此时中断被悬起。中断的悬起状态可以通过“中断设置悬起寄存器(SETPEND)”和“中断悬起清除寄存器(CLRPEND)”来读取,还可以写它们来⼿⼯悬起中断。
地址:SETPENDs:0xE000_E200 – 0xE000_E21C ; CLRPENDs:0xE000E280 - 0xE000_E29C
优先级
每个外部中断都有⼀个对应的优先级寄存器,每个寄存器占⽤ 8 bit,但是允许最少只使⽤最⾼ 3 bit。 4 个相临的优先级寄存器拼成⼀个 32位寄存器。如前所述,根据优先级组设置,优先级可以被分为⾼低两个位段,分别是抢占优先级和亚优先级。优先级寄存器都可以按字节访问,当然也可以按半字/字来访问。
地址:中断优先级寄存器阵列 0xE000_E400 – 0xE000_E4EF    系统异常优先级寄存器阵列 0xE000_ED18 - 0xE000_ED23
活动状态
每个外部中断都有⼀个活动状态位。在处理器执⾏了其 ISR 的第⼀条指令后,它的活动位就被置 1,并且直到 ISR 返回时才硬件清零。
地址 ACTIVE 寄存器族 0xE000_E300_0xE000_E31C
PRIMASK 与 FAULTMASK 特殊功能寄存器
PRIMASK ⽤于除能在 NMI 和硬 fault 之外的所有异常,它有效地把当前优先级改为 0;FAULTMASK更绝,它把当前优先级改为‐1,这么⼀来,连硬fault都被掩蔽了。NMI不会被掩蔽。
系统异常中断配置寄存器
各种fault异常的使能是通过系统handler控制及状态寄存器(SHCSR)来实现的。
软件中断
软件中断,能以多种⽅式产⽣。最简单的就是使⽤相应的SETPEND寄存器;⽽更专业更快捷的作法,则是通过使⽤软件触发中断寄存器STIR,如表8.8所⽰。
systick定时器
SysTick定时器被捆绑在NVIC中,⽤于产⽣SYSTICK异常(异常号:15)。⼤多操作系统需要⼀个硬件定时器来产⽣操作系统需要的滴答中断,作为整个系统的时基,提供定时器、任务切换等作⽤。CM3芯⽚内部都带有⼀个定时器,软件在不同CM3器件间移植⼯作得以简化。该定时器的时钟源可以是内部时钟(FCLK,CM3的⾃由时钟)、或者外部时钟(CM3处理器的STCLK信号)。
校准值寄存器提供了这样⼀个解决⽅案:TENMS值为芯⽚产⽣10ms中断的默认值。最简单的作法就是:直接把TENMS的值写⼊重装载寄存器,这样⼀来,就能做到每10ms来⼀次 SysTick异常。如果需要其它的SysTick异常周期,则可以根据TENMS的值加以⽐例计算。
异常的具体⾏为
异常的响应序列
⼊栈->取向量->选择堆栈指针MSP/PSP
⼊栈
响应异常的第⼀个动作就是要保护现场,CM3⾃动的将寄存器放到正确的位置。先把PC与xPSR值保存起来就可以更好的启动服务例程指令的预取和执⾏。根据ARM函数调⽤约定,保护异常时的中间结果R0-R3以及R12。
Cortex-M3 在进⼊异常服务例程时,⾃动压栈了 R0-R3, R12, LR, PSR 和 PC,并且在返回时⾃动弹出它们,这多清爽!既加速了中断的响应,也再不需要汇编语⾔代码了
取向量
在数据总线忙着⼊栈操作时,指令总线在同时从向量表中出正确的异常向量。
更新寄存器
在⼊栈和取向量完毕之后执⾏服务程序之前。会更新SP,PSR、PC、LR等寄存器。
异常返回
异常服务程序执⾏完成之后,需要⼀个正式的返回指令,⽬的是改变PC值。出栈、更新NVIC寄存器。
嵌套的中断
CM3内核和NVIC全⼒⽀持了中断嵌套的功能,。表现在1)⾃动编排异常优先级,相同或者低优先级的异常⽆法抢占,只能阻塞,因此对于SVC⾥⾯再次SVC会发⽣fault错误。2)⾃动⼊栈和出栈。
风险:如果嵌套过深⽽且此时住堆栈所剩⽆⼏使,很容易发⽣堆栈被踩的风险,从⽽导致系统紊乱跑飞。
咬尾中断
当处理器在响应某异常时,如果⼜发⽣其它异常,但它们优先级不够⾼,则被阻塞——这个我们已经知道。那么在当前的异常执⾏返回后,系统处理悬起的异常时,倘若还是先POP然后⼜把POP出来的内容PUSH回去,这不是⽩⽩浪费CPU时间吗。为了改进这种铺张浪费⾏为,引⼊了咬尾中断机制。
晚到的⾼优先级异常
CM3的中断处理还有另⼀个机制,它强调了优先级的作⽤,这就是“晚到的异常处理”。当CM3对某异
常的响应序列还处在早期:⼊栈的阶段,尚未执⾏其服务例程时,如果此时收到了⾼优先级异常的请求,则本次⼊栈就成了为⾼优先级中断所做的⼊栈。可见,它虽然来晚了,却还是因优先级⾼⽽受到偏袒,低优先级的异常为它“⽕中取栗”。
异常的返回值
在进⼊异常服务程序后, LR的值被⾃动更新为特殊的EXC_RETURN,这是⼀个⾼28位全为1的值,只有[3:0]的值有特殊含义,如表9.3所⽰。当异常服务例程把这个值送往PC时,就会启动处理器的中断返回序列。因为LR的值是由CM3⾃动设置的,所以只要没有特殊需求,就不要改动它。
中断延迟
在设计实时系统时,必须对中断延迟进⾏严肃和仔细地估算。在这⾥,中断延迟的定义是:从检测到某中断请求,到执⾏了其服务例程的第⼀条指令时,已经流逝了的时间。在CM3中,若存储器系统够快,且总线系统允许⼊栈与取指同时进⾏,同时该中断可以⽴即响应,则中断延迟是雷打不动的12周期(满⾜硬实时所要求的确定性)。在与时间赛跑的这12个周期⾥,处理器内部⼀直开⾜马⼒,进⾏了⼊栈、取向量、更新寄存器以及服务例程取指的⼀系列操作。但若存储器太慢以⾄于引⼊等待周期,或者还有其它因素,则会引⼊额外的延时。反正CM3内核是决不会拖后腿的。
⼏个特殊情况:
当处理咬尾中断时,省去了堆栈操作,因此切⼊新异常服务例程的耗时可以短⾄6周期。
如果在总线接⼝上还有未完成的(outstanding)数据传送,例如有⼀个带缓冲的写操作未完成,处理器也只能等待此传送完成。这是迫不得以的——只有这样,才能保证在发⽣了总线fault时,其服务例程能够安全地抢占其它程序。隔膜胶水
当多个中断同时请求时,也会发⽣中断延迟,这表现在只有优先级最⾼的得到⽴即响应。
如果中断被掩蔽(也就是俗称的关中,在多任务系统下满地都有),则在掩蔽期间也会附加中断延迟。
异常响应期间的faults
纯碱制烧碱
中断响应的每步骤都可以触发faults。
⼊栈错误:
1. 如果在⼊栈期间引起了总线fault,则本次⼊栈操作将被强⾏中⽌,并且把总线异常悬起或者在允许时⽴即响应。若除能了总线fault,则
此次故障将成为“硬伤”——上访⾄硬fault。
2. 在总线fault被使能的情况下,如果它的优先级⽐正在响应的异常⾼,则抢占之;否则将悬起直到引起fault的异常执⾏完毕。如果⼊栈操
作引起MPU访问违例,则产⽣存储管理fault,并且必须⽴即执⾏MemFault服务例程,否则将⽆条件上访成硬fault。
3. ⼊栈是⾃动完成的,因此不可能产⽣⽤法fault。
出栈错误:
如果在中断返回时的出栈期间引起了总线fault,则本次出栈操作将被强⾏中⽌,并且把总线异常悬起或⽴即响应。若除能了总线fault,则此次故障将成为“硬伤”——上访⾄硬fault。其它情况下,只要总线fault的优先级⽐当前的⾼(也包括⽐当前最深嵌套的优先级⾼),则可以⽴即响应。类似地,如果是因MPU访问违例造成的MemManage fault,且MemManage ault的服务例程必须能⽴即执⾏,否则⽆条件硬fault。
取向量期间:
取向量期间若是在取向量期间发⽣总线fault,则⽐较罕见,这也是最严重的,因此直接上硬fault。
⽆效返回时:
地理位置服务
如果LR中的EXC_RETURN不是合法的值,则引起⽤法fault。如果⽤法fault被除能,也上访成硬fault。
处理器锁定(lockup)
在下列场合会导致锁定
1. 在硬fault服务程序中产⽣fault(双重fault)
2. 在NMI服务程序中缠⾝fault
3. 在复位序列中产⽣总线fault

本文发布于:2024-09-23 05:18:47,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/305256.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:中断   寄存器   地址   系统   向量   悬起   总线   服务例程
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议