interrupt、using关键字的用法
几种单片机的中断函数写法
几种单片机的中断函数写法写单片机程序,中断是免不了的。
我比较喜欢用C写单片机程序,简单而且可读性高,当然程序效率没有汇编的高。
目前写过51单片机跟AVR单片机的C程序,最近在看MSP430的书。
用C写不同的单片机程序其实都是大同小异,因此能对不熟悉的单片机也能很快上手写程序。
不过中断函数的写法,各个编译器往往都会有些差别。
最早写的C程序是51单片机的,用的编译器自然是大名鼎鼎的keil c了。
Keil的功能还是非常强劲的,不仅能编译,还有软件仿真调试与硬件调试的功能。
由于条件简陋,没用过什么仿真器,一直都是靠软件仿真调试程序的。
Keil 中的中断函数一般格式如下:void 函数名() interrupt n using n{…….}其中函数名可以任意取,关键字interrupt用来指明这是一个中断服务函数,后面的n 表示中断号,关键字using加后面的n表示使用哪一组寄存器。
后然接触到AVR的单片机,该单片机开发环境一般用ICC或者是GCC。
由于ICC是商用软件,而GCC是免费的,因此我一般用GCC来写AVR的C程序。
现在版本的GCC for AVR有了一些改进,对于中断函数支持两种关键字ISR与SIGNAL,其格式如下:ISR(vect){………}与SIGNAL(vect){……..}其中的vect就是中断向量名,根据不同的型号的AVR单片机的不同的中断源都会有相对应的中断向量名,比如外部中断0对于ISR格式的中断向量名为INT0_vect,对SIGNAL则为SIG_INTERRUPT0。
最近在看TI的MSP430系列单片机的资料,看到该单片机采用C430写的中断服务函数有点像前两种的综合,其格式如下:interrupt [vect] void 函数名(void){…….}其中vect也是中断向量名,函数名可以任取。
比较这几种中断函数写法,本人更倾向于AVR的GCC的写法。
首先对于中断函数来说即不能有输入参数又没有返回值,没必要再给它加个“void 函数名(void)”的形式的函数。
c51中interrupt关键字的作用
c51中interrupt关键字的作用C51中interrupt关键字的作用C51是一种经典的单片机开发工具,具有广泛的应用范围。
在C51中,interrupt关键字起着非常重要的作用,它用于定义中断服务函数,实现单片机的中断功能。
本文将详细介绍C51中interrupt 关键字的作用及其应用。
一、中断的概念及作用在单片机系统中,中断是指由硬件或软件触发的一种特殊事件,它可以打断程序的正常执行流程,转而执行一段预定义的中断服务函数。
中断的作用在于实现对特定事件的及时响应,提高系统的实时性和可靠性。
二、中断的分类在C51中,中断可以分为外部中断和定时器中断两种。
1. 外部中断:C51单片机通常具有多个外部中断引脚,当外部中断引脚的电平发生变化时,会触发相应的中断事件。
外部中断常用于实现对外部事件的响应,如按键输入、传感器信号等。
2. 定时器中断:C51单片机通常具有多个定时器模块,定时器中断可以根据计时器的设定时间周期性地触发中断事件。
定时器中断常用于实现定时任务,如周期性的数据采集、数据发送等。
三、使用interrupt关键字定义中断服务函数为了实现中断功能,C51提供了interrupt关键字,用于定义中断服务函数。
使用interrupt关键字定义的函数,会在相应的中断事件发生时自动被调用。
下面是使用interrupt关键字定义外部中断服务函数的示例代码:```c#include <reg51.h>void ExternalInterrupt() interrupt 0{// 中断服务函数的代码}void main(){// 主函数的代码}```在上述示例代码中,使用interrupt关键字定义了一个外部中断服务函数ExternalInterrupt,并使用interrupt 0指定了它对应的中断号。
当外部中断0事件发生时,该中断服务函数会被自动调用。
类似地,使用interrupt关键字定义定时器中断服务函数的示例代码如下:```c#include <reg51.h>void TimerInterrupt() interrupt 1{// 中断服务函数的代码}void main(){// 主函数的代码}```在上述示例代码中,使用interrupt关键字定义了一个定时器中断服务函数TimerInterrupt,并使用interrupt 1指定了它对应的中断号。
c#中using 主要用法
C#中using 主要用法
using关键字在C#中有三个主要用法:
1.引入命名空间:using可以用于导入命名空间,简化命名空间的调用。
例如:
这里using System;导入了System命名空间,所以我们可以直接调用Console.WriteLine方法,而不需要写成System.Console.WriteLine。
2.引入类型:using还可以直接导入一个类型,使我们在该作用域内可以直接使用那个类型的
简称。
例如:
3.资源释放:使用using可以确保在结束作用域时会自动释放被引入的资源。
典型的例子是
文件资源:
这相当于将在finally块中调用fs.Close()来确保文件资源被释放。
这可以避免资源释放时出现异常导致资源未关闭的问题。
using关键字让C#的语法更加简洁高效。
熟练掌握using的各种用法,可以极大提高我们的编程效率和程序的可靠性。
理解资源管理和异常处理的重要性,也是成为一名outstanding程序员必备的素质。
中断interrupt using3的解析
}
在默认状态下,func使用寄存器组0(BANK0),那么当int_0调用func时是否存在当传递参数时会造成参数传递错误?
谢谢!
如果在中断服务函数 ISR 中使用寄存器,那么必须处理好 using 的使用问题:
1、中断服务函数使用 using 指定与主函数不同的寄存器组(主函数一般使用 Register bank 0)。
举一例子:当需要在中断内和中断外调用同一个函数,假定按照程序的流程控制,不会出现函数的递归调用现象,这样的调用会不会出现问题?若确定不会发生重入情况,则有以下两种情况:
1、如果 ISR 和主程序使用同一寄存器组(主程序缺省使用BANK 0,若 ISR 没有使用 using 为其指定寄存器区,则缺省也使用 BANK 0),则不需其他设置。
void intersvr0(void) interrupt 0 using 1(2008-01-11 16:47:33)转载▼标签: 杂谈 分类: 技术文章(电子)
void←这里的void表示函数类型
interrupt 0 ←这里的0表示中断源编号
using 1 ←这里的1表示选用的寄存器组别
串行口TI/RI 00023H TI/RI
中断优先级别从上到下依次降低
8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的 64K 字节可寻址数据和代码区。中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务
2、中断优先级相同的ISR 可用 using 指定相同的寄存器组,但优先级不同的 ISR 必须使用不同的寄存器组,在 ISR 中被调用的函数也要使用 using 指定与中断函数相同的寄存器组。
interrupt、using关键字的用法
interrupt、using关键字的用法C语言在8051单片机上的扩展(interrupt、using关键字的用法)直接访问寄存器和端口定义sfr P0 0x80sfr P1 0x81sfr ADCON; 0xDEsbit EA 0x9F操作ADCON = 0x08 ;P1 = 0xFF ;io_status = P0 ;EA = 1 ;在使用了interrupt 1 关键字之后,会自动生成中断向量在ISR中不能与其他"后台循环代码"(the background loop code) 共享局部变量因为连接器会复用在RAM中这些变量的位置,所以它们会有不同的意义,这取决于当前使用的不同的函数复用变量对RAM有限的51来将很重要。
所以,这些函数希望按照一定的顺序执行而不被中断。
timer0_int() interrupt 1 using 2{unsigned char temp1 ;unsigned char temp2 ;executable C statements ;}"interrupt"声明表示向量生成在(8*n+3),这里,n就是interrupt参数后的那个数字这里,在08H的代码区域生成LJMP timer0_int 这样一条指令"using" tells the compiler to switch register banks on entry to an interrupt routine. This "context" switch is the fastest way of providing a fresh registerbank for an interrupt routine's local data and is to be preferred to stacking registers for very time-critical routines. Note that interrupts of the same priority can share a register bank, since there is no risk that they will interrupt each other.'using' 告诉编译器在进入中断处理器去切换寄存器的bank。
基于C51中断过程及interrupt和using的使用
基于C51中断过程及interrupt和using的使用
8051 系列MCU 的基本结构包括:32 个I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的64K 字节可寻址数据和代码区。
中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务。
处理程序。
中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。
8051的中断向量表如下:中断源中断向量
---------------------------
上电复位0000H
外部中断0 0003H
定时器0 溢出000BH
外部中断1 0013H
定时器1 溢出001BH
串行口中断0023H
定时器2 溢出002BH
interrupt 和using 都是C51 的关键字。
C51 中断过程通过使用interrupt 关键字和中断号(0 到31)来实现。
中断号指明编译器中断程序的入口地址中断序号对应着8051中断使能寄存器IE 中的使能位,对应关系如下:
IE寄存器C51中的8051的
的使能位中断号中断源
--------------------------------
IE.0 0 外部中断0
IE.1 1 定时器0 溢出。
中断函数
中断函数类型void,说明中断函数是不能有返回值的,这点要明确,所以不要企图让中断函数给你个返回值。还有,函数名后面括弧内是没有参数的。。。这点也需要注意,中断函数不能传递参数。interrupt 后面的点是中断号。重点我给你解释下using。这是C51编译器扩展的关键字。用来选择80c51单片机中不同的寄存器组,你也知道R0-R7总共有4组,那么using 后面的数字也就是0-3范围里的一个数了。如果不需要using的话,编译器会自动选择一组寄存器作为绝对寄存器访问的。using对代码是有一定的影响的。给你说个简单的例子,你可以想下,如果定义 void time0() interrupt 1 using 1假设,我们又在中断里调用了一个delay();这个delay是起延时作用。那么,我们就需要确保我们使用的寄存器组是同一组,否则,就会出现混乱。
void INT0()interrupt 0 using 1
{....
.....
}
interrupt 0 指明是外部中断0;
interrupt 1 指明是定时器中断0;
interrupt 2 指明是外部中断1;
interrupt 3 指明是定时器中断1;
interrupt 4 指明是串行口中断;
using 3时设置 RS1=1,RS0 =1,用第3组寄存器,R0--R7的在数据存储区里的实际地址是18H-1FH。R0(18H)....R7(1Fቤተ መጻሕፍቲ ባይዱ)
using 1时设置 RS1=0,RS0 =1,用第1组寄存器,R0--R7的在数据存储区里的实际地址是08H-0FH。R0(08H)....R7(0FH)
c51中interrupt关键字的作用
c51中interrupt关键字的作用C51中interrupt关键字的作用C51是一种常用的单片机系列,其中的interrupt关键字在编程中扮演着重要的角色。
本文将介绍C51中interrupt关键字的作用及其在单片机编程中的应用。
我们来了解一下interrupt关键字的作用。
在C51中,interrupt 关键字用于定义中断服务程序(Interrupt Service Routine,简称ISR),它告诉编译器该函数是一个中断服务程序,需要在特定的中断事件发生时被调用执行。
通过使用interrupt关键字,我们可以方便地编写和管理中断服务程序,实现对特定事件的响应和处理。
在C51中,中断服务程序通常通过外部中断或定时器中断来触发。
当外部中断或定时器中断事件发生时,CPU会立即暂停当前的任务,转而执行相应的中断服务程序。
这种机制使得单片机可以实现实时响应和处理外部输入信号或定时事件,提高了系统的可靠性和灵活性。
在编写中断服务程序时,我们需要注意一些重要的细节。
首先,中断服务程序需要使用interrupt关键字进行声明,并指定相应的中断号。
例如,使用interrupt 0关键字可以声明一个外部中断0的中断服务程序。
其次,中断服务程序需要保证执行时间尽量短,以免影响到其他任务的正常运行。
通常情况下,中断服务程序只做一些简单的处理,如更新标志位、读取外部输入信号等,复杂的计算和操作应尽量避免。
此外,中断服务程序中要注意对共享资源的保护,避免多个中断同时访问同一资源而引发冲突。
除了中断服务程序的编写,我们还需要在主程序中配置和启用中断。
在C51中,通过设置相应的中断使能位和中断优先级,我们可以控制中断的触发和响应顺序。
通常情况下,我们会根据实际需求和系统的特点来设置中断的优先级,以确保高优先级的中断能够及时响应并处理。
在单片机编程中,中断的应用非常广泛。
例如,我们可以利用外部中断来响应外部输入信号,如按键、传感器等。
interrupt_和_using_在C51中断中的使用
的使能位 中断号 中断源
--------------------------------
IE.0 0 外部中断0
IE.1 1 定时器0 溢出
IE.2 2 外部中断1
IE.3 3 定时器1 溢出
IE.4 4 串口中断
IE.5 5 定时器2 溢出 有了这一声明,编译器不需理会寄存器组参数的使用和对累加器A、状态寄存器、寄存器B、数据指针和默认的寄存器的保护。只要在中断程序中用 到,编译器会把它们压栈,在中断程序结束时将他们出栈。C51 支持所有 5 个 8051 标准中断从 0 到 4 和在 8051 系列(增强型)中多达 27 个中断源。
2、中断优先级相同的ISR 可用 using 指定相同的寄存器组,但优先级不同的 ISR 必须使用不同的寄存器组,在 ISR 中被调用的函数也要使用 using 指定与中断函数相同的寄存器组。
3、如果不用 using 指定,在 ISR 的入口,C51 默认选择寄存器组0,这相当于中断服务程序的入口首先执行指令:
0 外部中断0Βιβλιοθήκη 1 定时器02 外部中断1
3 定时器1
4 串行中断
其它的根举相应得单片机有自己的含义,实际上c载编译的时候就是把你这个函数的入口地址方到这个对应中断的跳转地址
using y 这个y是说这个中断函数使用的那个寄存器组就是51里面一般有4个 r0 -- r7寄存器,如果你的终端函数和别的程序用的不是同一个寄存 器组则进入中断的时候就不会将寄存器组压入堆栈返回时也不会弹出来节省代码和时间一般只有using 0,1,2,3 单片机中断响应可以分为以下几个步骤:1、停止主程序运行。当前指令执行完后立即终止现行程序的运行。2、保护断点。把程序计数器PC 的当 前值压入堆栈,保存终止的地址(即断点地址),以便从中断服务程序返回时能继续执行该程序,3、寻找中断入口。根据5 个不同的中断源所产 生的中断,查找5 个不同的入口地址。4、执行中断处理程序。这就不讲了;5、中断返回。执行完中断处理程序后,就从中断处返回到主程序,继 续往下执行。
Keil C51中using的用法
Keil C51 中using 的用法
Keil C51 中using 的用法在C51 中断程序中很多时候会用到using 关键字,但是很多人并不明白到底是什么意思,这里转帖一篇帮助大家理解。
如果在中断服务函数ISR 中使用寄存器,那么必须处理好using 的使用问题:
1、中断服务函数使用using 指定与主函数不同的寄存器组(主函数一般使用Register bank 0)。
2、中断优先级相同的ISR 可用using 指定相同的寄存器组,但优先级不同的ISR 必须使用不同的寄存器组,在ISR 中被调用的函数也要使用using 指定与中断函数相同的寄存器组。
3、如果不用using 指定,在ISR 的入口,c51 默认选择寄存器组0,这相当于中断服务程序的入口首先执行指令:
MOV PSW #0
这点保证了,没使用using 指定的高优先级中断。
可以中断使用不同的寄存器组的低优先级中断。
4、使用using 关键字给中断指定寄存器组,这样直接切换寄存器组而不必进行大量的PUSH 和POP 操作,可以节省RAM 空间,加速MCU 执行时间。
寄存器组的切换,总的来说比较容易出错,要对内存的使用情况有比
较清晰的认识,其正确性要由你自己来保证。
特别在程序中有直接地址访问的
时候,一定要小心谨慎!至于什么时候要用到寄存器组切换,一种情况是:当
你试图让两个(或以上)作业同时运行,而且它们的现场需要一些隔离的时候,就会用上了。
在ISR 或使用实时操作系统RTOS 中,寄存器非常有用。
寄存器组使用的原则:。
C51的中断函数
C51的中断函数C51的中断函数的格式为:void FuncIr(void) interrupt x [using y]以下是一些分析:一、中断函数是一个特殊的函数,没有参数,也没有返回值;但是程序中允不允许使用return呢?答案是允许的,不过只能用"return;",不能用"return(z);";用在一些需要快速返回的地方,对应的汇编会有多个ret语句,相对效率会高一些。
二、using的用法,using可以修饰任何函数,不过个人建议只用来修饰中断函数;简单的说,“using”会指定工作寄存器组,由于中断函数一般都是比较紧急的事情,有时一条语句都会斤斤计较,所以使用using切换寄存器组可以省去一些压栈的动作,由于51只有两级中断,同级中断不能被打断,因此,我们可以同级中断设成同样的寄存器组,从某种意义上来说,有一组寄存器是多余的。
同时个人建议中断函数应该使用using这个关键字。
三、中断中调用函数,首先要讨论中断函数中调用函数的必要性,前天在论坛上我和别人争论过这个问题,现在我还是这个观点:有些情况中断中调用函数还是必要的,这个时候是不是该调用函数,其实和普通函数差不多,首先是这个函数如果调用多次,或者要带一些参数什么的就更加必要的;前天有人跟我叫劲,说假如只调用一次且无参数无返回的函数要直接写,因为如果用函数,至少会增加CALL和RET两条语句,我不敢苟同,我是实际调试发现的,当你程序比较复杂时,你将那部分单独拉出来做成函数,可能代码和时间都会更好。
四、中断中调用的函数最好不要被中断外的其它函数调用,因为会出现“重复调用”的警告,有时这种调用是很致命的,有人说这个函数可以用reentrant来修饰,是的,的确可以这样解决,不过个人不建议这么做,也许这样会跟你减少很多堆栈空间,并且整个程序的优化要差很多,个人建议出现这种情况就把这个函数写两遍,分成两个函数分别调用。
using 用法
using 用法使用'using'关键字是在C#中引入命名空间的常见方式之一。
在C#中,命名空间是一种组织和分类代码的方法,它允许将相关的类、结构体、接口和其他类型分组在一起。
'using'关键字使我们可以在代码中使用特定命名空间中的类型,而无需在每个类型前面都写出完整的命名空间路径。
使用'using'关键字有两种常见的方式:1. 引用单个命名空间:当我们只想使用一个特定的命名空间中的类型时,可以使用'using'关键字。
例如,如果我们想使用System命名空间中的Console类,则可以在代码文件的顶部添加如下代码:```csharpusing System;```然后,我们就可以直接使用Console类,而无需在每个使用的地方都写出完整的命名空间路径。
例如:```csharpConsole.WriteLine('Hello World!');```2. 引用多个命名空间:如果我们需要使用多个命名空间中的类型,可以通过使用逗号分隔的形式在一行中引用多个命名空间。
例如,如果我们需要同时使用System和System.Collections.Generic命名空间中的类型,可以这样写:```csharpusing System, System.Collections.Generic;```然后,我们就可以使用这两个命名空间中的类型,而无需在每个使用的地方都写出完整的命名空间路径。
需要注意的是,使用'using'关键字只是为了方便使用命名空间中的类型,并不会将整个命名空间包含在代码文件中。
这意味着,如果我们只使用了一个命名空间中的几个类型,那么最终编译后的代码中也只会包含这些类型的相关信息。
总之,使用'using'关键字可以简化代码中对命名空间中类型的使用,并提高代码的可读性。
using关键字的作用
using关键字的作⽤1. 通常using关键字⽤来声明当前⽂件的命名空间,⽐如声明标准库的命名空间std:using namespace std;但是在c++11中,还有其他的⽤处2.给变量定义别名⽤法例如:using unit = unsigned int;使⽤类型别名unit代替unsigned int3.在⼦类中使⽤using声明引⼊基类成员名称1. 解除因继承导致的成员保护或私有化限制,将基类成员引⼊到派⽣类的相应访问控制区域内,便可按照相应规则访问该基成员; #include <iostream>using namespace std;class Base {public:void foo(float a) {cout << "Base::foo" << endl;}};class Derived: private Base {public:using Base::foo;// void foo(int a) {cout << "Derived::foo" << endl;} // 第9⾏};int main(){Derived d;d.foo(3);return 0;}// 注释掉第9⾏结果:Base::foo// 不注释掉第9⾏结果:Derived::foo/*在private或者protected继承时,基类成员的访问级别在派⽣类中受限:在这⼀继承层次中,成员函数foo在Base中为public,但在Derived中为private。
为了使它在Derived中成为public,可以在Derived的public部分增加⼀个using声明。
改变Derived的定义,可以使foo成员能够被⽤户访问*/2. 派⽣类欲重载基类成员(正常情况下,基类函数会被重写,如果派⽣类需要重载需要为每个派⽣类重写基类函数);#include <iostream>using namespace std;class Base {public:void foo(float a) {cout << "Base::foo_float" << endl;}void foo(char a) {cout << "Base::foo_char" << endl;}};class Derive : public Base {public:using Base::foo; // 第9⾏,获得基类所有此函数的重载版本,void foo(int* a) {cout << "Derive::foo_int*" << endl;}};int main(){Derive d;int a = 8;int * b = &a;d.foo(float(8.0)); // 第18⾏return 0;}// 如果注释掉第9⾏,则第18⾏会报错// 结果 Base::foo_float/*如果基类中成员函数有多个重载版本,派⽣类可以重定义所继承的0个或多个版本,但是通过派⽣类型只能访问派⽣类中重定义的那些版本,所以如果派⽣类想通过⾃⾝类型使⽤所有的重载版本,则派⽣类必须要么重定义所有重载版本,要么⼀个也不重定义。
中断函数的使用
中断函数的使用:《单片机C语言编程与实例》中断函数通过使用interrupt关键字和中断编号0-4来实现。
使用该扩展属性的函数声明语法如下:返回值函数名interrupt nN对应中断源的编号中断编号告诉编译器中断程序的入口地址,它对应者IE寄存器中的使能位,即IE寄存器中的0位对应着的外部中断0,相应的外部中断0的中断编号是0。
当正在执行一个特定任务是,可能有更紧急的事情需要CPU处理,这就涉及到终端优先级,搞优先级的中断可以中断正在处理的底有限级中断程序,因而最好给每种优先级分配不同的寄存器组。
在c51中可以使用using制定的寄存器组,using后的变量为0-3的长整数,分别表示51单片机内的四个寄存器组。
中断函数的完整语法及实例如下:返回值函数名(【参数】)【模式】【重入】interrupt n [using n] Unsigned int interruptent;Unsigned char second;V oid time0(void)interrupt 1 using 2{if(++interruptent==4000) %计数到4000{second++; % 另一个计数器Interruptent=0; %计数器清零}}要是摸个中断源的申请得到相应,必须保证EA=1和相应的允许位为1定义中断服务函数的一般形式为::函数类型函数名(形式参数表)[interrupt n][using n]Interrupt 后面的n是中断号,n的取值范围为0-31,编译器从8n+3处产生中断向量。
11.111111外部中断例题:通过P1.7口电量发光二极管,然后外部输入一脉冲串,则发光二极管亮、暗交替#include <REGX51.H>Sbit P1_7=P1^7;V oid tnterrupt0()interrupt 0 using 2//定义定时器0{ P1_7=!P1^7;}V oid main(){EA=1;//开启总中断IT0=1;//外部中断0低电平触发EX0=1; //外部中断0P1_7=0;Do()while(1);}2222相套中断外部中断INT1触发后,启动计数器0,计数达到10次后停止计数,启动定时器1,由定时器1控制定时,由P1.7输出周期为200ms的方波性能好,接受2次中断后关闭方波发生器,P1.7置低。
c中using的用法
c中using的用法c中using的用法的用法你知道吗?下面小编就跟你们详细介绍下c中using的用法的用法,希望对你们有用。
c中using的用法的用法如下:using 关键字有两个主要用途:作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。
请参见 using 指令。
作为语句,用于定义一个范围,在此范围的末尾将释放对象。
请参见 using 语句。
好了我们看到了MSDN给了我们答案,其中using只要有两种用法一种是指令、另一种是语句。
那我们从指令开始吧,而在MSDN中指令又有两种用法1.允许在命名空间中使用类型,这样,您就不必在该命名空间中限定某个类型的使用:using System.Text;2为命名空间或类型创建别名。
using Project = PC.MyCompany.Project;(1.1)第一种我们在熟悉不过了,但是你知道vs的编译过程吗。
当我们创建一个控制台应用程序,系统为我们生成了很多个默认的using空间。
例如:1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;但是当我们写一个hello world 程序的时候,真正用到的只有using System这个空间。
可能你会说那我们引用这么多空间干嘛,不会占用资源吗?这里我来告诉你答案。
虽然我们引用了很多多余的空间但是我们的vs却帮我们在内存中引用了它需要的那些。
当然从我们角度看,有没有办法去掉那些我们不需要的命名空间呢?这里我告诉你一种办法。
当我们做好整个项目的时候我们在using的区域内右击-----组织using------移除和排序,这样就可以去掉那些不需要的了。
(1.2)为命名空间或类型创建别名。
这个用到的不是很多,但是讲到了那我们就详细点。
当我们在一个命名空间内调用一个类的时候,没有有问题的。
c51 using用法
MOV PSW #0
这点保证了,没使用 using 指定的高优先级中断。可以中断使用不同的寄存器组的低优先级中断。
4、 使用 using 关键字给中断指定寄存器组,这样直接切换寄存器组而不必进行大量的 PUSH 和 POP 操作,可以节省RAM空间,加速 MCU 执行时间。寄存器组的切换,总的来说比较容易出错,要对内存的使用情况有比较清晰的认识,其正确性要由你自己来保证。特别在程序中有直接地址访问的时候, 一定要小心谨慎!至于“什么时候要用到寄存器组切换”,一种情况是:当你试图让两个(或以上)作业同时运行,而且它们的现场需要一些隔离的时候,就会用上 了。在 ISR 或使用实时操作系统RTOS 中,寄存器非常有用。
IE寄存器 C51中的 8051的
的使能位 中断号 中断源
--------------------------------
IE.0 0 外部中断0
IE.1 1 定时器0 溢出
IE.2 2 外部中断1
IE.3 3 定时器Байду номын сангаас 溢出
IE.4 4 串口中断
IE.5 5 定时器2 溢出
有 了这一声明,编译器不需理会寄存器组参数的使用和对累加器A、状态寄存器、寄存器B、数据指针和默认的寄存器的保护。只要在中断程序中用到,编译器会把它 们压栈,在中断程序结束时将他们出栈。C51 支持所有 5 个 8051 标准中断从 0 到 4 和在 8051 系列(增强型)中多达 27 个中断源。
interrupt 和 using 在C51中断中的使用
8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的 64K 字节可寻址数据和代码区。中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务
c51中interrupt关键字的作用
c51中interrupt关键字的作用C51中interrupt关键字的作用C51是一种广泛应用于嵌入式系统中的8位单片机,而interrupt 关键字是C51中一个重要的功能。
本文将详细介绍interrupt关键字的作用及其在C51中的应用。
一、interrupt关键字的作用在C51中,interrupt关键字用于声明中断服务程序(Interrupt Service Routine,简称ISR)。
ISR是一种特殊的函数,用于处理发生的中断事件。
当发生中断事件时,CPU会暂停当前正在执行的任务,转而执行ISR。
中断可以是外部设备的信号,如按键、定时器、串口等,也可以是软件产生的中断信号。
interrupt关键字的作用是告诉编译器,以下函数是一个中断服务程序,需要特殊的处理和编译。
使用interrupt关键字声明的函数,编译器会为其生成特殊的中断向量表,以便在中断事件发生时,正确地跳转到对应的ISR。
二、interrupt关键字的使用在C51中,使用interrupt关键字声明中断服务程序的语法如下:```cvoid interrupt ISR_Name(void){// 中断服务程序的代码}```其中,ISR_Name是中断服务程序的名称,可以根据实际需要进行命名。
中断服务程序的代码可以根据具体的需求进行编写,例如读取外部设备的状态、处理数据等。
需要注意的是,中断服务程序的执行时间应尽可能短,以免影响其他任务的正常运行。
在中断服务程序中,应尽量避免使用复杂的操作和延时函数,以提高系统的响应速度。
三、中断优先级C51中的中断可以设置不同的优先级,以确定在多个中断事件同时发生时,CPU应该首先响应哪个中断。
通过设置中断优先级,可以灵活地控制系统的中断处理顺序。
C51中,可以通过设置中断优先级来控制中断的响应顺序。
具体的设置方法因不同的单片机而有所差异,在此不再赘述。
四、禁止和使能中断在某些情况下,需要临时禁止中断的发生,以防止中断事件对系统造成干扰。
c语言using的用法
c语言using的用法推荐文章学校语言文字2019年度工作计划热度: 2019学校语言文字工作计划热度: 2019学校语言文字工作计划精选热度:英汉语言对比论文优秀范文热度:2017年爱国的演讲稿范文_展现你的语言魅力热度:在C语言中,有不少的关键字承担了多种角色,例如new关键字就身兼数职,除了能够创建对象,在继承体系中隐藏基类成员,还在泛型声明中约束可能用作类型参数的参数。
下面小编就来为大家介绍c 语言using的用法。
c语言using的用法一:<iostream>和<iostream.h>是不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。
后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。
因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
c语言using的用法二:所谓namespace,是指标识符的各种可见范围。
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:1、直接指定标识符。
例如std::ostream而不是ostream。
完整语句如下:std::cout << std::hex << 3.4 << std::endl;2、使用using关键字。
using std::cout;using std::endl;以上程序可以写成cout << std::hex << 3.4 << endl;3、最方便的就是使用using namespace std;例如:#include <iostream>#include <sstream>#include <string>using namespace std;这样命名空间std内定义的所有标识符都有效(曝光)。
using关键字的三种使用方式
using关键字的三种使⽤⽅式C#中using关键字有三种使⽤⽅式:(1)using 指令命名空间名字eg: using System;(2)using 别名使⽤场景:当两个cs⽂件都包含同⼀个名字的时候使⽤,不需要使⽤详细命名空间来区分相同的名字,直接使⽤别名更⽅便。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using aClass = NameSpace1.MyClass;using bClass = NameSpace2.MyClass;namespace ConsoleAppUsing{class Program{///<summary>///应⽤程序的主⼊⼝点。
///</summary>[STAThread]static void Main(string[] args){//// TODO: 在此处添加代码以启动应⽤程序//aClass my1 = new aClass();Console.WriteLine(my1);bClass my2 = new bClass();Console.WriteLine(my2);Console.WriteLine("Press any key");Console.Read();}}}(3)using语句定义⼀个范围,在范围结束时释放对象。
using(SqlConnection conn = new SqlConnection(conStr)){conn.Open();}在using内打开数据库连接,当超出using范围后,⾃动关闭连接,释放资源。
当然后也可以使⽤try-finally的⽅式,它在作⽤上是等效于using的,但是using使⽤更⽅便(推荐使⽤)。
如下所⽰:try{SqlConnection conn = new SqlConnection(conStr);conn.Open();}finally{conn.Dispose();}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言在8051单片机上的扩展(interrupt、using关键字的用法)直接访问寄存器和端口定义sfr P0 0x80sfr P1 0x81sfr ADCON; 0xDEsbit EA 0x9F操作ADCON = 0x08 ;P1 = 0xFF ;io_status = P0 ;EA = 1 ;在使用了interrupt 1 关键字之后,会自动生成中断向量在ISR中不能与其他"后台循环代码"(the background loop code) 共享局部变量因为连接器会复用在RAM中这些变量的位置,所以它们会有不同的意义,这取决于当前使用的不同的函数复用变量对RAM有限的51来将很重要。
所以,这些函数希望按照一定的顺序执行而不被中断。
timer0_int() interrupt 1 using 2{unsigned char temp1 ;unsigned char temp2 ;executable C statements ;}"interrupt"声明表示向量生成在(8*n+3),这里,n就是interrupt参数后的那个数字这里,在08H的代码区域生成LJMP timer0_int 这样一条指令"using" tells the compiler to switch register banks on entry to an interrupt routine. This "context" switch is the fastest way of providing a fresh registerbank for an interrupt routine's local data and is to be preferred to stacking registers for very time-critical routines. Note that interrupts of the same priority can share a register bank, since there is no risk that they will interrupt each other.'using' 告诉编译器在进入中断处理器去切换寄存器的bank。
这个"contet"切换是为中断处理程序的局部变量提供一个新鲜的寄存器bank 最快的方式。
对时序要求严格的程序,是首选的stack寄存器(保存寄存器到stack)方式。
注意:同样优先级别的中断可以共享寄存器bank,因为他们每次将中断没有危险If a USING 1 is added to the timer1 interrupt function prototype, the pushing of registers is replaced by a simple MOV to PSW to switch registerbanks. Unfortunately, while the interrupt entry is speeded up, the direct register addressing used on entry to sys_interp fails. This is because C51 has not yet been told that the registerbank has been changed. If no working registers are used and no other function is called, the optimizer eliminiates teh code to switch register banks.如果在timer1 的中断函数原型中使用USING 1, 寄存器的pushing将被MOV to PSW 切换寄存器bank 所替换。
不幸的是,当一个中断入口被加速时。
用在入口的直接寄存器寻址将失败。
这是因为C51没有告诉寄存器bank已经改变。
如果不工作的寄存器将被使用,如果没有其他函数被调用,优化器.....Logically, with an interrupt routine, parameters cannot be passed to it or returned. When the interrupt occurs, compiler-inserted code is run which pushes the accumulator, B,DPTR and the PSW (program status word) onto the stack. Finally, on exiting the interrupt routine, the items previously stored on the stack are restored and the closing "}" causes a RETI to be used rather than a normal RET.逻辑上,一个中断服务程序,不能传递参数进去,也不可返回值。
当中断发生时,编译器插入的代码被运行,它将累加器,B,DPTR和PSW(程序状态字)入栈。
最后,在退出中断程序时,预先存储在栈中被恢复。
最后的"}"结束符号将插入RETI到中断程序的最后,为了用Keil‘C’语言创建一个中断服务程序(ISR),利用interrupt 关键词和正确的中断号声明一个static void 函数。
Keil‘C’编译器自动生成中断向量,以及中断程序的进口、出口代码。
Interrupt 函数属性标志着该函数为ISR。
可用using 属性指定ISR使用哪一个寄存器区,这是可选的。
有效的寄存器区范围为1到3。
中断源的矢量位置中断源 Keil中断编号矢量地址最高优先级 6 0x0033外部中断0 0 0x0003定时器0溢出 1 0x000B外部中断1 2 0x0013定时器1溢出 3 0x001B串口 4 0x0023定时器2溢出 5 0x002BDMA 7 0x003B硬件断点 8 0x0043JTAG 9 0x004B软件断点 10 0x0053监视定时器 12 0x00631.函数在调用前定义与在调用后定义产生的代码是有很大差别的(特别是在优化级别大于3级时)。
(本人也不太清楚为什么,大概因为在调用前定义则调用函数已经知道被调用函数对寄存器的使用情况,则可对函数本身进行优化;而在调用后进行定义则函数不知被调用函数对寄存器的使用情况,它默认被调用函数对寄存器(ACC、B、DPH、DPL、PSW、R0、R1、R2、R3、R 4、R5、, R6、R7)都已经改变,因此不在这些寄存器中存入有效的数据)2.函数调用函数时除在堆栈中存入返回地址之外,不在堆栈中保存其它任何寄存器(ACC、B、DPH、DPL、PSW、R0、R1、R2、R3、R 4、R5、, R6、R7)的内容。
(除非被调用函数使用了using特性)3.中断函数是一个例外,它会计算自身及它所调用的函数对寄存器(ACC、B、DPH、DPL、PSW、R0、R1、R2、R3、R 4、R5、, R6、R7)的改变,并保存相应它认为被改变了的寄存器。
4.使用C写程序时,尽量少使用using n (n=0,1,2,3)特性。
(这个特性在本人使用的过程中存在一些问题,不知算不算是一个小bug)默认keil c51中的函数使用的是0寄存器组,当中断函数使用using n时,n = 1,2,3或许是对的,但n=0时,程序就已经存在了bug(只有中断函数及其所调用的函数并没有改变R0 ---- R7的值时,这个bug不会表现出来))一个结论是,在中断函数中如果使用了using n,则中断不再保存R0----R7的值。
由此可以推论出,一个高优先级的中断函数及一个低优先级的中断函数同时使用了using n,(n = 0,1,2,3)当n相同时,这个存在的bug 是多么的隐蔽。
(这恰是使人想象不到的)使用不同寄存器组的函数(特殊情况外)不能相互调用using"关键字告诉编译器切换register bank如果中断程序不重要,using关键字能忽略。
如果一个函数被从中断程序调用,而此中断强制使用using当编译一个被调用的函数时,编译器必须告诉它1)在函数前必须用伪指令#pragma NOAREGS在进入函数#pragma RESTORE或者#pragmas AREGS这样就不会使用"绝对地址定位"2)#pragma REGISTERBANK(n)用这个指定告诉当前使用的bank用NOAREGS指令移除MOV R7,AR7中断服务例程timer0_int() interrupt 1 USING 1 {unsigned char temp1 ;unsigned char temp2 ;}被调用的函数#pragma SAVE // Rember current registerbank#pragma REGISTERBANK(1) // Tel C51 base address of current registerbank.void func(char x) { // Called from interrupt routine// with "using1"}#pragma RESTORE // Put back to original registerbank如果中断服务例程使用了USING,被中断服务例程调用的函数一定要REGISTERBANK(n)一个被ISR调用的函数也可能被后台程序调用为了函数"reentrant"(可重入)8051 系列MCU 的基本结构包括:32 个I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的64K 字节可寻址数据和代码区。
中断发生后,MCU 转到5 个中断入口处之一,然后执行相应的中断服务处理程序。
中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。
8051的中断向量表如下:中断源中断向量---------------------------上电复位0000H外部中断0 0003H定时器0 溢出000BH外部中断1 0013H定时器1 溢出001BH串行口中断0023H定时器2 溢出002BHinterrupt 和using 都是C51 的关键字。