C51 禁止使用绝对寄存器寻址方式访问函数选定

在 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 参数,做重入说明。


今天遇到的故障就是:中断使用USING 3,但中断中调用子函数,子函数有比较,比较时,怎么也比较不出结果,看汇编代码,子函数竟然和0X05,0X04直接比较,如果不勾选 “Don't use absolute register accesses“所以就出现错误了;

而所有程序公用一个寄存器组则不会出现该问题;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
---------------------------------- Keil C51语言使用技巧及实战_周立功书籍 ---------------------------------- PDF文件,带书签功能,阅读非常方便,不是精品我不发. -----------目录------------------- 介绍 第一章 硬件 1 概述 2存储区结构 2.1 CODE 区 2.2 DATA 区 2.3 特殊功能寄存器 2.4 IDATA区 2.5 XDATA区 3 位操作和布尔逻辑 4 寻址方式 5 处理器状态 6 电源控制 6 中断系统 6.1 中断优先级寄存器 6.2 中断使能寄存器 6.3 中断延迟 6.4 外部中断信号 7 内置定时/计数器 7.1 定时器工作方式 0 和方式 1 7.2 定时器工作方式 2 7.3 定时器工作方式 3 7.4 定时器 2 8 内置 UART 8.1 UART模式0 8.2 UART模式1 8.3 UART模式2 9 其它功能 9.1 I2C 9.2 A/D转换 9.3 看门狗 10 设计 11 实现 第二章 用 C 对 8051 编程 1 为什么要用高级语言 2 C 语言的一些要点 2.1 结构 2.2 联合 2.3 指针 2.4 类型定义 3 Keil C和ANSI C 3.1 数据类型 3.2 特殊功能寄存器 4 存储类型 4.1 DATA 区 4.2 BDATA区 4.3 IDATA段 4.4 PDATA和XDATA段 5 指针 6 中断服务 6.1 指定中断服务程序使用寄存器组 7 再入函数 8 使用 Keil C 时应做的和应该避免的 8.1 采用短变量 8.2 使用无符号类型 8.3 避免使用浮点指针 8.4 使用位变量 8.5 用局部变量代替全局变量 8.6 为变量分配内部存储区 8.7 使用特定指针 8.8 使用调令 8.8 使用宏替代函数 9 存储器模式 10 混合存储模式 11 运行库 12 动态存储分配 13 结论 第三章 使用软件补充硬件 1 介绍 2 使用小存储模式 3 使用液晶驱动 3.1 LCD驱动接口 4 显示数据 4.1 定制 printf 函数 5 使用定时计数器来计时 6 使用系统时标做用户接口 7 改进时钟软件 8 优化内部 RAM 的使用 9 完整的程序 10 使用看门狗定时器 12 保存系统数据 13 结论 第四章 在 8051 上使用汇编和 C 1 介绍 2 增加段和局部变量 3 设置变量地址 4 结合C和汇编 5 内联汇编代码 6 提高编译器的汇编能力 7 仿真多级中断 8 时序问题 9 结论 第五章 系统调试 1 介绍 2 通过系统设计来帮助调试 3 使用调试端口 4 使用Monitor-51 5 利用I/0端口进行调试 6 使用ICE 7 结论 第六章 中断系统 1 介绍 2 中断驱动系统和查寻系统 3 中断的电平和边沿触发 3.1 电平触发中断 3.2 边沿触发方式 4 共用中断 6 扩充外部中断数 7 中断服务程序 8 结论 第7章 串行口 1 介绍 2 慢速串行口和PC的接口 3 高速串行I/O 4 结论 第八章 8051的网络设计 1 复合串行端口 2 队列实行 3 使用内置定时器作TDMA控制 3 保持节点器件同步 4 CSMA网络 5 结论 第九章 控制编译和连接 1 把C代码转变成Keil C代码 2 把汇编代码转换成Keil汇编代码 3 使用using关键字 4 控制连接覆盖过程 5 使用64K或更多RAM 6 使用64K以上的代码空间 7 结论 第十章 8051的模糊控制 1 介绍 2 什么是模糊逻辑 3 模糊系统的结构 4 模糊控制使用的场合 5 进行模糊控制 6 模糊功能的实现 7 方案调整 8结论 总结 ----------------------------------

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值