深入解析M68HC11中断与复位机制:嵌入式系统实时响应的核心原理与实践
1. 项目概述:深入M68HC11的“应急响应”系统
在嵌入式系统开发,尤其是8位微控制器(MCU)的世界里,中断和复位机制就像是系统的“神经系统”和“心脏起搏器”。它们决定了系统如何响应突发事件,以及在“休克”后如何安全重启。我接触过不少MCU,从早期的8051到后来的ARM Cortex-M系列,但M68HC11的中断与复位设计,尤其是其非屏蔽中断(XIRQ)的巧妙处理,至今仍让我觉得是理解底层硬件中断机制的绝佳范本。很多新手工程师在配置中断时,往往只关注如何“打开”中断开关,却对中断如何被响应、优先级如何仲裁、现场如何保存与恢复一知半解,这就像只学会了开车门,却不知道发动机和变速箱如何协同工作一样,一旦遇到复杂或紧急情况,系统就容易“趴窝”。
M68HC11作为一款经典的8位微控制器,其复位与中断机制的设计逻辑清晰、层次分明,是学习嵌入式实时系统原理的活教材。本文将带你深入M68HC11的复位序列、中断处理全流程、优先级解析逻辑以及独特的非屏蔽中断机制。我会结合手册中的原理图,拆解每一个硬件动作背后的意图,并分享在实际项目中配置和使用这些功能时容易踩的“坑”和必须注意的细节。无论你是正在学习MCU原理的学生,还是需要维护或移植老旧M68HC11代码的工程师,理解这些底层机制都将让你在调试和设计时更加得心应手。
2. 复位机制全解析:系统如何“从零开始”
复位是微控制器一切行为的起点。它不仅仅是将程序计数器(PC)指向初始地址那么简单,而是一个系统性的硬件初始化过程。M68HC11的复位源多样,理解每种复位的触发条件和后续行为,是构建稳定系统的基石。
2.1 复位源分类与硬件行为
M68HC11的复位主要分为内部复位和外部复位两大类。内部复位又包括上电复位(POR)、时钟监控失效复位和计算机正常操作监视器(COP)超时复位。
上电复位(POR)是最彻底的复位。当电源电压VDD从0开始上升,达到某个阈值(具体值取决于型号)时,内部POR电路会产生一个复位脉冲。这个脉冲会初始化几乎所有的内部寄存器和状态机。手册中提到的典型外部复位电路(Figure 5-1)里,那个MC34064(或其兼容型号)就是一个低电压抑制(LVI)器件,它的核心作用就是在VDD未达到稳定工作电压前,强行将RESET引脚拉低,确保MCU不会在电压不足的情况下执行不稳定的操作。这是绝大多数M68HC11系统必须的外部电路,缺少它,系统在上电过程中极易跑飞。
时钟监控失效复位则是一个“安全网”。当使能了时钟监控(通过设置OPTION寄存器中的CME位)后,如果内部时钟停止超过一定时间(例如,在STOP模式下,或外部晶体故障),时钟监控电路会触发复位。这里有个关键细节:时钟监控复位是一个异步事件,它发生在时钟停止时;而复位序列本身是一个需要时钟驱动的操作。因此,当时钟监控触发复位后,内部逻辑会主动驱动RESET引脚为低电平,试图“唤醒”系统。如果这个低电平成功让时钟恢复(例如,纠正了时钟源的问题),系统就能像COP复位一样恢复。但如果时钟无法恢复,RESET引脚将被持续拉低,系统将“锁死”在复位状态。实操心得:在低功耗设计中频繁使用STOP模式时,务必谨慎评估时钟监控的使能时机。通常,在进入STOP前禁用时钟监控(CME=0),退出STOP并确认时钟稳定后,再重新使能,可以避免意外的复位。
COP看门狗复位是防止软件跑飞的经典手段。COP是一个需要软件定期“喂狗”的定时器,如果超时未被清零,则触发复位。它的优先级低于时钟监控复位。
外部复位通过RESET引脚的低电平触发。手册详细描述了一个精妙的硬件交互过程:当检测到RESET引脚为低时,MCU内部会打开一个N沟道器件,主动将RESET引脚再拉低大约4个E时钟周期。在典型系统中,外部复位源(如手动复位按钮或监控芯片)会持续拉低RESET引脚更长时间。内部驱动释放引脚两个E周期后,MCU会采样RESET引脚电平。如果此时仍为低,则判定为外部复位;如果为高,则可能归因于COP或时钟监控复位。这里有个隐藏的坑:如果RESET引脚线路上的电容过大,导致内部驱动关闭后引脚电压上升太慢(超过两个E周期仍为低),MCU将无法区分复位源,一律按外部复位处理。在设计复位电路时,RC时间常数需要仔细计算,确保既能提供足够的复位脉冲宽度,又能让电压在要求时间内快速上升。
2.2 复位序列与初始化过程
无论复位源是什么,最终的复位序列是相似的,但使用的复位向量不同,这决定了程序从何处开始执行。
- 寄存器初始化:所有内部寄存器(包括I/O端口、定时器、串口等外设的控制寄存器)被设置为已知的默认状态。特别注意:堆栈指针(SP)的初始值是未定义的(通常来自I/O寄存器映射区的$00FF),这意味着在软件初始化SP之前,绝对不能允许任何中断或子程序调用发生,否则会向随机内存地址写数据,导致灾难性后果。
- 获取复位向量:CPU从特定的内存地址读取复位向量。不同复位源对应不同向量地址:
- 时钟监控失效:$FFFC-$FFFD
- COP超时:$FFFA-$FFFB
- 外部/上电复位:$FFFE-$FFFF
- 非法操作码:$FFFA-$FFFB(与COP共享,但触发条件不同)
- 软件中断(SWI):$FFF6-$FFF7
- XIRQ:$FFF4-$FFF5
- 标准中断(IRQ):$FFF2-$FFF3
- 其他外设中断:各有其向量地址(如定时器溢出在$FFDE-$FFDF)。
- 开始执行:将复位向量地址加载到程序计数器(PC),CPU开始从该地址取指执行。通常,这里放置的是一条跳转(JMP)指令,指向主初始化代码(C语言中的
main()或汇编中的START)。
一个关键的设计考量:为什么不同复位源要用不同向量?这为系统诊断和恢复提供了可能。例如,如果系统因COP超时复位,你可以让程序跳转到一个特殊的恢复例程,记录错误日志或进行特定的硬件检查,而不是简单地从头开始。这比所有复位都跳转到同一个起点要强大得多。
3. 中断处理流程:CPU的“上下文切换”
中断机制的本质是硬件的上下文保存与恢复。理解这个过程,对于编写高效、可靠的中断服务程序(ISR)至关重要。M68HC11的中断处理流程非常经典,可以分为识别、响应、服务和返回四个阶段。
3.1 中断的识别与响应时机
一个中断请求要得到CPU的响应,必须满足两个条件:全局使能和局部使能。全局使能由条件码寄存器(CCR)中的I位(对于可屏蔽中断)和X位(对于XIRQ)控制。局部使能则由各个外设模块控制寄存器中的特定中断使能位决定,例如定时器的TIE(定时器中断使能)、串口的RIE(接收中断使能)等。
当中断条件满足(标志位置1且使能位打开),CPU并不会立即中断当前指令。它必须等待当前正在执行的指令完成。这是中断响应延迟的主要来源之一。手册特别指出,大多数指令是2-4个周期,但乘法和除法指令(MUL, IDIV, FDIV)分别需要10和41个周期。这意味着,如果你的中断服务要求极高的实时性,应避免在可能被中断的代码路径中使用长周期指令,或者考虑在进入关键段时临时关闭中断。
注意:这里常有一个误解,认为中断可以打断任何指令。实际上,CPU的流水线或执行单元必须完成当前指令的原子操作。对于M68HC11这类经典架构,指令执行是不可分割的。
3.2 现场保存与向量获取
一旦当前指令执行完毕,且中断被允许响应,硬件自动执行以下序列,这个过程对程序员是透明的,但必须深刻理解:
- 保存现场:将当前CPU所有寄存器的值压入堆栈。压栈顺序是固定的:PCL, PCH, IYL, IYH, IXL, IXH, ACCA, ACCB, CCR。一共9个字节。这个顺序与软件中断(SWI)指令的压栈顺序一致。为什么是这个顺序?这由硬件数据通路和微码控制决定,对软件来说,只需知道RTI指令会以相反顺序弹出,正确恢复现场即可。
- 设置中断屏蔽位:在CCR值入栈后,硬件会自动将CCR中的I位(如果是XIRQ,则连同X位)置1。这一步至关重要,它防止了中断服务程序自身被同类型或更低优先级的中断嵌套,除非你主动允许。
- 优先级解析与向量获取:CPU检查所有已发生且被使能的中断请求,根据固定的硬件优先级(或HPRIO寄存器设置的动态最高优先级),选出优先级最高的那个。然后,从该中断源对应的向量地址(见上一节的列表)中取出16位地址,加载到程序计数器(PC)中。
这里有一个非常精妙且容易忽略的细节:手册提到,优先级解析发生在寄存器压栈之后。这意味着,从决定响应中断到实际获取向量之间,有几个周期的延迟。在这几个周期内,如果一个更高优先级的中断恰好发生,它将被优先服务!这会导致一个现象:最终执行的中断服务程序,可能不是最初触发中断序列的那个源。这在设计高实时性系统时需要纳入考量,它可能导致某个中断的响应时间比理论计算值更短(如果被更高优先级插队),也可能让中断服务程序的执行顺序出现意料之外的变化。
3.3 中断服务程序与返回
CPU跳转到中断向量指向的地址,开始执行中断服务程序。一个规范的ISR应该做以下几件事:
- 保护现场(如果需要):虽然硬件已经保存了核心寄存器,但如果ISR中会用到其他内存或I/O状态,可能需要手动保存。
- 清除中断标志:这是最关键的步骤,也是最常见的错误来源!必须读取或写入相关的外设状态寄存器,以清除触发本次中断的标志位(例如,定时器的
TOF,串口的RDRF)。如果忘记清除,中断服务程序一返回,该中断标志依然有效,会立即再次触发中断,导致CPU陷入无限循环,看起来就像“死机”。 - 执行实际任务:处理数据、控制硬件等。原则是:快进快出。ISR中只做最必要、最紧急的处理,将非紧急任务通过设置标志位等方式,留给主循环处理。
- 恢复现场与返回:最后执行
RTI指令。RTI会从堆栈中依次弹出CCR、ACCB、ACCA、IXH、IXL、IYH、IYL、PCH、PCL,恢复到中断发生前的状态,并从中断点继续执行。
常见错误实录:
- 错误:在ISR开头写
SEI(关中断),结尾写CLI(开中断)。 - 分析:这是画蛇添足。硬件在中断响应时已经自动设置了I位,
RTI执行时会从堆栈恢复原来的CCR值(通常I位是0,即开启状态)。手动添加SEI和CLI不仅多余,还可能破坏嵌套中断的设计(如果你原本想允许嵌套)。 - 正确做法:除非有特殊需求(如允许嵌套),否则不要在ISR中操作I位。将
CLI放在ISR中是危险的,可能导致中断重入。
4. 非屏蔽中断的智慧:XIRQ机制深度剖析
非屏蔽中断(NMI)在传统MCU中是个“霸道”的角色,一旦发生,CPU必须立即响应。但M68HC11的XIRQ设计,在保留非屏蔽中断核心能力的同时,巧妙地解决了两个历史难题。
4.1 传统NMI的两大难题与XIRQ的解决方案
难题一:复位后堆栈指针未初始化时的NMI请求。如果NMI在SP还未被软件设置为有效RAM地址前发生,压栈操作会将寄存器值写入随机地址,可能覆盖关键数据或访问非法区域,导致无法返回或系统崩溃。传统解决方案是要求外部电路在复位后一段时间内禁止NMI,增加了硬件复杂性。
M68HC11的解决方案:引入CCR中的X位。任何复位后,X位被硬件置1,从而屏蔽XIRQ。软件在完成必要的初始化(特别是设置好堆栈指针SP)后,通过TAP或RTI指令(从堆栈恢复的CCR值中X=0)有且仅有这两种方式可以将X位清零,从而启用XIRQ。这样,软件完全掌控了XIRQ的启用时机,完美避开了初始化期间的险境。
难题二:NMI信号抖动或嵌套导致堆栈溢出。如果NMI引脚上的信号不稳定,或在处理一个NMI时另一个NMI又来了,会导致多次压栈,可能迅速耗尽有限的堆栈空间。
M68HC11的解决方案:在响应XIRQ时,硬件在压栈后自动将X位置1。这意味着,一旦开始处理一个XIRQ,新的XIRQ请求会被暂时屏蔽,直到当前ISR执行完毕,通过RTI指令从堆栈恢复出X=0的旧CCR值,XIRQ才重新被允许。这本质上实现了对XIRQ的“一次性”屏蔽,防止了嵌套,保护了堆栈。
4.2 XIRQ的特殊行为与应用场景
XIRQ的优先级高于所有由I位控制的可屏蔽中断。它的向量地址是固定的$FFF4-$FFF5。它最常见的应用场景是处理不可恢复的严重系统错误,例如:
- 电源故障检测:通过电压监控电路连接到XIRQ引脚,在电压跌落到临界值前,XIRQ触发,ISR有最后的机会将关键数据保存到非易失性存储器(如EEPROM)或设置安全状态。
- 硬件看门狗超时:一些外部看门狗芯片的输出可以连接到XIRQ,作为COP的补充或更高级别的保护。
- 关键安全事件:如紧急停止按钮。
一个关于STOP模式的巧妙用法:M68HC11的STOP模式会停止所有时钟以极致省电。唤醒方式可以是复位或中断(IRQ/XIRQ)。手册提到,如果X位为1(XIRQ被屏蔽),XIRQ引脚的电平变化仍能唤醒MCU,但唤醒后不会进入XIRQ中断服务程序,而是直接继续执行STOP指令之后的代码。这可以被看作一种“STOP-继续”机制,为低功耗设计提供了灵活性。你可以用XIRQ引脚作为一个纯粹的唤醒源,而不必处理中断上下文。
一个必须注意的硬件缺陷与规避方法:手册披露,部分早期M68HC11存在一个与STOP模式恢复相关的缺陷。如果紧邻STOP指令之前的指令来自操作码映射表的第4或第5列(主要是累加器操作指令,如NEGA,DECB),则从中断(IRQ或XIRQ)唤醒时可能恢复不正确。解决方案极其简单且通用:在STOP指令前加一条NOP(空操作)指令。这是一个值得牢记的实践技巧,无论你的芯片是否有此缺陷,加上NOP都能确保唤醒行为的确定性。
5. 中断优先级与动态配置实战
M68HC11拥有丰富的中断源,如何管理它们的响应顺序,是确保系统实时性的关键。其优先级系统分为固定优先级和可编程的最高优先级两部分。
5.1 固定硬件优先级
中断源有一个内在的、固定的硬件优先级顺序,从高到低大致为:
- 复位(最高)
- 时钟监控失效
- COP超时 / 非法操作码
- XIRQ(非屏蔽中断)
- 软件中断(SWI)
- 可屏蔽中断(IRQ及各种外设中断)
对于数量众多的可屏蔽中断(如定时器输入捕捉、输出比较、串口等),它们之间也有固定的优先级关系,详细列表见手册的Table 5-4及Figure 5-4的流程图。这个固定优先级是硬件仲裁的基础。
5.2 可编程最高优先级中断(HPRIO)
这是M68HC11中断系统的一个亮点。通过HPRIO寄存器(地址$103C)的低4位PSEL3-PSEL0,软件可以将任何一个由I位控制的可屏蔽中断源,动态提升到所有可屏蔽中断中的最高优先级位置。
操作流程与注意事项:
- 写前屏蔽:在修改HPRIO寄存器之前,必须确保CCR中的I位为1(即全局关闭可屏蔽中断)。这是为了防止在修改优先级的过程中发生中断,导致系统状态混乱。通常使用
SEI指令。 - 设置PSEL值:根据手册Table 5-4,写入对应的4位编码。例如,将
PSEL3-PSEL0设置为0110(二进制),即可将外部IRQ引脚中断提升为最高优先级可屏蔽中断。 - 重新使能:完成设置后,再用
CLI指令打开全局中断。
应用场景:假设你的系统有一个高速ADC通过定时器输出比较触发采样,同时有一个低速串口接收数据。通常定时器中断优先级高于串口。但在某个关键阶段,你需要确保串口数据不丢失,就可以临时将串口中断(SCI)的优先级提升到最高。阶段结束后,再恢复默认优先级。这为软件提供了灵活的实时性调整手段。
重要限制:
- HPRIO寄存器的高4位(
RBOOT,SMOD,MDA,IRV)与模式配置相关,通常只在特殊模式下才能写入,普通应用无需关心。 - 被提升的中断源仍然受其本地使能位和全局I位的控制。提升优先级并不会自动使能它。
- 非屏蔽中断(XIRQ)和软件中断(SWI)的优先级永远高于任何可屏蔽中断,不受HPRIO影响。
5.3 软件中断与非法操作码陷阱
软件中断(SWI)是一条特殊的指令(操作码$3F)。它的行为类似硬件中断:压栈所有寄存器、设置I位、跳转到固定向量($FFF6-$FFF7)。但它是由程序流中的指令触发的,而非异步事件。SWI的优先级很高,一旦其操作码被取出,在当前SWI指令完成前(即向量被取出前),不会响应其他中断。SWI广泛用于调试监控程序中实现断点。调试器将用户程序中的某条指令替换为SWI操作码,当执行到这里,CPU就跳转到监控程序,调试器可以检查内存、寄存器等状态。
非法操作码中断是另一个强大的安全机制。当CPU取指到一个未定义的操作码时,会触发此中断,向量地址为$FFFA-$FFFB(与COP复位共享,但由不同逻辑触发)。这个机制可以:
- 增强系统健壮性:防止程序跑飞后执行随机数据造成的不可预知行为,而是进入一个可控的异常处理程序。
- 实现软件扩展:聪明的开发者可以利用未定义的操作码,作为“软件陷阱”或自定义指令的入口。非法操作码ISR可以检查被保存的PC值(即非法指令的地址),根据该地址的数据(即非法操作码本身)执行特定的扩展功能。需要注意的是,此时堆栈中保存的返回地址指向非法操作码本身,而非其下一条指令,因此ISR在返回前需要手动修改堆栈中的返回地址,跳过这个非法字节。
6. 中断编程实战与深度避坑指南
理解了原理,最终要落到代码上。下面结合汇编语言示例(因为C编译器会处理大部分底层细节,但了解汇编有助于深度调试),展示关键操作,并汇总那些手册里可能没明说,但实践中血泪换来的经验。
6.1 中断服务程序编写模板
一个稳健的M68HC11中断服务程序(以定时器溢出中断为例)的汇编框架如下:
; 中断向量表定义(通常放在ROM末尾) ORG $FFDE ; 定时器溢出中断向量地址 FDB TOF_ISR ; 指向中断服务程序入口 ORG $C000 ; 代码起始地址 ; 主程序初始化 START: LDS #$00FF ; 初始化堆栈指针,这是第一步! CLI ; 全局开启可屏蔽中断 ... ; 其他外设初始化,包括使能定时器溢出中断(设置TMSK2中的TOI位) ; 定时器溢出中断服务程序 TOF_ISR: ; 1. 自动压栈(硬件完成) ; 2. 清除中断标志!这是必须的。 LDAA TFLG2 ; 读TFLG2寄存器 ORAA #$80 ; 将TOF位(第7位)置1以清除它 STAA TFLG2 ; 写回,清除标志 ; 3. 执行实际任务 ... ; 你的处理代码 ; 4. 恢复现场并返回 RTI ; 自动弹栈并返回在C语言中(如HiWare或ImageCraft ICC编译器),通常通过#pragma或interrupt关键字声明ISR,编译器会自动生成压栈/弹栈和RTI指令框架,但你仍需在ISR内手动清除中断标志。
6.2 十大常见问题与排查技巧实录
问题:中断根本不触发。
- 检查1:全局中断是否开启?确认主初始化中执行了
CLI指令(汇编)或__enable_interrupt()(C语言)。 - 检查2:特定中断的局部使能位是否打开?查阅数据手册,找到对应外设的控制寄存器(如定时器的
TMSK2,串口的SCCR),确认相应中断使能位已置1。 - 检查3:中断标志是否已置位?外设事件发生后,状态寄存器中的标志位(如
TOF,RDRF)必须先置1,中断才能产生。确保你的硬件或软件操作能正确触发该标志。 - 检查4:中断向量地址是否正确?确认链接器脚本或代码中,中断服务程序的入口地址被正确放置在对应的向量地址。一个错误是向量地址填成了代码地址,而不是跳转指令的地址。
- 检查1:全局中断是否开启?确认主初始化中执行了
问题:中断只触发一次,之后不再触发。
- 几乎可以断定:中断标志未清除。在ISR中,必须通过读后写1(对于写1清零的标志)或直接写0(对于写0清零的标志)的方式清除中断标志位。忘记这一步,中断标志一直为1,但中断逻辑认为该中断已被响应,不会再产生新的中断请求。
问题:程序一开中断就跑飞或复位。
- 首要怀疑:堆栈指针(SP)未初始化或初始化错误。中断响应第一件事就是压栈,如果SP指向非法地址(如ROM区、未初始化的RAM区),写操作会导致总线错误或数据破坏。确保在
CLI之前,LDS指令将SP设置为有效的RAM区域顶端(例如LDS #$00FF,假设RAM在$0000-$00FF)。
- 首要怀疑:堆栈指针(SP)未初始化或初始化错误。中断响应第一件事就是压栈,如果SP指向非法地址(如ROM区、未初始化的RAM区),写操作会导致总线错误或数据破坏。确保在
问题:中断响应时间不稳定,时快时慢。
- 分析中断延迟:延迟包括:1) 当前指令执行完的剩余周期(最坏情况是41周期的FDIV);2) 中断响应序列的固定周期(约12个周期);3) 可能存在的更高优先级中断插队时间。优化方法:避免在中断可能发生的路径中使用长周期指令;优化ISR本身代码,减少执行时间;合理分配优先级。
问题:使用XIRQ时,系统在初始化阶段就意外进入XIRQ中断。
- 原因:XIRQ引脚可能受到噪声干扰,在上电过程中产生低电平毛刺。解决方案:在初始化代码中,尽早配置XIRQ引脚为上拉输入(如果MCU支持),并在执行
TAP指令清零X位使能XIRQ之前,加入一段短暂的延时(几十毫秒),等待电源和信号稳定。同时,确保硬件上XIRQ引脚有上拉电阻,避免悬空。
- 原因:XIRQ引脚可能受到噪声干扰,在上电过程中产生低电平毛刺。解决方案:在初始化代码中,尽早配置XIRQ引脚为上拉输入(如果MCU支持),并在执行
问题:中断嵌套导致系统崩溃。
- 默认情况:M68HC11硬件在进入任何ISR时会自动置位I位(对于XIRQ还会置位X位),默认禁止了嵌套。
- 如果需要嵌套:必须在ISR中手动清除I位(
CLI),但务必���此之前先清除本中断源的中断标志或禁用其本地中断使能。否则,清除I位后,同一个未处理的中断标志会立即再次请求中断,导致无限递归,堆栈溢出。
问题:从STOP模式唤醒后行为异常。
- 应用补丁:无论你的芯片批次如何,养成习惯,在
STOP指令前加一条NOP指令。这是规避已知硬件缺陷最保险的做法。 - 检查唤醒源配置:确认唤醒中断(IRQ/XIRQ)的触发方式(边沿/电平)与硬件信号匹配,并且相关引脚配置正确。
- 应用补丁:无论你的芯片批次如何,养成习惯,在
问题:修改HPRIO寄存器后系统不稳定。
- 严格遵守流程:必须在关中断(
SEI)的情况下修改HPRIO,修改完毕后再开中断(CLI)。在中断服务程序内修改HPRIO是极度危险的操作。
- 严格遵守流程:必须在关中断(
问题:调试时,单步执行无法进入中断。
- 仿真器/调试器特性:许多调试器在单步模式下会自动禁用中断。需要查阅调试工具文档,确认其行为。有时需要设置断点在ISR入口,然后全速运行来调试中断。
问题:中断处理中调用了不可重入函数或使用了共享资源,导致数据损坏。
- 这是软件设计问题。ISR和主循环(或其他ISR)如果访问共同的全局变量、缓冲区或硬件寄存器,必须进行保护。对于M68HC11,最常用的方法是:
- 关中断保护:在主循环访问共享资源前关中断(
SEI),访问完后立即开中断(CLI)。这会增加中断延迟,需谨慎。 - 原子操作:对于单字节的共享变量,8位读写通常是原子的,但多字节数据(如16位计数器)就需要更精细的保护。
- 标志位通信:ISR只设置标志位,主循环轮询并处理,这是最清晰安全的方式。
- 关中断保护:在主循环访问共享资源前关中断(
- 这是软件设计问题。ISR和主循环(或其他ISR)如果访问共同的全局变量、缓冲区或硬件寄存器,必须进行保护。对于M68HC11,最常用的方法是:
中断是MCU的灵魂,也是最考验开发者功力的地方。理解M68HC11这套机制,不仅是为了用好这块老芯片,更是为了掌握嵌入式实时系统最核心的思想。它没有现代Cortex-M系列NVIC那么复杂的功能,但正因如此,其原理更加赤裸和直接。每一次中断的响应,都是一次精确的硬件上下文切换舞蹈,而你的代码,就是编舞者。
