我用的CCS3.3,OMAPL138官方开发板,只是用DSP。
使用1014013A_OMAP-L138_GEL_BSL_Files的文件都能正常运行,但是这个包里没有中断的例子。现在想使用中断,定义了.asm的中断向量表文件,但是表还有ISTP、 ICR、IER编译的时候都显示未定义,(按道理这个是通用寄存器应该可以直接赋值的啊)。这个在那里有定义?该如何使用呢?
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.
我用的CCS3.3,OMAPL138官方开发板,只是用DSP。
使用1014013A_OMAP-L138_GEL_BSL_Files的文件都能正常运行,但是这个包里没有中断的例子。现在想使用中断,定义了.asm的中断向量表文件,但是表还有ISTP、 ICR、IER编译的时候都显示未定义,(按道理这个是通用寄存器应该可以直接赋值的啊)。这个在那里有定义?该如何使用呢?
在项目的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允许可屏蔽中断:
例如我们使用CPU的INT4作为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,这里作为例子我们使用OMAPL138的GPIO23 的组中断作为演示,它对应的事件的编号为49,关于什么事件对应于那个事件编号,参考文章:
OMAP-L138 Applications Processor System Reference Guide 的 3.2.2.1章节 Interrupt Controller (INTC
OMAPL138 数据手册的第5.7.2章节 DSP Interrupts
打开属性对话框
在打开的对话框中,
Comment 输入框中输入一些注释,方便我们以后识别该中断的作用
在function 后的输入框中,输入用C、C++写的中断服务程序函数名,且以 _ 开始,如我们的中断服务程序如下
则应该在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
我使用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外部触发中断内容生成的,请大虾给个意见?