ARM的异常中断和处理过程

发布者:清新时光最新更新时间:2017-02-06 来源: eefocus关键字:ARM  异常中断  处理过程 手机看文章 扫描二维码
随时随地手机看文章

0. ARM异常中断的种类

ARM支持7种异常中断,其中包括复位、未定义指令异常、软中断异常、预取指令中止、数据中止、IRQ、FIQ。

0.1 复位(RESET)(优先级=1)
      当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行。复位异常中断通常用在下面几种情况:系统加电时;系统复位时;跳转到复位中断向量处执行成为软复位。

0.2  未定义指令(优先级=6)
      当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断,可以通过改异常中断机制仿真浮点向量运算。

0.3  软中断(优先级=6)
      这是一个由用户定义的中断指令。用于用户模式下的程序调用特权操作指令。在实时操作系统中可以通过该机制实现系统功能调用。

0.4  预取指令终止(Prefech Abort)(优先级=5)
      如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当被预取的指令执行时,处理器产生指令预取终止异常中断。

0.5  数据终止(Data Abort)(优先级=2)
      如果数据访问指令的目标地址不存在,,或者该地址不允许当前指令访问,处理器产生数据访问终止异常中断。

0.6   IRQ(优先级=4)
      当处理器的外部中断请求引脚有效,而且CPSR的寄存器的I控制位被**时,处理器产生外部中断请求异常中断。系统中个外设通过该异常中断请求处理服务。

0.7 FIQ(优先级=3)
      当处理器的外部快速中断请求引脚有效,而且CPSR的F控制位被**时,处理器产生外部中断请求异常中断。

0.8  异常中断向量表及异常中断优先级
    中断向量表7个异常中断所在的工作模式和存放地址,见下表。每个异常中断的地址存放了一个跳转指令或者一个向PC寄存器中赋值的数据访问指令。通过这两种指令,程序将跳转到相应的异常中断处理程序处执行。当几个异常中断同时发生时,就必须按照一定的次序来处理这些异常中断,下面继续分析。

       ARM的异常处理机制,异常是每一种处理器都必须考虑的问题之一,关键在于如何让处理,返回地址在什么位置都是需要考虑的。一般异常发生后,CPU都会进行一系列的操作,这些操作有一部分是CPU自动完成,有一部分是需要我们程序员完成,在此逐一的分析。

1.CPU自动完成的操作

       首先说明CPU会自动完成的部分,用ARM结构手册中的代码描述如下:

R14_ = return link                //这个可以参看寄存器的说明,两个作用

SPSR_< exception_mode > = CPSR

CPSR[4:0] = exception mode number

CPSR[5] = 0 ;                              //ARM指令

If ==Reset or Fiq then   

CPSR[6] = 1 ;                              //只有在复位和FIQ模式下才会关闭FIQ中断

CPSR[7] = 1 ;                             //任何异常模式下都会关闭IRQ中断

PC = exception vector address

       从上面的代码中我们可以发现CPU自动处理的过程包括如下:

1)  拷贝CPSR到SPSR_

2)  设置适当的CPSR位: 改变处理器状态进入ARM状态;改变处理器模式进入相应的异常模式;设置中断禁止位禁止相应中断。

3)  更新LR_,这个寄存器中保存的是异常返回时的链接地址

4)  设置PC到相应的异常向量

     以上的操作都是CPU自动完成,然后CPU跳转到程序员定义的异常处理程序(函数),处理完成后返回之前的工作模式,此时的异常返回地址是需要我们留意的地方。

2.异常返回地址问题

      不同的异常模式返回地址存在差异,这主要是因为各种异常的产生机理存在差别。这样我们需要在进入异常处理函数之前或者异常返回前调整返回地址,一般采用进入异常处理函数前进行手动调整。下面给出了每一种异常时链接寄存器R14保存的值,根据R14的值就可以知道怎样实现地址的返回,其中也包含了CPU自动处理的部分。

2.1 复位异常:

可以看出该模式下的先对来说返回地址也比较简单,不需要做太多的描述。

2.2 未定义的指令异常:

返回的方式也比较简单:

       MOVS  PC, R14

2.3软中断异常:

返回的方式也比较简单:

       MOVS  PC, R14

2.4 预取指令中止异常:

返回需要做下面的调整:

SUBS      PC, R14, #4

2.5 数据中止

返回地址需要做下面的调整:

如果需要重新访问数据则:SUBS      PC, R14, #8

如果不需要重新访问数据则:SUBS      PC, R14, #4

2.6 IRQ中断的处理过程:

返回地址需要做下面的调整:       SUBS PC,R14,#4

2.7 FIQ中断:

返回地址需要做下面的调整:       SUBS  PC, R14 ,#4

       从上面的代码可以知道,对于每一种异常,保存的返回地址都是不一样的,一般都需要我们手动的跳转,当然调整的时机也需要我们选择,是在进入处理前跳转还是返回时调整都是需要程序员控制。

3.异常返回地址的再次说明

       在ARM Developer Suite Developer Guide中对ARM处理器的异常处理操作提供能更加详细的解释,每一种异常下的处理方式如下文描述:异常返回时另一个非常重要的问题是返回地址的确定,在前面曾提到进入异常时处理器会有一个保存LR 的动作,但是该保存值并不一定是正确的返回地址,下面以一个简单的指令执行流水状态图来对此加以说明。

       我们知道在ARM 架构里,PC值指向当前执行指令的地址加8处,也就是说, 当执行指令A(地址0x8000)时,PC 等于指令C 的地址(0x8008)。假如指令A 是“BL”指令,则当执行该指令时,会把PC(=0x8008)保存到LR 寄存器里面,但是接下去处理器会马上对LR 进行一个自动的调整动作:LR=LR-0x4。这样,最终保存在 LR 里面的是 B 指令的地址,所以当从 BL 返回时,LR 里面正好是正确的返回地址。同样的调整机制在所有LR自动保存操作中都存在,比如进入中断响应时,处理器所做的LR 保存中,也进行了一次自动调整,并且调整动作都是LR=LR-0x4。

      下面,我们对不同类型的异常的返回地址依次进行说明:假设在指令A 处(地址0x8000)发生了异常,进入异常响应后,LR 上经过调整保存的地址值应该是B 的地址0x8004。

3.1 如果发生的是软件中断,即A 是“SWI”指令

       异常是由指令本身引起的,从 SWI 中断返回后下一条执行指令就是B,正好是LR 寄存器保存的地址, 所以只要直接把LR 恢复给PC。

MOVS pc, lr

3.2 发生的是Undefined instruction异常

     异常是由指令本身引起的,从异常返回后下一条执行指令就是B,正好是LR 寄存器保存的地址, 所以只要直接把LR 恢复给PC。

MOVS pc, lr

3.3 发生的是IRQ或FIQ中断

      因为指令不可能被中断打断,所以A指令执行完以后才能响应中断,此时PC已更新,指向指令D的地址(地址0x800C),LR 上经过调整保存的地址值是C 的地址0x8008。中断返回后应该执行B指令,所以返回操作是:

SUBS pc, lr, #4

3.4 发生的是Prefetch Abort异常

      该异常并不是处理器试图从一个非法地址取指令时触发,取出的指令只是被标记为非法,按正常处理流程放在流水线上,在执行阶段触发Prefetch Abort异常,此时LR 上经过调整保存的地址值是B 的地址0x8004。异常返回应该返回到A指令,尝试重新取指令,所以返回操作是:

SUBS pc, lr, #4

3.5  发生的是“Data Abort”

      CPU访问存储器时触发该异常,此时PC指向指令D的地址(地址0x800C),LR 上经过调整保存的地址值是C 的地址0x8008。异常返回后,应回到指令A,尝试重新操作存储器,所以返回操作是:

SUBS pc, lr, #8

以上就是ARM异常的CPU操作部分,接下来就是程序员应该完成的操作。

4.程序员需要做的事

1) 由于CPU会自动跳转到对应的异常向量中,因此只需要在在各个异常向量中存放对应的操作,最简单的都是存放一个B指令跳转到对应的异常处理函数的操作即可。但由于B指令的跳转返回只有+-32M,而异常处理函数的地址可能会超过+-32M,因此可以采用另一种方式实现方式:在异常向量中保存一条指令LDR PC [addr],其中的addr中就保存了异常处理函数的地址,当然addr的相对地址要小于+-32M。这样也就解决了跳转范围的问题。

2) 接下来就是异常处理函数对应的操作,可以在进入异常处理之前就进行返回地址的调整,这样后面就不用进行处理啦,当然也可以在返回过程中再调整。一般都是在这个过程中进行调整。进行压栈操作,保存对应的环境变量。调用实际的处理过程等。

3) 出栈,恢复CPU的状态和寄存器的值。由于第一步中已经调整好返回地址,这一步不需要再次调整。当然如果之前没有调整,这里则需要进行相应的调整。

5.  uC/OS-II中的异常处理

在uC/OS-II的官网移植中采用通用异常处理函数的方式实现异常的处理,我们来分析其中的部分代码:

首先是处理器部分的移植,包括异常向量、异常的ID号,存储异常处理函数地址的地址等:

/*ARM的异常ID号,支持7种类型的异常,每一种异常都存在一个ID号*/

#define  OS_CPU_ARM_EXCEPT_RESET                   0x00

#define  OS_CPU_ARM_EXCEPT_UNDEF_INSTR       0x01

#define  OS_CPU_ARM_EXCEPT_SWI                       0x02

#define  OS_CPU_ARM_EXCEPT_PREFETCH_ABORT 0x03

#define  OS_CPU_ARM_EXCEPT_DATA_ABORT        0x04

#define  OS_CPU_ARM_EXCEPT_ADDR_ABORT        0x05

#define  OS_CPU_ARM_EXCEPT_IRQ                        0x06

#define  OS_CPU_ARM_EXCEPT_FIQ                        0x07

#define  OS_CPU_ARM_EXCEPT_NBR                       0x08

/*异常向量地址*/

#define  OS_CPU_ARM_EXCEPT_RESET_VECT_ADDR       (OS_CPU_ARM_EXCEPT_RESET          * 0x04 + 0x00)              //0x00

#define  OS_CPU_ARM_EXCEPT_UNDEF_INSTR_VECT_ADDR   (OS_CPU_ARM_EXCEPT_UNDEF_INSTR    * 0x04 + 0x00) //0x04

#define  OS_CPU_ARM_EXCEPT_SWI_VECT_ADDR                (OS_CPU_ARM_EXCEPT_SWI            * 0x04 + 0x00)         //0x08

#define  OS_CPU_ARM_EXCEPT_PREFETCH_ABORT_VECT_ADDR     (OS_CPU_ARM_EXCEPT_PREFETCH_ABORT * 0x04 + 0x00)         //0x0c

#define  OS_CPU_ARM_EXCEPT_DATA_ABORT_VECT_ADDR         (OS_CPU_ARM_EXCEPT_DATA_ABORT     * 0x04 + 0x00)     //0x10

/*这个异常是ARM中不支持的异常*/

#define  OS_CPU_ARM_EXCEPT_ADDR_ABORT_VECT_ADDR         (OS_CPU_ARM_EXCEPT_ADDR_ABORT     * 0x04 + 0x00)                            //0x14

#define  OS_CPU_ARM_EXCEPT_IRQ_VECT_ADDR      (OS_CPU_ARM_EXCEPT_IRQ    * 0x04 + 0x00)                  //0x18

#define  OS_CPU_ARM_EXCEPT_FIQ_VECT_ADDR             (OS_CPU_ARM_EXCEPT_FIQ            * 0x04 + 0x00)                       //0x1c

/*存储异常处理函数地址的地址*/

/* ARM exception handlers addresses                   */

#define  OS_CPU_ARM_EXCEPT_RESET_HANDLER_ADDR       (OS_CPU_ARM_EXCEPT_RESET    * 0x04 + 0x20)             //0x20

#define  OS_CPU_ARM_EXCEPT_UNDEF_INSTR_HANDLER_ADDR     (OS_CPU_ARM_EXCEPT_UNDEF_INSTR    * 0x04 + 0x20)           //0x24

#define  OS_CPU_ARM_EXCEPT_SWI_HANDLER_ADDR             (OS_CPU_ARM_EXCEPT_SWI            * 0x04 + 0x20)        //0x28

#define  OS_CPU_ARM_EXCEPT_PREFETCH_ABORT_HANDLER_ADDR  (OS_CPU_ARM_EXCEPT_PREFETCH_ABORT * 0x04 + 0x20)     //0x2c

#define  OS_CPU_ARM_EXCEPT_DATA_ABORT_HANDLER_ADDR      (OS_CPU_ARM_EXCEPT_DATA_ABORT     * 0x04 + 0x20)            //0x30

#define  OS_CPU_ARM_EXCEPT_ADDR_ABORT_HANDLER_ADDR      (OS_CPU_ARM_EXCEPT_ADDR_ABORT     * 0x04 + 0x20)           //0x34

#define  OS_CPU_ARM_EXCEPT_IRQ_HANDLER_ADDR             (OS_CPU_ARM_EXCEPT_IRQ            * 0x04 + 0x20)           //0x38

#define  OS_CPU_ARM_EXCEPT_FIQ_HANDLER_ADDR             (OS_CPU_ARM_EXCEPT_FIQ            * 0x04 + 0x20)           //0x3c

/*存储在异常向量中的内容,实质上是LDR PC,[PC,#0x18]的机器码*/

#define  OS_CPU_ARM_INSTR_JUMP_TO_SELF              0xEAFFFFFE

/* ARM "Jump To Exception Handler" asm instruction    */

#define  OS_CPU_ARM_INSTR_JUMP_TO_HANDLER         0xE59FF018

异常的初始化函数,首先,完成了在异常向量中存储指令的操作,采用机器码的形式就能避免直接访问寄存器什么的,其次,完成在固定的地址处存放对应异常处理函数的地址。其中采用了赋值的形式也是需要注意的,采用的强制类型转换和指针相结合的形式。保证了是修改地址处的内容。而不是修改地址。

/*初始化异常中断向量*/

void  OS_CPU_InitExceptVect (void)

{

         /*

         OS_CPU_ARM_EXCEPT_UNDEF_INSTR_VECT_ADDR是对应中断向量表的地址

         OS_CPU_ARM_INSTR_JUMP_TO_HANDLER是保存了对应的     OS_CPU_ARM_INSTR_JUMP_TO_HANDLER(实质上是一个指令)

       实质上就是在异常向量中存放了:LDR PC [PC, #0x18],也就是让PC指向对应的异常处理地址中的内容,也就是实现到实际处理函数的跳转。异常处理地址中存储了实际的异常处理函数的地址

       其他的异常也有相同的操作,OS_CPU_ARM_INSTR_JUMP_TO_HANDLER是一个指令的机器码形式

         */

    (*(INT32U *)OS_CPU_ARM_EXCEPT_UNDEF_INSTR_VECT_ADDR)       =         OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;

    (*(INT32U *)OS_CPU_ARM_EXCEPT_UNDEF_INSTR_HANDLER_ADDR)    = (INT32U)OS_CPU_ARM_ExceptUndefInstrHndlr;

 

    (*(INT32U *)OS_CPU_ARM_EXCEPT_SWI_VECT_ADDR)               =         OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;

    (*(INT32U *)OS_CPU_ARM_EXCEPT_SWI_HANDLER_ADDR)            = (INT32U)OS_CPU_ARM_ExceptSwiHndlr;

 

    (*(INT32U *)OS_CPU_ARM_EXCEPT_PREFETCH_ABORT_VECT_ADDR)    =         OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;

    (*(INT32U *)OS_CPU_ARM_EXCEPT_PREFETCH_ABORT_HANDLER_ADDR) = (INT32U)OS_CPU_ARM_ExceptPrefetchAbortHndlr;

 

    (*(INT32U *)OS_CPU_ARM_EXCEPT_DATA_ABORT_VECT_ADDR)        =         OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;

    (*(INT32U *)OS_CPU_ARM_EXCEPT_DATA_ABORT_HANDLER_ADDR)     = (INT32U)OS_CPU_ARM_ExceptDataAbortHndlr;

 

    (*(INT32U *)OS_CPU_ARM_EXCEPT_ADDR_ABORT_VECT_ADDR)        =         OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;

    (*(INT32U *)OS_CPU_ARM_EXCEPT_ADDR_ABORT_HANDLER_ADDR)     = (INT32U)OS_CPU_ARM_ExceptAddrAbortHndlr;

 

    (*(INT32U *)OS_CPU_ARM_EXCEPT_IRQ_VECT_ADDR)               =         OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;

    (*(INT32U *)OS_CPU_ARM_EXCEPT_IRQ_HANDLER_ADDR)            = (INT32U)OS_CPU_ARM_ExceptIrqHndlr;

 

         /*在异常向量中存储对应的操作,实质上就是将PC值调转*/

    (*(INT32U *)OS_CPU_ARM_EXCEPT_FIQ_VECT_ADDR)               =         OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;

    (*(INT32U *)OS_CPU_ARM_EXCEPT_FIQ_HANDLER_ADDR)            = (INT32U)OS_CPU_ARM_ExceptFiqHndlr;

}

 

异常类型

Mode

异常向量

内容

IRQ异常

IRQ

0x00000018

LDR PC,[PC,#0x18]或者0xE59FF018

IFQ异常

IFQ

0x0000001C

LDR PC,[PC,#0x18]

0xE59FF018



0x00000038

Address of OS_CPU_ARM_ExceptIrqHndlr()



0x0000003C

Address of OS_CPU_ARM_ExceptFiqHndlr()

 

有必要的讨论一下,为什么在向量中存储的是指令: LDR PC,[PC,#0x18],我们从上面的地址可以知道,IRQ异常处理函数地址被存储到了0x00000038中,异常向量与该地址之间的差值是0x20,那么为什么在其中存储的值只是0x18呢?这还要讨论ARM的流水线结构,当前执行的命令相比PC指向的地址差0x08。也就是当前执行的指令的地址是PC-0x08.当PC指向异常向量以后(取值),还需要等待一个时钟(译码)之后才会被执行(真正意义上的执行操作),而这时PC值已经被更新了。指向了Vector+0x8的位置,因此我们可以知道,当执行向量中的代码时,这时PC=Vector+0x8,而这时相对于固定的0x20-0x08=0x18,这也就是为什么是LDR PC,[PC,#0x18],而不是LDR PC,[PC,#0x20].

采用上面的例子说明IRQ的向量为0x00000018,而设定好的固定地址用来存储对应异常处理函数地址的地址是0x00000038,当CPU执行完PC = 0x00000018以后,还需要译码、才能被执行,这时候PC值已经更新为PC = 0x00000018 + 0x08;这时候固定地址距离PC的相对位置位0x00000038 – PC = 0x18,而该地址中保存了IRQ中断的通用处理函数OS_CPU_ARM_ExceptIrqHndlr()的地址,LDR PC,[PC,#0x18]这条指令是指将PC+0x18地址处的内容加载到PC中,实质上也就完成跳转到异常处理函数的操作。

这样处理的好处是因为LDR的加载范围是一个固定值+-32M,我们不能保证异常处理程序的地址刚好在+-32M左右,采用这种LDR PC, ADDR(固定地址)的形式就能实现大范围的跳转操作。

       我们仅仅以FIQ中断处理的形式进行讨论,其他的异常有一定的相似性,只是在返回地址上存在差别。这段代码主要是完成寄存器的压栈,返回地址的调整,保存等操作。具体的看下面的分析:

    AREA CODE, CODE, READONLY

    CODE32

OS_CPU_ARM_ExceptFiqHndlr

;修改中断返回地址,这属于进入真正处理函数前的返回地址调整,具体的返回地址依据前面保存的R14进行相应的修改。

SUB     LR, LR, #4                 ; LR offset to return from this exception: -4.

;压栈操作

STMFD   SP!, {R0-R12, LR}         ; Push working registers.

;保存链接寄存器

MOV     R2, LR                   ; S**e link register.

;设置好ID号,这是非常必要的,只有这样才能辨别属于那种异常

MOV     R0, #OS_CPU_ARM_EXCEPT_FIQ    ; Set exception ID

/*跳转到通用的异常处理函数,传递的参数是异常ID号*/

B    OS_CPU_ARM_ExceptHndlr      ; Branch to global exception handler.

 

OS_CPU_ARM_ExceptHndlr(except_type)是一个通用的异常处理函数,可以对除了IRQ以外的其他异常进行控制操作。在这个通用处理函数中又调用了下面的函数OS_CPU_ARM_ExceptHndlr_BreakExcept()或者OS_CPU_ARM_ExceptHndlr_BreakTask()。这两个函数中又调用了通用处理函数OS_CPU_ExceptHndlr(),然后OS_CPU_ExceptHndlr()中调用具体的中断处理操作。

一般的OS_CPU_ExceptHndlr()处理形式,可以认为是一个模板如下:

void OS_CPU_ExceptHndlr (INT32U except_type)

{

/* Determine beh**ior according to exception type (except_type) */

/* If an IRQ or FIQ ,具体的可能要使用中断向量等形式实现*/

while (there are interrupting devices) {

/* Clear interrupting device */

OS_CPU_SR_INT_En(); /* Enable nesting, if desired */

/* Handle interrupt */

}

}

这是其中的一段关于IRQ中断的文字复述:

IRQ中断的基本的流程图如下:

以上的uC/OS-II异常处理就分析完了,这种方式的实现实质上是采用了通用模板的形式,这样实现出来的形式只需要控制一定的,具体的一些IRQ中断处理函数(如定时器,GPIO等的中断),与具体的厂商有很大的关系,有的厂商采用硬件寄存器的方式进行设计,有的采用软件方式实现,因此具体的中断。

后面我再分析我们通常认为的中断(实质上就是IRQ和IFQ中某一个具体中断)处理方式。


关键字:ARM  异常中断  处理过程 引用地址:ARM的异常中断和处理过程

上一篇:ARM的37个寄存器
下一篇:STM32与FPGA通信写数据出错问题解决方法

推荐阅读最新更新时间:2024-03-16 15:32

跟我写ARM处理器之一:从写module arm开始
我决定把我写ARM处理器的经验分享给大家。不是自卖自夸,我这个核是非常好的核。一个证明方法是下载入FPGA,看她是不是能工作。这种证明方法,我已经做到了。大家如果可以下载整个工程文件,稍微改造一下,即能验证是否成功。但是这还不是推广她的方法。因为对于大多数人来说,只是知其然不知其所以然。人们对于不熟悉、不了解的事情,总是觉得神秘,那么对于她的应用,就会大打折扣。推广她的最好的方法,就是让她成为人人能够轻松写的核。我希望以此推动大家对于SOC设计的热情。可以想象,如果最神秘,最复杂的CPU核,都可以轻松的写出来的话,那么还有什么能够难得到我们的呢? 在写之前,我要申明两点精神。这两点精神当然不是我创造的,我只是引用起来,让大家更
[单片机]
Keil arm 编译 RO RW ZI DATA
ARM程序(指在ARM系统中正在执行的程序,而非保存在ROM中的bin文件)的组成 一个ARM程序包含3部分:RO段,RW段和ZI段 RO是程序中的指令和常量 RW是程序中的已初始化变量 ZI是程序中的未初始化的变量 由以上3点说明可以理解为: RO就是readonly, RW就是read/write, ZI就是zero ARM映像文件的组成 所谓ARM映像文件就是指烧录到ROM中的bin文件,也成为image文件。以下用Image文件来称呼它。 Image文件包含了RO和RW数据。 之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进
[单片机]
三星成ARM第三家处理器架构设计公司
    在近期推出更新款Exynos 5 Octa处理器后,三星目前也传出将以ARM架构技术为基础,重新打造自行设计的硬件架构,准备在明年间推出下一代Exynos系列处理器,其中将着重于处理器、存储器与NAND快闪存储器之间的资料传输效能,预期将比现行ARM核心架构设计有更好效能表现。 虽然近期才宣布更新以ARM big.LITTLE技术为基础的Exynos 5 Octa处理器,三星目前再度传出将藉由修改ARM基础核心架构,打造自行设计的处理器硬件架构,并且可兼容既存ARM硬件与现有App内容。同时,三星也将在新处理器架构强调资料传输处理效能表现,预期将比现有ARM架构效能提升许多。 目前三星预期将在明年初期推出新款Exynos
[手机便携]
ARM工作模式和BOOTLOADER -2410
简单地说,Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户特定的 Boot Loader 设计与实现。 基于 ARM7TDMI core 的 CPU 在复位时通常都从地址 0x00000000 取它的第一条指令。在系统加
[单片机]
ARM推出全球最节能处理
2012年3月14日,中国上海——ARM今天发布了一款拥有全球最高功耗效率的微处理器——ARM® Cortex™-M0+处理器。该款经过优化的Cortex-M0+处理器可针对 家用电器、白色商品、医疗监控、电子测量、照明设备以及功耗与汽车控制器件等各种广泛应用的智能传感器与智能控制系统,提供超低功耗、低成本微控制器(MCU)。 作为ARM Cortex处理器系列的最新成员,32位Cortex-M0+处理器采用了低成本90纳米低功耗(LP)工艺,耗电量仅9µA/MHz,约为目前主流8位或16位处理器的三分之一,却能提供更高的性能。 这种行业领先的低功耗和高性能的结合为仍在使用8位或16位架构的用户提供了一个转型开发32位器件
[单片机]
ARM嵌入式Wince的开发心得
主要内容:通过看书初步了解了ARM 嵌入式wince开发的前景和意义,嵌入式的应用领域,ARM硬件的体系结构。WINCE 方面懂得了platform builder开发工具的使用,能够运用platform builder开发工具定制WINCE操作系统,可提取出操作系统内核镜像 NKL.BIN。 ARM Advanced RISC Machines简称,采用精简指令的计算机技术。 ARM高级语言程序设计主要是通过C语言实现。其操作系统的开发可以基于Linux,也可以基于Windows,我主要是基于ARM芯片的WINCE 操作系统的开发和移植。 WINCE 开发平台的构建与配置: 使用platform builder开发平台,安装
[单片机]
ARM Cortex-M4中断优先级和嵌套
坐在上海回北京的高铁上,漫长的旅途着实让人感到无聊(没买到直达的高铁,只能慢悠悠的走一站停一站,晕,都高铁时代了,竟然还这样,想起了大学放假回家站十几个小时绿皮车的时光啊,哈哈),遂有点“写心萌动”,不由感叹——“春”天真是来了,春为啥加引号捏,我相信大家都懂的,哈哈。这样也好,俺又可以慢悠悠的写作抒情了,走着。。。 其实都搞了这么长时间的ARM开发,关于其至关重要的中断优先级问题我早就想跟大家伙分享分享了,可惜一方面想真正的讲清楚这个问题估计又得大费周章和墨水,另一方面自己越来越忙进一步导致写文章倒是越来越懒了,呵呵。所以趁着坐高铁无聊赶紧撸胳膊抹袖子整吧,不然把这么重要的内容放在自己脑子里封存落灰实在是颇为浪费呀,哈哈。那
[单片机]
<font color='red'>ARM</font> Cortex-M4中断优先级和嵌套
基于ARM的电子系统设计
    摘要: 本文简单介绍了ARM系列处理的结构和技术特性。针对目前应广泛的ARM7,详细介绍了相应的软件工具和硬件工具以及操作系统,并构建了一个PDA方案来说明其实际应用。     关键词: ARM  SOC  PDA 一、引言 作为SOC(System On Chip)的典型应用,和持电话、机顶盒、数码像机、GPS、个为数字助理以及因特网设备等产品的市场需求越来越大。目前,基于ARM的处理器以其高速度、低功耗等诸多优异的性能而成为上述各类产品中选用较多的处理器。 二、ARM内核 ARM内核分为ARM7、ARM9、ARM10以及StrongARM等几类。其中每一类又根据其各自包含的功能模块而分成多
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved