Keil C51中using的用法

发布者:Zhenxiang最新更新时间:2016-09-09 来源: eefocus关键字: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 中,寄存器非常有用。

  寄存器组使用的原则:

  1、8051 的最低32 个字节分成 4 组 8 寄存器。分别为寄存器R0 到R7。寄存器组由PSW 的低两位选择。在 ISR 中,MCU 可以切换到一个不同的寄存器组。对寄存器组的访问不可位寻址,C51 编译器规定使用 using 或 禁止中断的函数(#pragma disable)均不能返回 bit 类型的值。

  2、主程序(main函数)使用一组,如 bank 0;低中断优先级的所有中断均使用第二组,如 bank 1;高中断优先级的所有中断均使用再另外一组,如 bank 2。显然,同级别的中断使用同一组寄存器不会有问题,因为不会发生中断嵌套;而高优先级的中断则要使用与低优先级中断不同的一组,因为有可能出现在低优先级中断中发生高优先级中断的情况。编译器会自动判断何时可使用绝对寄存器存取。

  3、在 ISR 中调用其它函数,必须和中断使用相同的寄存器组。当没用 NOAREGS 命令做明确的声明,编译器将使用绝对寄存器寻址方式访问函数选定(即用 using 或 REGISTERBANK 指定)的寄存器组,当函数假定的和实际所选的寄存器组不同时,将产生不可预知的结果,从而可能出现参数传递错误,返回值可能会在错误的寄存器组中。

  举一例子:当需要在中断内和中断外调用同一个函数,假定按照程序的流程控制,不会出现函数的递归调用现象,这样的调用会不会出现问题?若确定不会发生重入情况,则有以下两种情况:

  1、如果 ISR 和主程序使用同一寄存器组(主程序缺省使用BANK 0,若 ISR 没有使用 using 为其指定寄存器区,则缺省也使用 BANK 0),则不需其他设置。

  2、如果 ISR 和主程序使用不同的寄存器组(主程序缺省使用BANK 0,ISR 使用 using 指定了其他 BANK),则被调用函数必须放在:

  #pragma NOAREGS

  #pragma AREGS

  控制参数对中,指定编译器不要对该函数使用绝对寄存器寻址方式;或者也可在 Options->C51,选中“Don't use absolute register accesses”,使所有代码均不使用绝对寄存器寻址方式(这样,执行效率将稍有降低)。不论以上的哪一种情况,编译器均会给出重入警告,需手工更改 OVERLAY 参数,做重入说明。

  3、还有一种办法:如果被调用函数的代码不是很长,还是将该函数复制一份,用不同的函数名代替,这种情况适合ROM有足够多余的空间。

  因此,对using关键字的使用,如果没把握,宁可不用,交给编译系统自己去处理好了。

关键字:Keil  C51  using 引用地址:Keil C51中using的用法

上一篇:HT1621测试程序
下一篇:单片机学习之二十:E2PROM芯片24C02的读写程序

推荐阅读最新更新时间:2024-03-16 15:09

C51内存优化(data/idata/xdata)
对 51 单片机内存的认识,很多人有误解,最常见的是以下两种 ① 超过变量128后必须使用compact模式编译 实际的情况是只要内存占用量不超过 256.0 就可以用 small 模式编译 ② 128以上的某些地址为特殊寄存器使用,不能给程序用 与 PC 机不同,51 单片机不使用线性编址,特殊寄存器与 RAM 使用重复的重复的地址。但访问时采用不同的指令,所以并不会占用 RAM 空间。 由于内存比较小,一般要进行内存优化,尽量提高内存的使用效率。 以 Keil C 编译器为例,small 模式下未指存储类型的变量默认为data型,即直接寻址,只能访问低 128 个字节,但这 128 个字节也不是全为我们的程序所用,
[单片机]
C51教程 第四个51程序:中断控制--外部中断0
内部资源之外部中断 中断类型 中断入口地址 中断序号 外部中断0(INT0)P3.2 0003H 0 外部中断1(INT1)P3.3 0013H 2 定时计数器0(T0) 16bit 000BH 1 定时计数器1(T1) 001BH 3 定时计数器2(T2) 002BH 5 异步串行通信口(UART) 0023H 4 CPU外围模块的掌握方法: (1)相关口线 (2)相关控制字 (3)模块的工作方式 一、外部中断 (1)相关口线 P3.2:int0,外部
[单片机]
<font color='red'>C51</font>教程 第四个51程序:中断控制--外部中断0
printf in KEIL C51 使用注意事项
在keil中使用printf()函数的要点 在网上找资料时找到一篇介绍在keil中使用printf()函数的文章,copy到这里,作为备忘。 在keil中printf默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化串口,否则可能引起死机的情况,并且在printf之前应该先将TI置位,摘抄原因如下: 1.printf函数是调用putchar函数输入的,而putchar应该是先判断ti是否为1,不为1则等待为1。如果为1则清0,然后送出一 个字符。因此你如果直接使用printf函数,你的程序就会在putchar函数中等待ti为1。这时你的程序就相当于直接死掉了。你可以通过改写 putchar函数实现自己的目的的
[单片机]
C51入门笔记】IIC总线+E2PROM芯片(24C02)
常用总线技术: 采用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。同时,系统的更改和扩充极为容易。 常用的串行扩展总线有: I2C (Inter IC BUS)总线、单总线(1-WIRE BUS)、SPI(Serial Peripheral Interface)总线及Microwire/PLUS等。 IIC总线概述: I2C总线是PHLIPS公司推出的一种串行总线,总线裁决和高低速器件同步功能的高性能串行总线 总线裁决:挂载的设备都有自己的地址,通过地址分辨设备的功能叫做总线裁决。 I2C总线通过上拉电阻(一般是10K)接正电源。当总线空闲时,两根线均为高电平。连到总线上的任一器件输
[单片机]
【<font color='red'>C51</font>入门笔记】IIC总线+E2PROM芯片(24C02)
KEIL开启语法自动补全时困顿问题
KEIL开启语法自动补全时困顿问题 keil终于出了语法补全,但是开启后如果找不到对应的变量或者函数keil就会卡住好久回不来。 解决办法: keil的补全搜索与电脑上的杀毒软件保护会有冲突,导致keil的搜索被卡住,关掉杀毒软件,各种卫士等等,就可以。
[单片机]
keil 软件调试延时时间的详细步骤
方法/步骤 mS级带参数延时子程序 void delay_ms(uint z) //延时子程序 { uint x,y; for(x=z;x 0;x--) for(y=110;y 0;y--); } 上面这个程序的软件调试过程!晶振为12M 第一步:选择单片机晶振 第二步:全编译 第三步:按d进入软件调试 第四步:进入程序设置两个断点: 第五步:按全速运行至第一个断点:注意时间是0.000389s 第六步:再按一次全速运行至第二个断点:注意时间是1.013412s
[单片机]
<font color='red'>keil</font> 软件调试延时时间的详细步骤
VScode + keil开发环境搭建安装使用过程
这篇文章主要介绍了VScode + keil开发环境搭建及安装使用过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下。 写在前面 来了新公司之后,由于这次遇见的单片机是GD32,之前的前辈也都在keil上编程,所以又不得不拿起keil,可是无奈天下苦keil的UI久矣,中途尝试过几次修改KEIL高亮及颜色等,效果均不好,还发生不少bug事件,一会文件不能保存,一会编译报未知错误,没办法,得想办法另辟途径了,于是一顿网上冲浪,发现VScode上,可以完美解决我的问题,废话不多说,直接干! Keil Assistant 插件安装与使用 其实在Vscode上就有专门的插件可以调用
[单片机]
Keil C51单片机开发心得简介
用Keil写C51程序是最好不过的了。用伟福也可以写,但伟福的编辑能力就相差太远了。个人喜欢用Keil写代码,然后用伟福硬件仿真(只有WAVE的仿真头)。不过Keil是好用,但写代码关键还是C51水平,也就是编程能力,写C程序就离不开模块化这个词了。C51和A51,要扬长避短,发挥C的长处,就得将C模块化好。刚刚开始的时候就只是熟悉C51的语法规则了,熟悉了这个然后再追求程序的可读性和可移植性。 下面是使用Keil C51的一点心得: 1、程序可读性的提高 要提高程序的可读性,就得养成一良好的编程习惯了,例如变量用小写,常量用大写,函数第一个字母用大写等等。这样成习惯以后,自己看代码就会一目了然。另外还要灵活的在KEIL中使用
[单片机]
<font color='red'>Keil</font> <font color='red'>C51</font>单片机开发心得简介
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved