TI C66x DSP 系统events及其应用 - 5.12(vector的创建)

下面的创建中断向量表的代码,可以将段vecs(存储中段向量表的段)重定位到某个地址,如DSP的L2起始地址(对于core1,是0x10800000),同时要将ISTP指向这个地址。

;create interrupt vector table for C6000 DSP
;--------------------------------------------------------------
;This file can be modified to add Interrupt Service Routine(ISR)
;for an interrupt, the steps are:
;1,reference to the externally defined ISR, for example
;	.ref EDMA_ISR
;2,modify the corresponding entry in the interrupt vector table.
;  For example, if interrupt 8 is used for EDMA, then you should
;  modify the entry number 8 like below:
;	VEC_ENTRY EDMA_ISR     	;interrupt 8
;reference to the externally defined ISR
	.ref _c_int00
	.ref Exception_service_routine
	.ref Nested_Exception_service_routine
	.ref LL2_EDC_ISR
	.ref SL2_EDC_ISR
	.ref Timer_ISR
	.ref exception_record
	.global vectors
;--------------------------------------------------------------
	.sect ".text"      ;NMI_ISR代码将保存在.text段中
;interrupt vector for NMI
NMI_ISR:
	STW 	B1,*-B15[1]

	;save some key registers when exception happens
	MVKL  exception_record,B1
	MVKH  exception_record,B1

	STW 	B3, *+B1[0]
	STW 	A4, *+B1[1]
	STW 	B4, *+B1[2]
	STW 	B14, *+B1[3]
	STW 	B15, *+B1[4]

	;jump to exception service routine
	MVKL  	Exception_service_routine, B1
	MVKH  	Exception_service_routine, B1
	B 	B1

	LDW 	*-B15[1],B1
	NOP 	4

;--------------------------------------------------------------
;create interrupt vector for reset (interrupt 0),".macro .endm"为定义汇编语句的宏,类似于C中的#define,调用时可用用宏,如:VEC_RESET NMI_ISR, 参数addr就等于NMI_ISR。
VEC_RESET .macro addr
	MVKL  addr,B0
	MVKH  addr,B0
	B     B0
	MVC   PCE1,B0
	NOP   4
	.align 32
	.endm

;create interrupt vector for other used interrupts
VEC_ENTRY .macro addr
	STW   B0,*--B15
	MVKL  addr,B0
	MVKH  addr,B0
	B     B0
	LDW   *B15++,B0
	NOP   4
	.align 32
	.endm

;create interrupt vector for unused interrupts ,不带参数的宏,使用时直接使用宏名:VEC_DUMMY。
VEC_DUMMY .macro
unused_int?:
	B    unused_int?   ;dead loop for unused interrupts,如果代码进入没有使用的中断vector中,将执行死循环。
	NOP  5
	.align 32
	.endm

;--------------------------------------------------------------------;interrupt vector table
	.sect "vecs"    ;作用是创建vecs段,下面的中断向量代码vectors将存储在vecs段中。
	.align 1024     ;.align伪汇编的作用是告诉汇编程序,本伪指令下面的内存变量必须从下一个能被1024整除的地址开始分配。如果下一个地址正好能被1024整除,那么,该伪指令不起作用,否则,汇编程序将空出若干个字节,直到下一个地址能被1024整除为止。
vectors:
	VEC_ENTRY Nested_Exception_service_routine             ;RESET
	VEC_ENTRY NMI_ISR					;NMI/Exception
	VEC_DUMMY   					;RSVD
	VEC_DUMMY   					;RSVD
 	VEC_ENTRY LL2_EDC_ISR                                  ;interrupt 4
	VEC_ENTRY SL2_EDC_ISR     			         ;interrupt 5
	VEC_DUMMY   					;interrupt 6
	VEC_DUMMY   					;interrupt 7
	VEC_DUMMY     					;interrupt 8
	VEC_DUMMY   					;interrupt 9
	VEC_DUMMY   					;interrupt 10
	VEC_DUMMY   					;interrupt 11
	VEC_DUMMY   					;interrupt 12
	VEC_DUMMY   					;interrupt 13
	VEC_ENTRY Timer_ISR   				;interrupt 14
	VEC_DUMMY   					;interrupt 15

	.end

代码来自网络,注释为本作者所加。

TI C66x DSP 系统events及其应用 - 5.12(vector的创建)

时间: 2024-12-12 11:48:10

TI C66x DSP 系统events及其应用 - 5.12(vector的创建)的相关文章

TI C66x DSP 系统events及其应用 - 5.3(Interrupt)

对于TI C66x DSP的每个CPU有INT4~15共12个中断输入.对于中断,event combiner将INTC的输入event 4~127分为4个组(event 0~3为INTC内部使用,如图示为event combiner的四个输出),然后event 0~127作为Interrupt Selector的输入.类似于4.x中的exception,中断也有同样功能的event flag,event mask,masked event flag寄存器. Interrupt Seclctor

TI C66x DSP 系统events及其应用 - 5.8(ISTP)

中断服务表指针ISTP(Interrupt Service Table Pointer)寄存器用于定位中断服务程序的位置,即ISTP指明中断发生后去哪里找要执行的程序,ISTP(其中的ISTB字段)就是指向IST表的寄存器.ISTP中的一个字段ISTB确定IST的地址基数部分:另一个字段HPEINT确定特定的中断并定位特定的取指包在IST中的位置.图6-4所示为ISTP的各字段,表6-2描述了各字段及其如何使用. 下图为ISTP寄存器,bit 0~4必须设置为0,即IST表的起始地址或者说获取包

TI C66x DSP 系统events及其应用 - 5.9(IST重定位)

RESET中断的获取包必须位于0地址处,然后其他中断的获取包可以位于任何256字(1k字节边界)对齐的程序空间.IST的位置由ISTP寄存器中的ISTB字段决定. IST重新定位举例: 1,将IST重新定位到800h: 将地址0h~200h的源IST拷贝到800h~A00h中: 将800h写到ISTP寄存器中: MVK 800h,B2 MVC B2,ISTP 则ISTP = 800h = 1000 0000 0000b 2,ISTP引导CPU重新定位的IST中去顶相应的ISFP(指令获取包) 假

TI C66x DSP 系统events及其应用 - 5.10(中断控制寄存器)

C66x DSP执行中断的简要流程: 1.使能了全局中断和子中断,如果硬件检测到中断发生,那么CPU就要跳转. 2.软件把CPU内部的A,B类寄存器的值等推入堆栈保存,把当前PC寄存器的值放入IRP/NRP寄存器中以备中断返回能找到当前被打断的位置. 3.CPU的PC指针读出中断向量表的地址,也就是把"ISTP寄存器的ISTB值+子中断向量偏移量"装入PC寄存器,这样就执行跳转. 4.在中断向量表里一般有就用跳转指令,这样就可以跳转到我们用C语言编写的中断服务子程序中.由于我们在一般的

TI C66x DSP 系统events及其应用 - 5.4(event与ISR配置)

根据5.2中的讲解,当监控high priority queue的PDSP channel设定好后,那么与之对应的event就知道了(PDSP channel与event一一对应)(注意5.x讲的是中断的配置,并不是exception的配置,4.x讲的是exception) 中断event与ISR配置代码如下,目的是使event与ISR建立联系: /*Configure event*/ EventCombinerEventConfig( systemEvent,  (TEventCombiner

TI C66x DSP 系统events及其应用 - 5.5(ISR调用)

在5.4中向event(eg,event 45)注册了callback函数(eventInterruptIsr),该函数会在什么时候调用呢? 该callback函数会在Event_CombinerIsr中断服务函数中调用,前面讲到过systemEvent 4~127作为eventCombiner的输入,而EventCombiner的输出event 0~3,event 0~3是与CPU中断输入INT4~15对应的vector 1~12绑定的(假设event 1与vector 4绑定),所以当eve

TI C66x DSP 系统events及其应用 - 5.3.1(Interrupt之eventCombiner理解)

前面讲到对于中断来说,eventCombiner将INTC的输入event 4~127分为四个group,即evenCombiner的四个输出event 0~3. 这样event 0~3与event 4~127一起作为Interrupt Sector的输入.之所以这样做是因为CPU仅有12个INT输入(INT4~15),而systemEvent有4~127共124个event,所以12个CPU的INT输入无法与systemEvent一一映射,所以自然地CPU的12个中断将会打包服务某些event

TI C66x DSP 系统events及其应用 - 5.2(PDSP配置)

本节讲述PDSP监控的配置. QMSS PDSP:The queue manager sub system contains two or eight packed data structure processors (PDSP) and associated hardware that allow autonomous QMSS-related tasks with interrupt notification. PDSPs are normally loaded with firmware

TI C66x DSP 系统events及其应用 - 4.1(Exception Combiner)

我们知道INTC根据128个system event的输入,然后输出下面的信号到INTC所在corePac的CPU: ? One maskable, hardware exception (EXCEP) ? Twelve maskable hardware interrupts (INT4 through INT15) ? One non-maskable signal that you can use as either an interrupt or an exception (NMI) ?