登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

code warrior的中断

作者:lichuanfa 栏目:单片机
code warrior的中断
介绍介绍怎样编写code warrior的C代码的中断

2楼: >>参与讨论
JerryBJ
如果你说的是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
谢谢
小弟是16位的,还须前辈指点指点

4楼: >>参与讨论
sillboy
路过
 
5楼: >>参与讨论
张明峰
基于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
我把程序贴上去,希望大家指点指点
#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
多谢大家
问题已搞定,主要是编译模式的问题,感谢2楼和张教主

8楼: >>参与讨论
super323
MC9S12DG128B
各位大虾,我用的是MC9S12DG128B,不知道中断矢量编号,请各位高手指点一二,先谢谢了.

9楼: >>参与讨论
dyong

就是啊!不知道中断矢量编号啊!那位高手指教指教啊!

参与讨论
昵称:
讨论内容:
 
 
相关帖子
求助AD7712
c程序中如何初始化堆栈?
freescale 单片机学习的一些经验分享.
自制开发工具
求AW系统模拟EEPROM的例程
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号