• TI C64X DSP中断向量表的配置(硬件中断) 转自新浪博客 沉沉_


    1. 编写中断服务例程

    在.c源文件中编写ISR函数c_intXX,用于中断处理,如:

    interrupt void c_intXX (void)

    {

    …;

    }

    注:对于硬件中断而言,XX = 00~15。

    2.初始化中断向量表,并在内存段中的中断向量表中配置好对应的中断向量

    首先是把中断向量表定位到某一内存段中,我们可以在cmd文件中配置中断向量表的内存映射,如:

    MEMORY

    {

    VECTORS: org = 00000000h, len = 00000400h

    L2SRAM: org = 00000400h, len = 00100000h

    SDRAM: org = 80000000h, len = 10000000h

    }

    SECTIONS

    {

    .vecs :> VECTORS

    .data :> L2SRAM

    .text :> L2SRAM

    .switch :> L2SRAM

    .stack :> L2SRAM

    .bss :> L2SRAM

    .cinit :> L2SRAM

    .far :> L2SRAM

    .cio :> L2SRAM

    .const :> L2SRAM

    .sysmem :> SDRAM

    .tables :> L2SRAM

    }

    然后建立一个.asm文件,用以配置中断向量表中的中断向量,我们需要声明一些全局变量,以便其他源文件可以引用这些变量或者引用其他源文件的变量,如:

    .global _vectors

    .global _c_int00

    .global _vector1

    .global _vector2

    .global _vector3

    .global _vector4

    .global _vector5

    .global _vector6

    .global _vector7

    .global _c_int08 ; 对应main()函数的c_int08中断服务例程(假设处理的是EDMA中断)

    .global _vector9

    .global _vector10

    .global _vector11

    .global _vector12

    .global _vector13

    .global _vector14

    .global _vector15

    因为引用了rts的_c_int00中断,即RESET中断,因此需要引入这个符号:

    .ref _c_int00

    为了把中断服务例程的地址,即中断向量插入到中断向量表中,可以定义一个宏:

    VEC_ENTRY .macro addr

    STW B0,*--B15

    MVKL addr,B0

    MVKH addr,B0

    B B0

    LDW *B15++,B0

    NOP 2

    NOP

    NOP

    .endm

    为了初始化中断向量表中的中断向量,可以定义一个虚拟的中断向量:

    _vec_dummy:

    B B3

    NOP 5

    接下来就可以配置中断向量表了:

    .sect “.vecs”

    .align 1024

    _vectors:

    _vector0: VEC_ENTRY _c_int00 ;RESET中断

    _vector1: VEC_ENTRY _vec_dummy ;NMI不可屏蔽中断

    _vector2: VEC_ENTRY _vec_dummy ;保留中断1

    _vector3: VEC_ENTRY _vec_dummy ;保留中断2

    _vector4: VEC_ENTRY _vec_dummy ;外部中断INT4

    _vector5: VEC_ENTRY _vec_dummy ;外部中断INT5

    _vector6: VEC_ENTRY _vec_dummy ;外部中断INT6

    _vector7: VEC_ENTRY _vec_dummy ;外部中断INT7

    _vector8: VEC_ENTRY _c_int08 ; EDMA控制器中断EDMAINT,对应于c_int08 ISR

    _vector9: VEC_ENTRY _vec_dummy;JTAGRTDX中断

    _vector10: VEC_ENTRY _vec_dummy;EMIF_SDRAM_Timer中断

    _vector11: VEC_ENTRY _vec_dummy;McBSP_0_Receive中断

    _vector12: VEC_ENTRY _vec_dummy;McBSP_1_Transmit中断

    _vector13: VEC_ENTRY _vec_dummy;Host_Port_Host_to_DSP中断

    _vector14: VEC_ENTRY _vec_dummy;Timer0中断

    _vector15: VEC_ENTRY _vec_dummy;Timer1中断

    3. 在C程序中指定定义的中断向量表,并且启用CPU中断功能

    在C程序中,用CSL的IRQ模块来设置中断比较方便,在设置之前,需要外部链接上面的asm程序的中断向量表符号:

    extern far void vectors();//之所以为vectors,因为C编译器编译后自动改名其为_vectors

    引用了中断向量表之后,就可以设置中断了:

    IRQ_setVecs(vectors); //指向asm中定义的中断向量表

    IRQ_nmiEnable();

    IRQ_globalEnable();

    IRQ_map(IRQ_EVT_EDMAINT, 8); //映射事件到指定的物理中断号

    IRQ_reset(IRQ_EVT_EDMAINT);

    4.启动中断源,如EDMA控制器的中断

    至此,中断服务例程c_int8就可以为EDMAINT中断服务了,其它硬件中断向量的配置同理。

    在CCS里面,通过DSP/BIOS的配置,我们可以很方便的设置自己想要的对象,进行初始化,简化了很多底层的步骤。

    DSP/BIOS硬中断创建的一般步骤:

    1. DSP/BIOS->Scheduling->HWI->HWI_INT(x);
    2. 在HWI_INT(X)属性的function中填入你要触发的中断处理,如_hwiFunc,并选中Dispatcher;
    3. 开启硬中断对象:
    IRQ_reset(IRQ_EVT_EXTINT5);
    IRQ_enable(IRQ_EVT_EXTINT5);
    4. 编写硬中断处理程序hwifunc();
    void hwifunc(void){}

  • 相关阅读:
    hibernate和mybatis区别
    Spring事务的传播行为和隔离级别
    数组拷贝
    spring mvc 一次请求 两次查询
    手游性能之渲染分析3
    Android pm 命令详解
    Android am命令使用
    Android dumpsys命令详细使用
    java处理高并发高负载类网站的优化方法
    关于ArrayList的5道面试题
  • 原文地址:https://www.cnblogs.com/chenchenluo/p/2790898.html
Copyright © 2020-2023  润新知