首页
论坛
电子技术基础
模拟技术
可编程器件
嵌入式系统与MCU
工程师职场
最新帖子
问答
版主申请
每月抽奖
商城免费换礼
社区有奖活动
博客
下载
评测
视频
文库
芯语
资源
2025泰克杭州测试论坛
2025中国低空经济产业创新发展大会
【直播】芯片设计工艺仿真全解析
西门子数字化工业软件资源中心
嵌入式设计资源库
智能楼宇/家电控制应用全解析
在线研讨会
EE直播间
小测验
白皮书
行业及技术活动
杂志免费订阅
免费在线工具
厂商资源中心
论坛
博文
电子工程专辑
电子技术设计
国际电子商情
资料
白皮书
研讨会
芯语
文库
登录|注册
登录
用户1569227
修改
文章:
33
阅读:
192652
评论:
27
赞:
278
好友
私信
个人主页
文章
33
原创
0
阅读
192652
评论
27
赞
278
原创
interrupt 和 using 在C51中断中的使用
2008-3-9 17:12
3556
6
6
分类:
MCU/ 嵌入式
interrupt 和 using 在C51中断中的使用
DCS是实时性要求非常高的行业,C51尽管在设计单片机程序时有汇编语言所无法比拟的优势,但是效率是C51唯一输给汇编的方面。C51中断管理尤其影响系统的响应速度。这里摘录一篇文章,这里介绍的技术解决了我设计中的一个难题,贴出来给大家分享。
8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;5个中断源(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 溢出
IE.2 2 外部中断1
IE.3 3 定时器1 溢出
IE.4 4 串口中断
IE.5 5 定时器2 溢出
有了这一声明,编译器不需理会寄存器组参数的使用和对累加器A、状态寄存器、寄存器B、数据指针和默认的寄存器的保护。只要在中断程序中用到,编译器会把它们压栈,在中断程序结束时将他们出栈。C51 支持所有 5 个 8051 标准中断从 0 到 4 和在 8051 系列(增强型)中多达 27 个中断源。
using 关键字用来指定中断服务程序使用的寄存器组。用法是:using 后跟一个0 到3 的数,对应着 4 组工作寄存器。一旦指定工作寄存器组,默认的工作寄存器组就不会被压栈,这将节省 32 个处理周期,因为入栈和出栈都需要 2 个处理周期。这一做法的缺点是所有调用中断的过程都必须使用指定的同一个寄存器组,否则参数传递会发生错误。因此对于using,在使用中需灵活取舍。
关于using:
您在文中说明“这一做法的缺点是所有调用中断的过程都必须使用指定的同一个寄存器组”是不是这个意思?
举个例子来说:
定义一个函数
void func(unsigned char i) {
...
if(++i==0x12) {
...
}
...
}
有如下一个中断函数
void int_0(void) interrupt 0 using 1 {
....
}
在默认状态下,func使用寄存器组0(BANK0),那么当int_0调用func时是否存在当传递参数时会造成参数传递错误?
谢谢!
如果在中断服务函数 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关键字的使用,如果没把握,宁可不用,交给编译系统自己去处理好了。
写原创有奖励!2025面包板原创奖励正在进行中
最新发表
推荐阅读
明星博主
原创博文
年度排行
博文排行
博文评论
FPGA/CPLD
MCU/ 嵌入式
模拟
电源/新能源
测试测量
通信
智能手机
处理器与DSP
PCB
汽车电子
消费电子
智能硬件
物联网
软件与OS
采购与分销
供应链管理
工程师职场
EDA/ IP/ 设计与制造
无人机
机器人/ AI
医疗电子
工业电子
管理
写博文
点赞(
6
)
收藏
分享到:
上一篇:
电容的基础知识
下一篇:
51单片机常用寄存器速查表
PARTNER CONTENT
换一换>
更多>
提升汽车电子浪涌耐受性:SWM+TVS解决方案通过ISO 16750-2 Pulse 5a测试
firstohm
2025-04-14
AI时代的氮化镓:市场与技术将走向何方?
黄烨锋
2025-04-24
文章评论
(
0
条评论)
登录
后参与讨论
您需要登录后才可以评论
登录
|
立即注册
发布
用户1569227
修改
文章:
33
阅读:
192652
评论:
27
赞:
278
好友
私信
个人主页
文章
33
原创
0
阅读
192652
评论
27
赞
278
最新评论
更多
呵呵,我看是黯然退场。 欲速则不达。 道可道非常道,名可名非常名。 之初就没想长久,借新兴市场之名,名正言顺淡出其道 ...
自做自受 ...
评论博文
2025-4-27
新兴市场是救命稻草还是海市蜃楼?速卖通突 ...
这现象很普遍,我看就是潜意识导致意识表现在行为典型现象。 有说,人的潜意识有两种类型,描述为一是“情理法”,一是“法理 ...
自做自受 ...
评论博文
2025-4-27
给人审查PCB时,你有这样的情况吗 ...
精彩之余,拆解解决了什么问题吗?有和具体收获?日后指导自己的工作和生活?
自做自受 ...
评论博文
2025-4-27
拆解报告:三合一无线充电模块,现在看设计 ...
最新
博文
烧结银大揭秘:优势及其广泛应用 ...
盘点全球十大人形机器人公司!你认识 ...
协议标准第015篇 汽车48V电气标准 ...
资料下载
本周热帖
[鸟哥的Linux私房菜:服务器架设篇(第 ...
【Winform+WPF】喷涂工艺SCADA采集监 ...
积分微分的拉普拉斯变换
电子元件FCO-2C-WT系列超宽温SMD振荡 ...
纳祥科技8位移位寄存器74HC164D中文规 ...
【敏矽微ME32G030系列】介绍、环境搭 ...
【敏矽微ME32G030系列】+开发环境搭建 ...
【敏矽微ME32G030系列】+ADC转换测评 ...
【敏矽微ME32G030系列】1、printf重定 ...
【敏矽微ME32G030系列】+OLED屏显示驱 ...
最新资讯
芯语最新
4个问题快速看懂NVIDIA Photonics硅光 ...
解决AI数据中心的电源挑战
设计IP市场增幅创历史新高,谁才是最 ...
一文带你了解电子器件中的电阻率 ...
中国车市淘汰赛加速洗牌,中国进口汽 ...
用于脑机接口系统的神经电极:从刚性 ...
新型集成便携式电化学传感器,即时检 ...
基于拉曼光谱的无创血糖监测系统在校 ...
凯迪拉克汽车搭载禾赛AT系列激光雷达 ...
上海微系统所在MEMS谐振式陀螺仪领域 ...
EE直播间
更多
中小数字IC云仿真加速方案:弹性资源与验证效率提升
直播时间: 05月22日 10:00
在线研讨会
更多
利用氮化镓技术打造高效电机驱动——人形机器人、无人机与电动汽车应用
ADMT4000重新定义多圈编码器设计
NSSine™系列实时控制MCU在数字电源和电机控制领域的应用
ST 在大功率热管理系统中的电机控制系统方案(AI 数据中心/暖通空调/电池储能系统/变频制冷)
热门
推荐
超低功耗CW32L083系列
AI、GUI开发的工程师必修课,不容错过!
STM32玩转机械手:边缘AI开发的实战课!
GaN电机驱动设计“避坑”指南
我要评论
0
6
分享到微信
分享到微博
分享到QQ
点击右上角,分享到朋友圈
我知道啦
请使用浏览器分享功能
我知道啦
关闭
站长推荐
/3
2025第1期拆解活动:赢示波器、运动相机、热像仪等!
示波器、影石运动全景相机、大疆无人机、高清红外热成像仪;树莓派5等等
泰克示波器五折来袭!
泰克限时五折!全球示波器用户狂欢,软件升级超值优惠,速抢!
【2025面包板社区内容狂欢节】发文、回帖赢20万E币!
活动时间:即日起——2025年全年(发完20万E币为止!)
首页
论坛
电子技术基础
模拟技术
可编程器件
嵌入式系统与MCU
工程师职场
最新帖子
问答
版主申请
每月抽奖
商城免费换礼
社区有奖活动
博客
下载
评测
视频
文库
芯语
资源
2025泰克杭州测试论坛
2025中国低空经济产业创新发展大会
【直播】芯片设计工艺仿真全解析
西门子数字化工业软件资源中心
嵌入式设计资源库
智能楼宇/家电控制应用全解析
在线研讨会
EE直播间
小测验
白皮书
行业及技术活动
杂志免费订阅
免费在线工具
厂商资源中心
帖子
博文
返回顶部
×
文章评论(0条评论)
登录后参与讨论