//使用UART2中断作软件中断 #elif SWI_NUM == 8 IE2 |=0x01;//ES2=1 //使用SPI中断作软件中断 #elif SWI_NUM == 9 AUXR1 |= 0x20;//SPI切换到P4口 SPCTL = 0xD0;//MASTER模式 IE2 |=0x02;//ESPI=1 #endif EA = 1; } void main(void) { unsigned char SwiFun_Num; int DataIn,result,i; P0 = 0xFF; P1 = 0xFF; P2 = 0xFF; P3 = 0xFF; SwiFunction_Init();//初始化软中断功能 DataIn = 0; result = 0; SwiFun_Num = 0; while(1) { SwiFun_Num++; DataIn++; SWI(SwiFun_Num,DataIn,result); //申请软中断服务 if(result != (DataIn + SwiFun_Num)) {for(;;) _nop_();}//错,停在这里 for(i=0;i<32767;i++) _nop_(); } } #ifdef SWI_NUM void SWI_ISR(void) interrupt SWI_NUM {//软中断服务函数 提供的功能是输出=输入+申请功能号 LED ^= 1;//便于观察是否进入软中断服务 CLEAR_SWI();//清除可能需要清除的标志 *(int *) OutputParameter = *(int *)InputParameter + FunctionNum; FunctionNum = 0;//清除申请功能号 } #endif 例3:一个具有动态代码执行能力的SWI演示例程(STC12C5AxxS2单片机)
#include
typedef struct Swi_List * SwiNode; typedef struct Swi_List{ unsigned int TimeDelay;//延迟多少时间开始执行,等于0表示立即执行 void (*Func)(unsigned char * pInOut);//执行的函数入口地址 unsigned char * pInOut;//执行函数的数据输入输出地址 SwiNode NextNode;//下一个节点的地址 }; SwiNode SWI_Head_Node;//系统内核使用的指针变量 #ifdef SWI_NUM unsigned char FunctionNum; SwiNode SwiIRQNode; #define SWI(a,b) \\ FunctionNum = a; \\ SwiIRQNode = b; \\ SWI_IRQ(); \\ _nop_(); #endif uint8 IICRead(uint8 *Ret,uint8 Addr,uint8 NByte) {//硬件上操作总线,完成读取功能 (省略) } uint8 IICWrite(uint8 Addr,uint8 *Data,uint8 NByte) {//硬件上操作总线,完成写入功能 (省略) } void PCF8563Read(uint8 *Data) { uint8 NByte; NByte = *Data++; IICWrite(PCF8563Addr,Data,1); IICRead(Data - 1,PCF8563Addr,NByte); } void PCF8563Write(uint8 *Data) { uint8 NByte; NByte = *Data++; NByte++; IICWrite(PCF8563Addr,Data,NByte); } void Get_Temperature(int *RegTemperature) {//读传感器的温度,传感器的地址由*RegTemperature指定 uint8 SensorAddr; uint8 TempReg[2]; SensorAddr = (uint8 *) RegTemperature;//访问的传感器地址 TempReg[0] = SENSOR_REG_TEMPERATURE; 访问传感器的温度值寄存器 IICWrite(WRITE_SENSOR_ADDR0+(SensorAddr&0x07)*2,TempReg,1);//写一个字节 IICRead(Temp, READ_SENSOR_ADDR0+(SensorAddr&0x07)*2,2);//读两个字节 *RegTemperature = (Temp [0]<<8)+ Temp [1]; } void SWI_ISR(void) interrupt SWI_NUM {//软中断服务函数 提供的服务是执行链表中的函数 if(FunctionNum == 1) {//功能1:增加软中断服务,将软中断申请放到队列中等待执行 if(SWI_Head_Node == 0) { //申请内存 SWI_Head_Node = ( SwiNode )malloc(sizeof(Swi_List_Struct)); if(SWI_Head_Node != 0) { SWI_Head_Node->TimeDelay = SwiIRQNode->TimeDelay; SWI_Head_Node->Func = SwiIRQNode->Func; SWI_Head_Node->pInOut = SwiIRQNode->pInOut; SWI_Head_Node->NextNode = 0; } } else { (省略) } } //寻找是否有就绪的软中断任务需要执行 pNode = SWI_Head_Node; pRightNode = SWI_Head_Node; for(;;) { if(pNode != 0) { if((pNode->TimeDelay)==0) {//发现一个等待执行的软中断 if(pNode == SWI_Head_Node) {//是第一个节点 if((pNode->NextNode) != 0) {//还有下一个节点 //撤销节点 SWI_Head_Node = pNode->NextNode; pRightNode = SWI_Head_Node; //执行函数 pNode->Func(pNode->pInOut); //释放内存 free(pNode); pNode = pRightNode;//指向下一个节点 } else {//没有下一个节点 (省略) } } else
相关推荐: