volatile asm void _vect(void);
#pragma define_section interrupt_vectors "interrupt_vectors.text" RX
#pragma section interrupt_vectors begin
volatile asm void _vect(void)
{
JSR init_MC56F824x_5x_ISR_HW_RESET /* Interrupt no. 0 (Used) - ivINT_Reset */
JSR isrDummy /* Interrupt no. 1 (Used) - ivINT_COPReset */
JSR isrDummy /* Interrupt no. 2 (Unused) - ivINT_Illegal_Instruction */
.
.
.
JSR isrSCI0_Recv /* Interrupt no. 32 (Used) - ivINT_QSCI0_RxFull */
.
.
.
JSR isrDummy /* Interrupt no. 65 (Unused) - ivINT_GPIO_A */
JSR isrDummy /* Interrupt no. 66 (Unused) - ivINT_LP */
}
#pragma section interrupt_vectors end
其中, isrDummy的函数形式如下:
void isrDummy(void)
{
}
该函数首地址用来充当未开放模块中断的中断服务程序的首地址,加载到中断矢量表中。
4.MC56F8257中断设置过程
MC56F8257中断设置主要包括关闭总中断、设置中断屏蔽和开放总中断三个过程。中断的设置过程在主函数和中断服务程序中都得体现,但二者中设置过程有所差异。
主函数中的中断设置过程除了包括上述三个过程外,还包括开放模块中断及设置中断优先级,具体流程如下:一是关闭总中断,目的是实现后续各个模块中断设置过程中不被外界干扰;二是开放模块中断,如果需要某个模块中断,可以使能该模块中断;三是设置各模块中断优先级,主要应用于多个中断请求的情况。在这种情况下,根据应用环境决定各个模块中断优先顺序,设置中断优先级。如果不设置优先级,系统会自动产生默认的优先级;四是设置中断屏蔽,通过屏蔽一定级别的中断,使系统避免受其干扰;五开放总中断,在上述设置步骤完成后,通过开放总中断,使其设置有效。
中断服务程序中的中断设置包括关闭总中断、设置中断屏蔽和开放总中断三个过程。关闭总中断和开放总中断过程同主函数,设置中断屏蔽过程与主函数类似,但需要注意的是主函数与中断服务程序中的中断屏蔽设置中应保证所需的中断不被屏蔽。
5.测试及其分析
5.1 测试条件与环境
现以MC56F8257中的QSCI模块中断及CAN模块中断为例,说明上述中断设置方法及实施过程,并对其过程进行分析。选用QSCI模块的QSCI0传输数据,波特率设为9600。CAN模块接收数据,CAN通信频率为800KHz。程序编译调试环境为CodeWarrior 10.4。测试环境为串口调试工具SSCOM V2.0。
5.2 测试结果与分析
从不带中断优先级、带中断优先级和优先级嵌套三个方面,测试分析MC56F8257中断设置及实施过程。
(1)不带中断优先级
开放QSCI0接收中断,不设置其中断优先级,采用系统默认优先级2,不屏蔽该级别中断,其主函数和中断服务程序中的中断代码如表3所示。

从表3看出,代码DisableInterrupt()在主函数和中断服务程序中都有,但作用不一样。在主函数中的作用是禁止所有中断,为后续中断设置提供良好环境;中断服务程序中的作用是禁止其他中断,防止中断的嵌套。EnableQSCIReInt(0)使能QSCI0接收中断。EnInt(2)使能2,3级别的中断。主函数和中断服务程序中的EnableInterrupt()作用是开放总中断。
运行程序,从串口调试工具SSCOM V2.0发送字符“a”给MC56F8257,MC56F8257的QSCI0中断接收,并将接收的数据发送给PC机,显示串口调试工具窗口中,具体结果如图2(a)所示。
如果屏蔽QSCI0接收中断的默认优先级2,其主函数和QSCI接收中断服务程序中的中断代码有所不同,具体见表4所示。

从表4看出,代码EnInt(3)屏蔽了中断优先级0、1和2,只允许优先级为3的中断,无法响应优先级为2的QSCI0接收中断。测试条件同上,其结果如图4(b)所示。从图4(b)看出,接收不到字符“a”。

(a)不屏蔽QSCI0接收中断的结果

(b) 屏蔽QSCI0接收中断的结果
图4 不带中断优先级的QSCI0中断接收结果
(2)带中断优先级
开放QSCI0接收中断,设置其中断优先级,不屏蔽该级别中断,其主函数和中断服务程序中的中断代码如表5所示。

从表5看出,代码Qsci Priority的作用是设置QSCI0接收中断优先级为0;EnInt(0)使能0,1,2,3级别的中断。测试条件同上,其结果如图3(a)所示。从图3(a)看出,同样也能接收到字符“a”。
如果屏蔽QSCI0接收中断的优先级0,其主函数和QSCI接收中断服务程序中的中断代码有所不同,具体见表6所示。

从表6看出,代码EnInt(1) 屏蔽了中断优先级0,允许优先级为1,2,3的中断,因此QSCI0接收中断被屏蔽,其测试结果如图5(b)所示。从图5(b)看出,同样接收不到字符“a”。

(a)不屏蔽QSCI0接收中断的结果

(b) 屏蔽QSCI0接收中断的结果
图5 带中断优先级的QSCI0中断接收结果
(3)优先级嵌套
同时开放QSCI0接收中断和CAN模块接收中断,并且前者优先级高于后者,其主函数和中断服务程序中的中断代码如表7所示。

从表7看出,代码Qsci Priority设定QSCI0接收中断的优先级为1,CANPriority 设定CAN接收中断的优先级为0,即QSCI0接收中断的优先级高于CAN接收中断。
运行程序,当仅有CAN接收中断请求时,CAN接收中断服务程序接收字符串“CANMessage”,并通过QSCI0将该字符发送给串口调试工具,如图6(a)所示。如果在这个过程中,又有QSCI0接收中断请求,CPU则暂停CAN接收中断服务程序的执行,转向QSCI0接收中断服务程序处理,从串口调试工具窗口接收字符“a”,并发送给串口调试工具窗口。将QSCI0接收中断服务程序执行完成后,返回CAN接收中断服务程序继续执行,其结果如图6(a)所示。
如果开放QSCI0接收中断和CAN模块接收中断,并且前者优先级低于后者,其主函数和中断服务程序中的中断代码如表8所示。

从表8看出,代码Qsci Priority设定QSCI0接收中断的优先级为0,CANPriority设定CAN接收中断的优先级为1,即QSCI0接收中断的优先级低于CAN接收中断。
运行程序,当仅有CAN接收中断请求时,CAN接收中断服务程序接收字符串“CANMessage”,并通过QSCI0将该字符发送给串口调试工具,如图6(b)所示。如果在这个过程中,又有QSCI0接收中断请求,CPU则不会响应其请求,继续执行CAN接收中断服务程序,继续发送字符串“CANMessage” 给串口调试工具,如图6(b)所示。

(a) QSCI0接收中断优先级高于CAN模块接收中断
上一页 [1] [2] [3] 下一页
本文关键字:控制器 DSP/FPGA技术,单片机-工控设备 - DSP/FPGA技术