This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

OMAPL138 中断问题 :identifer "ISTP" is undefined

Other Parts Discussed in Thread: OMAP-L138

我用的CCS3.3,OMAPL138官方开发板,只是用DSP。

使用1014013A_OMAP-L138_GEL_BSL_Files的文件都能正常运行,但是这个包里没有中断的例子。现在想使用中断,定义了.asm的中断向量表文件,但是表还有ISTP、 ICR、IER编译的时候都显示未定义,(按道理这个是通用寄存器应该可以直接赋值的啊)。这个在那里有定义?该如何使用呢? 

  • 刚才试了下,在文件前加入 extern cregister volatile unsigned int IFR; 等可以避免这个错误出现,但是中断向量表名称如何定义呢?

  • 在项目的source里面添加后缀是asm的文件,里面就是向量表的定义。

    另外项目里面还要添加cmd文件。

    下面是我正在调试的一个文件,仅供参考。

    ////////////////

    // asm 文件

    ////////////////

    ; Global symbols defined here and exported out of this file

      .global _intcVectorTable

      .global _c_int00

      .global _vector1

      .global _vector2

      .global _vector3

      .global _vector4

      .global _vector5

      .global _vector6

      .global _vector7

      .global _edma_isr

      .global _vector9

      .global _vector10

      .global _vector11

    ; some symbols defined in other files.

    ; since there is .global for below items, maybe no need to add .ref ?

      .ref    _c_int00

    ; This is a macro that instantiates one entry in the interrupt service table.

    VEC_ENTRY .macro addr

       STW   B0,*--B15

       MVKL  addr,B0

       MVKH  addr,B0

       B     B0

       LDW   *B15++,B0

       NOP   2

       NOP

       NOP

      .endm

    ; This is a dummy interrupt service routine used to initialize the IST.

    _vec_dummy:

     B    B3

     NOP  5

    ; This is the actual interrupt service table (IST).

    .sect ".vecs"

    .align 1024

    _intcVectorTable:

    _vector0:   VEC_ENTRY _c_int00      ;RESET

    _vector1:   VEC_ENTRY _vec_dummy    ;NMI

    _vector2:   VEC_ENTRY _vec_dummy    ;RSVD

    _vector3:   VEC_ENTRY _vec_dummy    ;RSVD

    _vector4:   VEC_ENTRY _vec_dummy  ;Interrupt4 ISR

    _vector5:   VEC_ENTRY _vec_dummy

    _vector6:   VEC_ENTRY _vec_dummy

    _vector7:   VEC_ENTRY _vec_dummy

    _vector8:   VEC_ENTRY _edma_isr ;Interrupt8 EDMA INT ISR

    _vector9:   VEC_ENTRY _vec_dummy

    _vector10:  VEC_ENTRY _vec_dummy

    _vector11:  VEC_ENTRY _vec_dummy

    ////////////////////////

    /// asm 文件 到此结束

    //////////////////////////

    ////////////////////////

    /// cmd 文件

    ///////////////////////

    -l rts64plus.lib

    -l ..\..\lib\c6747bsl_lzt.lib

    -stack           0x00000800      /* Stack Size */

    -heap            0x00000800      /* Heap Size */

    MEMORY

    {

    VECS: o = 0x11800000  l = 0x00000400 /**/

       DSPL2RAM:    o = 0x11800400  l = 0x0003FC00 /* L2 RAM */

       SHAREDRAM:   o = 0x80000000  l = 0x00020000

       SDRAM:       o = 0xC0000000  l = 0x20000000

    }

    SECTIONS

    {

       .vecs > VECS

       .bss        >   SHAREDRAM

       .cinit      >   SHAREDRAM

       .cio        >   SHAREDRAM

       .const      >   SHAREDRAM

       .stack      >   SHAREDRAM

       .sysmem     >   SHAREDRAM

       .text       >   SHAREDRAM

       .switch     >   SHAREDRAM

       .far        >   SHAREDRAM

    }

    /////////////////

    /// cmd 文件到此结束

    //////////////////////

  • 给你提供一个基于DSP BIOS的中断的解决方案:因粘贴时图片不显示,附件是word文档

    为避免编译过程中,一些头文件和库找不到,我们需要将该例子放在OMAPL138 BSL软件包安装路径的 evmomapl138_v1\tests\ICETEK目录下

    如果要使用自己的BSL库,请将压缩包中BSL目录下的 evmomapl138_gpio.c 替换BSL源程序的evmomapl138_v1\bsl\src 下的该文件,重新编译库。或者直接使用压缩包中的库

     

    首先在main函数中使用DSP BIOS API允许可屏蔽中断:

    例如我们使用CPUINT4作为GPIO bank23的中断

      // 可屏蔽中断4允许

             C64_enableIER(C64_EINT4);

     

    以下是在DSP BIOS中的操作

     

    第一种方式使用CPU中断直接响应外部事件

    一、在Secheduling 中选择

             HWI – Hardware Interrupt Function Manager前的加号

    在展开的列表的 ECM –Event Combiner Manager 上点击鼠标右键,弹出菜单上选择 properties

    在打开对话框中 选择 Enable event combiner manager

    点击 确定

     

    二、HWI – Hardware Interrupt Function Manager 下的 HWI_INT4 ~ HWI_INT15中,选择一个然后在其上点击鼠标右键,选择properties

    打开属性对话框

     

    interrupt selection number后的输入框中输入外部事件对应的中断号,如bank23的中断对应的中断号为49,对于不同的CPU的外设器中断号可能不一样参考对应器件的数据手册以及对应处理器的系统参考文章。对于OMAPL138的中断,参考文章:

    OMAP-L138 Applications Processor System Reference Guide 3.2.2.1章节 Interrupt Controller (INTC

    OMAPL138 数据手册的第5.7.2章节 DSP Interrupts

    function 后的输入框中 输入中断响应的函数(中断服务程序)

    如我们中断服务程序为

    则在输入框中输入 _output_clk 注意对于C语言写的中断服务程序在输入框中输入时应在函数名前加下划线”_”

    对于用C语言写的中断服务程序,我们还应该做如下的步骤

    在中断属性页面上点击Dispatcher选项卡,选中 Use Dispatcher选项。

    Interrupt Mask后的下拉列表表示在执行当前中断的时候是否允许其他中断发生,即是否允许中断,参考DSP BIOS的在线帮助获得更多的信息

    第二中方式 CPU响应事件组合器(combiner)生成的中断

     

    一、在Secheduling 中选择

             HWI – Hardware Interrupt Function Manager前的加号

    在展开的列表的 ECM –Event Combiner Manager 上点击鼠标右键,弹出菜单上选择 properties

    在打开对话框中 选择 Enable event combiner manager

    点击 确定

     

    展开

    ECM –Event Combiner Manager,在对应的 EVENTn 上点击鼠标右键,选择 properties,这里作为例子我们使用OMAPL138GPIO23 的组中断作为演示,它对应的事件的编号为49,关于什么事件对应于那个事件编号,参考文章:

    OMAP-L138 Applications Processor System Reference Guide 3.2.2.1章节 Interrupt Controller (INTC

    OMAPL138 数据手册的第5.7.2章节 DSP Interrupts

    打开属性对话框

    在打开的对话框中,

    Comment 输入框中输入一些注释,方便我们以后识别该中断的作用

    function 后的输入框中,输入用CC++写的中断服务程序函数名,且以 _ 开始,如我们的中断服务程序如下

    则应该在function输入框中输入 _output_clk

     

    unmask event source 选项应该选中,告知编译器不要屏蔽该事件的中断,默认的情况下,他们都是被屏蔽的

     

    二、在HWI – Hardware Interrupt Function Manager 下的 HWI_INT4 ~ HWI_INT15中,选择一个然后在其上点击鼠标右键,选择properties

    这里我们需要修改 interrupt selection number,输入的数字对应的ECM源的关系如下

    nterrupt SelectionNumber       ECM Module Objects       ECM EventRange

    0                                                     EVENT4 to EVENT31                 4 - 31

    1                                                     EVENT32 to EVENT63               32 - 63

    2                                                      EVENT64 to EVENT95               64 - 95

    3                                                      EVENT96 to EVENT127             96 – 127

     

    如果拟将HWI_INT4 映射到ECM 32-63,这其中包含GPIO2bank的中断事件,则 nterrupt SelectionNumber 输入框中输入1

    当我们在interrupt selection number输入框中输入0~3之间的数字时,function输入框中会自动填上函数 _ECM_dispatch 且不能修改成其他的

    Dispatcher 选项卡中,选中 use Dispatcher

    如果我们不修改interrupt Mask选项,它自动选择Self,且Arg中填入一个数值,这个数值和我们在interrupt selection number输入框中输如的数值相关联,我们使用默认的。

    Interrupt Mask后的下拉列表表示在执行当前中断的时候是否允许其他中断发生,即是否允许中断,参考DSP BIOS的在线帮助获得更多的信息

     

    点击确定,重新编译项目,下载进行测试

     

    /////////////////////////////////////////////////////////////////////////////////////////////////////

     

    参考文档:

    1、  数据手册 http://www.ti.com/lit/gpn/omap-l138

    2、  系统参考:

    http://focus.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=sprugm7d&fileType=pdf

    3、  兆模块参考

    http://focus.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=sprufk5a&fileType=pdf

    4、  CPU和指令集用户手册

    http://focus.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=sprufe8b&fileType=pdf

     

    基于DSP BIOS Link的中断设置.docx
  • 我使用seed dec138 demo板,用aisgen生成的bin文件烧写到nandflash,工作正常,arm.out是seed提供的led的ARM端,dsp.out是在led的dsp端。

    由于要使用外部中断,按照ZT liang所给例程的内容加入asm和必要的中断服务程序和修改cmd文件,用ccs3.3.82.13+SEED560PLUS USB,仿真可以进中断,程序执行ok,但是用aisgen生成的bin烧写到flash不能执行,arm.out还是seed提供的led的ARM端,dsp.out是在led的dsp端加上gpio外部触发中断内容生成的,请大虾给个意见?

  • 接上问,vectors中的vector0是reset即_c_int00入口,cmd文件中 VECS: o = 0x11800000  l = 0x00000400 ,而要用aisgen生成bin,seed-dec138要求dsp端cmd中的{.text:_c_int00 > sharedram的0x80010000},请问两者该选哪种,才能使烧写nandflash程序正常执行。

  • 好了,是硬件有点问题。