C6000中断

来源:互联网 发布:mac绕过百度网盘 编辑:程序博客网 时间:2024/06/15 17:32

中断类型和中断信号如下:

三种中断类型:RESET#,NMI,INT4-INT15,优先顺序如下:

复位中断:

最高级别,用来停止CPU工作,并返回到一个已知的状态.

  1. 它是低电平有效,其他的中断是转向高电平的上升沿有效.

  2. 为了正确初始化CPU,在RESET#再次变成高电平之前必须保持10个时钟.

  3. 复位操作使得所有的指令执行都被打断,所有的寄存器返回到他们的默认状态.

  4. 复位中断服务取指包必须放在地址为0的内存中.

  5. 复位不受转移指令的影响.

  • 不可屏蔽中断NMI

    它通常用来向CPU发出严重硬件中断的警报.为了实现NMI,在中断使能寄存器中的不可屏蔽中断使能位(NMIE)必须置1.如果NMIE置1,阻止NMI处理的唯一可能是包括屏蔽中断发生在转移指令的延迟间隙里.

  • INT4-INT15
    C6000有12个可屏蔽中断,他们被连接到芯片外部或片内外设,也可以由软件控制或者不用.中断发生时,将中断标志寄存器(IFR)得相应位置置1.假如一个INT不发生在转移指令的间隙里,它还必须满足下列条件才能得到响应.

  • 状态控制寄存器(CSR)中的全局中断使能位置1
    中断使能寄存器(IER)中断NMIE位置1.
    IER中的相应使能位置置1。
    在IFR中没有更高优先级的中断标志(IF)位为1

  • 中断响应信号(IACK ,INUMx)
    IACK ,INUMx信号用来通知C6000片外硬件:在CPU内一个中断已经发生并且正在处理时,会由IACK信号指出CPU已经开始处理一个中断,INUMx 信号(INUM3~INUM0)指出正在处理的是哪一个中断(即IFR中的中断位).例如如果INUMx信号从高到低为0111,表明正在处理INT7中断.
    二:中断服务表(IST)
    中断服务表(IST)是包含中断服务代码的取指包的一个地址表当CPU开始处理一个中断时,他要参照IST进行.IST包包含16个连续取指包,每个服务取指包都含有8条(32位字)指令.因此中断服务表中的地址以32字节增长.

  • 控制状态寄存器CSR
    它有低两位用来控制中断,bit0---GIE,bit1---PGIE.
    PGIE保存先前的GIE值,即在响应可屏蔽中断时,保存GIE的值,而GIE被清0,这样在处理一个可屏蔽中断时,就防止了另外的一个可屏蔽中断的发生.当从中断返回时,通过BIRP指令可使PGIE的值重新回到GIE.

  • 中断初始化的过程
    1. 初始化中断服务表指针(ISTP):intr_init();
    2. 选择用哪一个中断: intr_map(CPU_INT7,ISN_EXT_INT7);
    3. 清中断: INTR_CLR_FLAG(CPU_INT7);
    4. 中断服务子程序与中断号挂钩: intr_hook(Int7_ISR,CPU_INT7);
    5. 打开非屏蔽中断: INTR_ENABLE(CPU_INT_NMI);
    6. 打开所选中断: INTR_ENABLE(CPU_INT7);
    7. 全局中断使能: INTR_GLOBAL_ENABLE();
    其中的第二条中的两个参数分别可以为下列的值:

  • 中断处理函数都是小写的,而宏定义都是大写的,在 C 语言的语法里是要注意的,否则会出现找不到函数或者函数未定义。

  • example:
    中断源需要映射到CPU中断,这个是通过加载中断选择数到需要的中断选择域中.intr_map(CPU_INT8,ISN_DMA_INT0);
    当中断多路器寄存器配置后,ISR就可以跟CPU挂钩并使能了.
    interrupt void exampleISR(void)
    {
    isrFlag= TRUE;
    return;
    }
    intr_hook( exampleISR, CPU_INT8 );
    INTR_ENABLE( CPU_INT8 );
    现在DMA通道0的中断事件就可以调用exampleISR .

原创粉丝点击