C51、STM32和S3C2440中断体系的比较

/*
名称:C51、STM32和S3C2440中断体系的比较
说明:对于这三个芯片的中断体系来说,就我目前了解的, 我说:差不多。这里说的差不多,是中断的本质上差不多,都是首先中断源提出申请(比如触发了外部中断,定时器中断等),然后经过中断源屏蔽寄存器,再然后中断优先级的比较,最后CPU相应中断。(我去,这好像又回到了计算机组成原理啊)。

不同的是细节,C51作为低级一点的芯片,其中断少,中断能达到的功能也少,相对来说较为简单些(无论是设计还是具体使用)。而STM32和S3C2440来说,其提供的功能较多,设计起来和使用起来要复杂的多(使用的时候得配置好多好多寄存器)。

目前总结的,差不多就是这些吧。

*/

补充:(以下内容并没有经过仔细研究,如有错误,还请指正)

1、关于CPU的工作模式:

  对于C51来说,其并没有什么CPU工作模式之说,顶多算它有两个状态,一个是普通状态;一个是中断状态。这两个状态也并没有什么独有的寄存器或者硬件使用的限制,一切资源皆共享。
  对于2440来说(准确的说是ARM9,基于ARMv4T),其CPU有7中工作模式,当发生异常时候,CPU会进入不同的模式进行异常处理。每种模式有其共有的寄存器r0-r12,PC,(r8-r12快速中断独有),也有其私有的寄存器r13,r14和spsr。在不同的模式下使用该模式的寄存器。同时,7种模式中用户模式为普通模式,其他6种模式为特权模式。从特权模式可以转移其他任何模式,但从普通模式只能通过陷入中断的方式,例如SWI软中断的方式进入其他特权模式。
  对于STM32来说(准确的说是CortexM3,基于ARMv7),其取消了先前ARM版本众多的异常模式,对应的Cortex-M3支持两个模式(Handle异常模式和普通线程模式)和两个等级(特权等级和用户等级),通过这种机制来实现在普通线程模式下对系统资源访问的限制。虽然不太清楚为何ARMv7版本把ARMv4T中的异常模式统一成Handle异常模式和特权等级的这张机制,不过我确实觉得设置7中模式,略显有些多了。

2、关于中断控制器:

  C51的中断使用的是位于内核之外的中断系统(其实我也不太清楚到底C51的中断时位于内核之外还是内核里的);S3C2440使用的是ARM7内核之外的中断控制器;STM32使用的是新增加的内核里NVIC控制器,它添加的更多的功能,也在一定程度上提高了性能。

3、关于中断类型:

  C51中只支持外部中断、定时器中断和串口中断;S3C2440和STM32还支持更高级的中断,如ADC中断、DMA中断等。(但他们之中只要是和外界有联系的中断(用到IO口的)大都采用的是复用端口的机制。)

4、关于中断优先级:

  对于C51来说,其中断优先级可以通过IP寄存器进行配置;对于S3C2440来说,它的优先级是通过7个仲裁器来决定的,虽然也可以通过PRIORITY寄存器进行配置,但是相对的配置幅度就小了很多。(比如EINT0的优先级无论怎么配置都是在IRQ里最高的)。对于Cortex-M3配置来说,其提供的选项就多了。除了一些异常固定了优先级之外,大都数外部中断的优先级都是可以配置的。同时NVIC的优先级还分为抢占优先级和子优先级。

5、关于外部中断分组:

  C51一般含有2-3个外部中断,这些中断都已经被固定了端口(如INT0由P3.2引入)。S3C2440的外部中断也被固定了端口。(如GPF7是EINT7的引脚)。而对于STM32来说,其外部中断采用中断线的机制,可通过软件设置EXTI的端口引脚。(如:EXTI0可以由Px0充当,x = A,B,C…H,I)

6、关于中断屏蔽:

  一般来说,对于中断屏蔽都有好几级。首先是外设控制器中的中断屏蔽(相当于分开关),然后CPU内核的中断屏蔽(相当于总开关。只有通过这几道开关,才有可能进入Pending的状态。
  C51中在IE寄存器中设置全局中断屏蔽和部分外设中断屏蔽。
  S3C2440中在状态寄存中设置IRQ中断允许,然后在中断控制器中设置INTMSK(有的子中断源屏蔽)。
  STM32在外部中断控制器EXTI中设置中断屏蔽,然后在NVIC中设置屏蔽,在NVIC提供了更牛的屏蔽手段,包括PRIMASK, FAULTMASK 和 BASEPRI屏蔽寄存器组(PRIMASK可以设置关掉所有可屏蔽的异常,只剩下 NMI 和硬 fault 可以响应FAULTMASK当它置 1 时,只有 NMI 才能响应,所有其它的异常,甚至是硬 fault,也通通闭嘴。BASEPRI它定义了被屏蔽优先级的阈值。当它被设成某个值后,所有优先级号大于等于此值的中断都被关(优先级号越大,优先级越低)。和ISER(ISER应该是在NVIC中屏蔽响应的外设请求)。

7、中断执行的流程:

  无论是C51还是S3C2440,又或是STM32其中断的处理流程大同小异。
大同主要是:保护现场->中断服务程序->恢复现场->中断返回。
小异主要有:
  a、保护的现场略有不同:其中C51主要保存返回的地址(硬件自动完成),通用寄存器和程序状态寄存器需要由用户自己保存;S3C2440中硬件系统帮助用户保存程序状态寄存器(保存在备份的SPSR中)和返回的地址,一些通用的寄存器组需要用户自己保存;STM32中,发生中断时系统会依次把xPSR, PC, LR, R12以及R3-R0由硬件自动压入适当的堆栈中。
  b、对于进入中断服务程序:
    C51采用的是固定的中断向量地址,由于C51支持的中断数目较少,所以可以为每个中断提供一个固定的中断向量的入口地址;
    而对于S3C2440来说,其提供了0x00-0x1c总共7中的中断向量地址(有一个地址保留),但是S3C2440能提供的中断数量远远不止这些,所以有些中断就共用一个中断地址(这种情况主要还是针对于IRQ外部中断),所以他们进入中断之后需要用软件的方式判断是哪个中断,再执行其对应的中断服务需求。(有的人把这种方式称作非向量中断。)
    对于STM32,或者是Cortex来说,其与上面有两个不同,第一上面的两个CPU类型向量表都是固定的,对于Cortex来说,其向量表是可以不固定的。(NVIC中有一个重定位寄存器)。第二,Cortex-M3支持大量异常,包括11个系统异常和240个外部中断,这些异常和中断都配有自己的中断向量地址。
   c、对于恢复现场:C51和S3C2440需要手动恢复寄存器的值。STM32可以由硬件自动恢复。(这里要注意的是,STM32自动保护现场和恢复现场中涉及到的寄存器都只是一部分,也就是说如果用户使用到的寄存器超过这一部分,那还需要用户手动保存和恢复)。
  d、中断返回:C51使用RETI指令启动返回,即控制PC返回到原来中断的敌方。S3C2440需要由用户手动返回(将中断前的下一条指令地址赋给PC),Cortex-M3
通过EXC_RETURN启动中断返回序列,由硬件控制PC返回原来的敌方。
(注:不同的CPU对回复现场和中断返回的顺序执行是不同的。如C51需要先回复现场在执行RETI指令。而Cortex-M3则先将EXC_RETURN值赋给PC,再有硬件系统恢复现场。)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值