|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
code warrior的中断 |
作者:lichuanfa 栏目:单片机 |
介绍介绍怎样编写code warrior的C代码的中断 |
2楼: | >>参与讨论 |
作者: JerryBJ 于 2006/11/22 23:05:00 发布:
如果你说的是8位MCU,下面的信息可以给你参考 经常使用@address来指定一个函数数组的映射地址,这个函数数组用来保存中断向量表。CPU08的中断服务函数有很多种写法,就好比孔乙己说的茴香豆的茴字有9种写法一样,但是我认为用函数指针来写的方法具有最好的可移植性和可读性。下面的就是这种中断向量表写法的一个例子。 void (* const _vect[])() @0xFFCC = { /* Interrupt vector table */ unimplemented_ISR,/* Int.no. 25 Vrti (at FFCC)Unassigned */ unimplemented_ISR,/* Int.no. 24 Viic1 (at FFCE)Unassigned */ unimplemented_ISR,/* Int.no. 23 Vadc1 (at FFD0)Unassigned */ unimplemented_ISR,/* Int.no. 22 Vkeyboard1 (at FFD2)Unassigned */ unimplemented_ISR,/* Int.no. 21 Vsci2tx (at FFD4)Unassigned */ unimplemented_ISR,/* Int.no. 20 Vsci2rx (at FFD6)Unassigned */ unimplemented_ISR,/* Int.no. 19 Vsci2err (at FFD8)Unassigned */ unimplemented_ISR,/* Int.no. 18 Vsci1tx (at FFDA)Unassigned */ unimplemented_ISR,/* Int.no. 17 Vsci1rx (at FFDC)Unassigned */ unimplemented_ISR,/* Int.no. 16 Vsci1err (at FFDE)Unassigned */ unimplemented_ISR,/* Int.no. 15 Vspi1 (at FFE0)Unassigned */ unimplemented_ISR,/* Int.no. 14 Vtpm2ovf (at FFE2)Unassigned */ unimplemented_ISR,/* Int.no. 13 Vtpm2ch1 (at FFE4)Unassigned */ unimplemented_ISR,/* Int.no. 12 Vtpm2ch0 (at FFE6)Unassigned */ ISR_Timer1Overflow,/* Int.no. 11 Vtpm1ovf (at FFE8) used */ unimplemented_ISR, /* Int.no. 10 Vtpm1ch5 (at FFEA) Unassigned */ unimplemented_ISR, /* Int.no. 9 Vtpm1ch4 (at FFEC) Unassigned */ unimplemented_ISR, /* Int.no. 8 Vtpm1ch3 (at FFEE)Unassigned */ unimplemented_ISR, /* Int.no. 7 Vtpm1ch2 (at FFF0) Unassigned */ unimplemented_ISR, /* Int.no. 6 Vtpm1ch1 (at FFF2)Unassigned */ unimplemented_ISR, /* Int.no. 5 Vtpm1ch0 (at FFF4)Unassigned */ unimplemented_ISR, /* Int.no. 4 Vicg (at FFF6)Unassigned */ unimplemented_ISR, /* Int.no. 3 Vlvd (at FFF8)Unassigned */ unimplemented_ISR, /* Int.no. 2 Virq (at FFFA)Unassigned */ unimplemented_ISR, /* Int.no. 1 Vswi (at FFFC)Unassigned */ //_Startup /* Int.no. 0 Vreset (at FFFE)Reset vector */ }; 当然,这些中断服务程序都需要在别的地方实现。 __interrupt void unimplemented_ISR(void) { } __interrupt void ISR_Timer1Overflow(void) { // your codes } 在被移植到另外一个平台上时,所有中断服务程序实现的代码都不用去改变,只要修改这个中断向量表就可以了,它的起始地址和每个入口函数的排列顺序,入口函数的个数。如果中断向量表重定位被使能,唯一需要修改的是中断向量表的起始地址。另外,每个中断向量通过这种方式都指向一个空的中断服务程序unimplemented_ISR(),即使某种没有预期的中断发生,也不会因为其中断向量没有被初始化而导致程序崩溃。 这个中断向量表的最后一个入口是复位向量,它应该指向_Startup()。但是我把它注释掉了。如果不是这样,它会和PRM中的Vector 0的指定冲突而导致编译期错误。注释中断向量表中的复位向量的另外一个好处是,如果中断向量重定位被使能,复位向量并不会被重定位,因此不应该使它和其它向量一起被移动映射地址。 |
3楼: | >>参与讨论 |
作者: lichuanfa 于 2006/11/23 9:24:00 发布:
谢谢 小弟是16位的,还须前辈指点指点 |
4楼: | >>参与讨论 |
作者: sillboy 于 2006/11/23 13:33:00 发布:
路过 |
5楼: | >>参与讨论 |
作者: 张明峰 于 2006/11/23 15:56:00 发布:
基于9S12NE64的中断服务例程 直接标明中断矢量编号,为又一种编写中断服务程序的方式。仅供参考: //============================================================== //Interrupt service rountine must put in none-banked area //============================================================== #pragma CODE_SEG __NEAR_SEG NON_BANKED //############################################################################## //############# All SCI related Interrupt Service Routines ################# //############################################################################## #pragma MESSAGE DISABLE C4002 //Ignore Result-not-used warning //============================================================== // SCI 1 data receive interrupt service routine // Assigned for RS485 half-duplex communication //============================================================== void interrupt 17 SCI1_Receive_ISR(void) { SCI1S1; commRecFifo[commPutPtr] = SCI1D; if (commFlag.rs485en) { commFlag.rs232en = 0; //inter-lock to disable other channel commPutPtr++; commPutPtr &= (COMM_FIFO_LEN-1); } } //============================================================== // SCI 1 data transmission interrupt service routine // Assigned for RS485 half-duplex communication //============================================================== void interrupt 18 SCI1_Transmit_ISR(void) { SCI1S1; SCI1D = datOutPacket[outptr++]; if (outptr==outTotal) { outptr = 0; //reset buffer pointer outTotal = 0; //reset packet counter SCI1C2_TIE = 0; //all packet data are out, no more interrupt needed commFlag.packetOut = 1; //set completion flag commFlag.transEnd = 1; //end of transmision } } //============================================================== // SCI 1 Error interrupt service routine // Assigned for RS485 half-duplex communication //============================================================== void interrupt 16 SCI1_Error_ISR(void) { while(SCI1S1&0x0f) { SCI1S1; SCI1D; } } //============================================================== // SCI 2 data receive interrupt service routine // Assigned for RS232 full-duplex communication //============================================================== void interrupt 20 SCI2_Receive_ISR(void) { SCI2S1; commRecFifo[commPutPtr] = SCI2D; if (commFlag.rs232en) { commFlag.rs485en = 0; //inter-lock to disable eother channel commPutPtr++; commPutPtr &= (COMM_FIFO_LEN-1); } } //============================================================== // SCI 2 data transmission interrupt service routine // Assigned for RS232 full-duplex communication //============================================================== void interrupt 21 SCI2_Transmit_ISR(void) { SCI2S1; SCI2D = datOutPacket[outptr++]; if (outptr==outTotal) { outptr = 0; //reset buffer pointer outTotal = 0; //reset packet counter SCI2C2_TIE = 0; //all packet data are out, no more interrupt needed commFlag.packetOut = 1; //set completion flag commFlag.transEnd = 1; //end of transmision } } //============================================================== // SCI 2 Error interrupt service routine // Assigned for RS232 full-duplex communication //============================================================== void interrupt 19 SCI2_Error_ISR(void) { while(SCI2S1&0x0f) { SCI2S1; SCI2D; } } |
6楼: | >>参与讨论 |
作者: lichuanfa 于 2006/11/24 9:23:00 发布:
我把程序贴上去,希望大家指点指点 #include <hidef.h> /* common defines and macros */ #include <MC9S12D64.h> /* derivative information */ #pragma LINK_INFO DERIVATIVE "MC9S12D64" unsigned CHAR counter; #pragma CODE_SEG __NEAR_SEG NON_BANKED #pragma TRAP_PROC interrupt void tt(void){ unsigned CHAR i; i=SCI0SR1 ; counter++; } void delay () { unsigned int i; for ( i=0x0000; i<0x8888; i++ ) asm nop; } void main(void) { /* put your own code here */ EnableInterrupts; counter=0x00; delay(); asm{ LDAB #1; STAB REFDV; LDAB #2; STAB SYNR; WAIT: BRCLR CRGFLG , #$08,*; BSET CLKSEL , #$80; SCI0INIT: LDAA #$0c8; STAA SCI0CR2 LDD #$009C; STD SCI0BD; nop; } asm nop; SCI0DRL = 0x55; while (SCI0SR1_TC==0) ; delay(); asm nop; for(;;) {} /* wait forever */ } |
7楼: | >>参与讨论 |
作者: lichuanfa 于 2006/11/25 8:57:00 发布:
多谢大家 问题已搞定,主要是编译模式的问题,感谢2楼和张教主 |
8楼: | >>参与讨论 |
作者: super323 于 2006/12/26 21:59:00 发布:
MC9S12DG128B 各位大虾,我用的是MC9S12DG128B,不知道中断矢量编号,请各位高手指点一二,先谢谢了. |
9楼: | >>参与讨论 |
作者: dyong 于 2008/4/6 17:11:07 发布:
就是啊!不知道中断矢量编号啊!那位高手指教指教啊! |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |