中断服务程序有一个特殊的定义方法: void interrupt ISR(void)其中的函数名“ISR”可以改成任意合法的字母或数字组合,但其入口参数和返回参数类型必须是“void”型,亦即没有入口参数和返回参数,且中间必须有一个关键词“interrupt”中断函数可以被放置在原程序的任意位置。因为已有关键词“interrupt”声明,PICC 在最后进行代码连接时会自动将其定位到0x0004 中断入口处,实现中断服务响应。编译器也会实现中断函数的返回指令“retfie”。
一个简单的中断服务示范函数如下:
void interrupt ISR(void) { //中断服务程序
if (T0IE && T0IF){ //判TMR0 中断
T0IF = 0; //清除TMR0 中断标志 //在此加入TMR0 中断服务
}
if (TMR1IE && TMR1IF){ //判TMR1 中断 T
MR1IF = 0; //清除TMR1 中断标志
//在此加入TMR1 中断服务
}
} //中断结束并返回
PICC 会自动加入代码实现中断现场的保护,并在中断结束时自动恢复现场,所以编程员无需象编写汇编程序那样加入中断现场保护和恢复的额外指令语句。但如果在中断服务程序中需要修改某些全局变量时,是否需要保护这些变量的初值将由编程员自己决定和实施。用C 语言编写中断服务程序必须遵循高效的原则:
z 代码尽量简短,中断服务强调的是一个“快”字。
z 避免在中断内使用函数调用。 虽然PICC 允许在中断里调用其它函数,但为了解决递归调用的问题,此函数必须为中断服务独家专用。既如此,不妨把原本要写在其它函数内的代码直接写在中断服务程序中。
z 避免在中断内进行数学运算。数学运算将很有可能用到库函数和许多中间变量,就算不出现递归调用的问题,光在中断入口和出口处为了保护和恢复这些中间临时变量就需要大量的开销,严重影响中断服务的效率。
中档系列PIC 单片机的中断入口只有一个,因此整个程序中只能有一个中断服务函数。
关键字:PIC 中断 服务程序
引用地址:
PIC 中断 服务程序
推荐阅读最新更新时间:2024-03-16 14:43
PIC单片机读写I2C实例源程序一
; this route is used I2C EESROM write and ; read; addressing mode is indirect START BSF RB_C,SDA NOP MOVFW RB_C TRIS RB BSF RB,SCL NOP BTFSS RB,SDA GOTO ^-1 BCF RB_C,SDA NOP MOVFW RB_C TRIS RB NOP BCF RB,SDA NOP NOP NOP NOP BCF RB,SCL RETLW 0H STOP BCF RB_C,SDA NOP MOVFW RB_C TRIS RB BCF RB,SDA NOP NOP NOP BSF RB,SCL
[单片机]
如何在PIC单片机的GPIO引脚上生成PWM信号
PWM信号生成是每个嵌入式工程师工具库中的重要工具,它们非常适用于控制伺服电机位置,在转换器/逆变器中切换少量电源电子集成电路等许多应用,甚至用于简单的LED亮度控制。在pic 微控制器中, pwm 信号可以通过设置所需的寄存器使用比较、捕获和 pwm (ccp) 模块生成。 如果我们使用CCP模块,PIC16F877A 只能在引脚RC1和RC2产生PWM信号,由此我们可能会遇到需要更多引脚来实现PWM功能的情况。例如,我想控制6个RC伺服电机,CCP模块是不行的。于是在这种情况下,我们可以使用定时器模块对GPIO引脚进行编程以产生PWM信号,这样我们就可以产生尽可能多的PWM信号。还可以考虑其他硬件技术,比如使用多路复用器
[单片机]
mini2440按键中断控制led灯遇到的问题
平台: xp系统,ARM mini2440 程序名:按键中断控制led灯主要学习内容,S3C2440外部中断 遇到问题 1. 超级终端下载程序时按下d后又跳回到下载界面,没有等待我下载程序、解决办法:这应该是自己的大意,按下d的时候把键盘上大写控制锁住了,超级终端只能输入小写命令,注意细节。 2. 酓ummy_isr error, interrupt number: 5, INTMSK = 0xffffffdf。下载程序后超级终端显示这句话,网上找了很久没找到很好的解决办法,不过看到有人说好像是MMU没有初始化。解决办法,初始化MMU,调用一个MMU_Init()函数就好了,这个函数的定义在MMU.c中,开始我没有添加MMU.
[单片机]
MCS-51单片机中断优先级寄存器IP的位格式及优先级的设定
MCS-51单片机具有2个 中断 优先级,均可编程设定为高优先级或低优先级。寄存器IP的位格式如下: PX0:外部中断1优先级控制位。PX1=0,设定外部中断0为高优先级中断;PX0=0,设定外部中断1为低优先级中断。 PT0:T0中断优先级控制位。PT0=1,设定定时器T0为高优先级中断;PT0=0,设定时器T0为低优先级中断。 PX1:外部中断1优先级控制位。PX1=1,设外部中断1为高优先级中断;PX1=0,设定外部中断1为低优先级中断。 PT1:T1中断优先级控制位。PT1=1,设定定时器T1为高优先级中断;PT1=0,设定定时器T1为低优先级中断。 PS:串行口中断优先级控制位。PS=1,设定串行口为高优先级中断
[单片机]
STM32F103 中断优先级理解
最近项目上用到STM32多串口通信,出现的问题是,串口都能正常收发数据,但是有一个串口发送数据帧给另一个主控时,数据帧出现了分包,我判断了一下,可能是通信串口发送中断被调试串口的打印中断给“截胡”了,所以来专门研究一下STM32的中断优先级,用更改串口优先级的方式来消除这种现象。 先看官方给的文档说明,其中有如下图: 其中有句说的很明白了,“The lower the value, the greater the priority of the corresponding interrupt.”,就是说,优先级数值越小,优先级别越高。 再看下图,了解如何配置中断优先级: 前提条件1:组别优先顺序(第0组优先
[单片机]
Tiny4412中断之看门狗
一:看门狗(WDT watch dog timer) 看门狗其实是一个计数器,它的作用就是防止程序陷入死循环或者程序运行跑飞;看门狗是一个硬件,它的工作原理是,初始化给他一个值,它会过一段时间减一,直到这个数减为0,它将会产生一个中断信号或者reset信号,致使我们系统复位,而又时候我们不想让它过一会儿就重启又想预防死机,那么我们就可以在这个数减到快要接进0的时候,给它重新赋值;这样就不会触发reset信号,但当程序跑飞时机器死机时,它就会减到零,进行操作系统复位; 具体看下图所示:输入时钟为PCLK(该时钟频率等于系统的主频),它经过两级分频(Prescaler和frequency division factor
[单片机]
Microchip全新PIC和AVR MCU在闭环控制应用中提高系统性能
从水池水泵到空气净化装置,闭环控制都是嵌入式系统最基本的任务之一。通过改进架构,PIC®和AVR® 8位单片机(MCU) 针对闭环控制进行了优化,让系统能够降低中央处理器 (CPU) 的负载,从而管理更多任务并实现节能。为了帮助设计师最大限度提高系统的性能和效率,Microchip Technology Inc.(美国微芯科技公司)日前推出了全新的PIC18 Q10和ATtiny1607系列产品,可提供多个独立于内核的智能外设 (CIP),简化开发过程,并迅速响应系统事件。 PIC18 Q10 和 ATtiny1607 MCU非常适用于使用闭环控制的应用,其主要优势是CIP能够独立管理任务,降低CPU的处理量。借助基于硬件的
[单片机]
MPC860的中断处理技术研究
摘要:MPC860是网络通信设备中应用最广的一款RISC嵌入式处理器。本文介绍MPC860的中断体系结果及中断发生后服务程序的处理流程;以SMC1的接收中断为例,阐述在设计操作系统管理的条件下,中断初始化程序和中断服务程序的编写。
关键词:嵌入式处理器 MPC860 中断体系结构 中断处理技术
引言
Motorola公司推出的MPC860 PowerQUICC是目前在通信领域应用得非常广泛的一款嵌入式处理器,被誉为MC68360 PowerQUICC在网络和数据通信领域的新一代产品。与MC68360相比,MPC860 PowerQUICC在各方面的性能,包括器件的适应性、外部扩展能力和芯片集成度等都得到了提高。
MPC8
[嵌入式]