在PowerPC处理器系统中,MSI机制的实现过程是PCIe设备向MSIIR寄存器写入指定的数据。MPIC中断控制器发现该寄存器被写入后,将向处理器提交中断请求。处理器收到这个中断请求后,将通过读取MPIC中断控制器的ACK寄存器确定中断向量,并依此确定中断源。表10-3 MSIIR寄存器PCIe设备通过MSI机制,向此寄存器写入数据时,MSIR0~7寄存器的相应位SH0~31将有一位置1。......
2023-10-20
Keil Cx51编译器支持在C语言源程序中直接编写8051单片机的中断服务程序。Keil Cx51编译器对函数的定义进行了扩展,增加了一个扩展关键词interrupt,它是函数定义时的一个选项,加上这个选项即可将一个函数定义成中断服务函数。
定义中断服务函数的一般形式如下:
函数类型 函数名(形式参数表)[interrupt m][using n]
1.interrupt m修饰符
interrupt m是C51函数中一个非常重要的修饰符,这是因为中断函数必须通过它进行修饰。在C51程序设计中经常用到中断函数用于实现系统的实时性,从而提高程序的处理效率。
在C51程序设计中,当函数定义时用了interrupt m修饰符,系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按MCS-51系统中断的处理方式自动地把它安排在程序存储器中的相应位置。在该修饰符中,m的取值为0~31,对应的中断情况如下:0——外部中断0;1——定时器/计数器T0;2——外部中断1;3——定时器/计数器T1;4——串行口中断;5——定时器/计数器T2(52系列单片机具有);其他值预留。
编写MCS-51中断函数时应注意如下7项内容:
1)中断函数不能进行参数传递,如果中断函数中包含任何参数声明,都将导致编译出错。
2)中断函数没有返回值。如果试图定义一个返回值,将得不到正确的结果,建议在定义中断函数时将其定义为void类型,以明确说明没有返回值。
3)在任何情况下都不能直接调用中断函数,否则会产生编译错误。因为中断函数的返回是由8051单片机的RETI指令完成的,RETI指令影响8051单片机的硬件中断系统。若在没有实际中断情况下直接调用中断函数,RETI指令的操作结果会产生一个致命的错误。(www.chuimin.cn)
4)如果在中断函数中调用了其他函数,则被调用函数所使用的寄存器必须与中断函数相同,否则会输出不正确的结果。
5)编译器对中断函数编译时,会自动在程序开始和结束处加上相应的内容。具体如下:在程序开始处ACC,B,DPH,DPL和PSW入栈,结束时出栈;中断函数未加using n修饰符的,开始时还要将R0~R1入栈,结束时出栈;如中断函数加using n修饰符,则在开始PSW将入栈后还要修改PSW中的工作寄存器组选择位。
6)C51编译器从绝对地址8×m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。
7)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明,以防止其他程序调用。
编写一个用于统计外部中断0的中断次数的中断服务程序,具体程序如下:
2.using n修饰符
MCS-51单片机有4组工作寄存器,每组8个寄存器,分别用R0~R7表示。修饰符using n用于指定本函数内部使用的工作寄存器组,其中n的取值为0~3,表示寄存器组号。对于using n修饰符的使用,要注意以下两点:
1)加入using n后,C51编译时自动在函数的开始处和结束处加入以下指令:
2)using n修饰符不能用于有返回值的函数,因为C51函数的返回值是放在寄存器中的。如果寄存器组改变了,返回值就会出错。
有关单片机基础及应用的文章
在PowerPC处理器系统中,MSI机制的实现过程是PCIe设备向MSIIR寄存器写入指定的数据。MPIC中断控制器发现该寄存器被写入后,将向处理器提交中断请求。处理器收到这个中断请求后,将通过读取MPIC中断控制器的ACK寄存器确定中断向量,并依此确定中断源。表10-3 MSIIR寄存器PCIe设备通过MSI机制,向此寄存器写入数据时,MSIR0~7寄存器的相应位SH0~31将有一位置1。......
2023-10-20
【主要内容】1.函数微分的定义设函数y=f(x)在点x0的某个邻域内有定义.如果y在点x0处的增量Δy=f(x0+Δx)-f(x0) (其中,Δx是自变量x在点x0处的增量)可表示为Δy=AΔx+o(Δx)(其中,A与Δx无关,o(Δx)表示Δx→0时比Δx高阶的无穷小),则称y=f(x)在点x0处可微,称Δy的线性主部AΔx为y=f(x)在点x0处的微分,记为dy|x=x0(注意:函数y=f(x......
2023-10-27
复变函数的定义在形式上与一元实函数一样,只是将自变量和因变量都推广到了复数域.定义1 设D为复平面上的非空集合[1],若有一个确定的法则存在,按照这一法则,对于D 内的每一个复数z =x+iy,都有确定的复数w =u+iv 与之对应,我们称复变数w是z的复变函数,记为w =f(z).其中z称为自变量,w为因变量,集合D称为w = f(z)的定义域,与D 中所有复数z对应的w值的集合G 称为w =f......
2023-10-30
【主要内容】设二元函数z=f(x,y)在点(x0,y0)的某个邻域内有定义.如果它在点(x0,y0)处的全增量Δz=f(x0+Δx,y0+Δy)-f(x0,y0)可以表示为Δz=AΔx+BΔy+o(ρ)(其中A和B不依赖于Δx,Δy,o(ρ)是比ρ=高阶的无穷小),则称z=f(x,y)在点(x0,y0)处可微,称AΔx+BΔy为z=f(x,y)在点(x0,y0)处的全微分,记为,即注 (ⅰ)二元函......
2023-10-27
现实生活中,很多变量的变化是连续不断的,比如气温的变化、植物的生长、物体受热时面积的变化等,都是连续的变化.这种现象在数学上用函数的连续性来反映和研究.一、连续函数的概念定义1.21 在函数y=f(x)的定义域中,设自变量x由x0变到x1,差Δx=x1-x0叫做自变量x的增量(改变量),相应的函数值的差Δy=f(x1)-f(x0)=f(x0+Δx)-f(x0)叫做函数y=f(x)的增量(见图1-1......
2023-11-22
Cortex-A8处理器有40个32位寄存器,分为33个通用寄存器和7个程序状态寄存器。表2.4ARM状态下Cortex-A8寄存器组②R13是堆栈指针寄存器,用于指向堆栈区的栈顶。表2.5程序状态寄存器位格式条件代码标志位N、Z、C和V位都是条件代码标志。......
2023-11-19
预定义函数就是JavaScript已经定义好的函数,可以在程序中作为函数直接调用。eval函数的语法格式如下:其中,codeString是一字符串,该字符串的内容是一合法表达式,eval分析并运行该表达式。例如:2)isFinite函数。isFinite函数的语法格式如下:说明:如果number是一finite数,则返回true,否则返回false。parseInt函数的语法格式如下:说明:parseInt函数将字符串形式的整型数string转换为数值型的数。radix为基数,表示string的进制,如:8表示8进制,16表示16进制,默认时为10进制。......
2023-11-19
预定义的函数除了返回值之外,对参数没有任何影响,也就是说,预定义函数不会改变读者传进来的参数。调用自定义函数时,需要指定它的路径。下面介绍自定义的函数的方法。......
2023-10-30
相关推荐