在CW4.6环境下,中止编程主要有两种办法:
第一种是运用“interrupt”关键字,“interrupt”关键字是一个非标准ANSI-C的关键字,因而,它不能被一切ANSI-C编译器厂商所支撑。相同,对不同的编译器,interrupt”关键字的用法可能会改动。“interrupt”关键字相同会提示编译器下面的函数是一个中止服务例程。
例: void interrupt 20 SCI0_ISR(void);
其间,interrupt表明该函数为终端服务程序,后边的20表明中止号20,在这里SCI0的中止向量号便是20.
这种办法写起来十分简略,可是,在S12单片机实际运用中,中止号并没有在手册中给出,一般需求自己在中止向量表中从上往下数出来,或许依据中止向量核算得到,很简单犯错。
所以有了第二种办法:
在ISR程序之前,运用符号“#pragma TRAP_PROC”,TRAP_PROC 提示编译器下面的函数是中止服务例程。编译器会用一个特别的中止回来指令来完毕这个函数。
此刻,中止函数的书写如下所示:
#pragma TRAP_PROC
void SCI0_ISR(void){
}
这时候编译器不知道这个ISR指向那个中止向量,咱们需求在链接文件即:prm文件中指定之。
运用 VECTOR指令来完成中止向量与ISR程序的衔接。
例:
VECTOR 0 _Startup //这是体系默许prm文件中自带的,即复位后0号中止即复位中止的ISR为_Startup()
咱们能够这样写:
VECTOR 20 SCI0_ISR //指定中止号
或许
VECTOR ADDRESS 0xFFD6 SCI0_ISR //直接指定中止向量地址
注:运用#pragma TRAP_PROC与修正prm文件的办法,在中止服务子程序的结尾处必需要手动参加回来主程序的指令,包含取出仓库、中止回来两个过程。
在S12单片机中,能够写作
asm {
}
尾注:
两种办法所写的中止服务子程序有必要被放在非分页存储区内,即non_blanked code seg.
其间一种常用的办法是在服务子程序前声明:
//下面代码放在NON_BANKED区
#pragma CODE_SEG NON_BANKED
在中止程序后声明:
//下面内容按默许放置
#pragma CODE_SEG DEFAULT