社区
单片机/工控
帖子详情
关于C51中断程序指定寄存器组的问题
bluetoothmesh
2008-01-24 09:05:28
在C51的中断程序可以用using指定寄存器组,让中断程序更快捷
using 1中断程序使用寄存器组1,默认的寄存器组使用寄存器组0,中断程序中有更改R0的值,看编译后的汇编代码没把R0入堆栈好理解,因为它们使用的是不同寄存器组
但是using 0,中断程序和主程序都使用寄存器组0,而中断程序中有更改R0的值,编译后的汇编代码它同样不把R0入堆栈,它们使用相同寄存器组,这样会覆盖之前R0的值,不对呀
望大家帮忙分析下,谢谢!
...全文
1061
6
打赏
收藏
关于C51中断程序指定寄存器组的问题
在C51的中断程序可以用using指定寄存器组,让中断程序更快捷 using 1中断程序使用寄存器组1,默认的寄存器组使用寄存器组0,中断程序中有更改R0的值,看编译后的汇编代码没把R0入堆栈好理解,因为它们使用的是不同寄存器组 但是using 0,中断程序和主程序都使用寄存器组0,而中断程序中有更改R0的值,编译后的汇编代码它同样不把R0入堆栈,它们使用相同寄存器组,这样会覆盖之前R0的值,不对呀 望大家帮忙分析下,谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
adong76
2009-11-03
打赏
举报
回复
多谢各位高手!
bluetoothmesh
2008-02-13
打赏
举报
回复
谢谢楼上的
也就是说(void Time0() interrupt 1 using 0)这样与默认寄存器组一样,
如果中断程序中使用到R0~R7,R0~R7的值就会被覆盖,这样就隐含了这个BUG,对吗?
HKCID
2008-02-01
打赏
举报
回复
如果你在中断(void Time0() interrupt 1 using 0 )使用using 0,编译器就认为你普通的程序不是
使用0组寄存器了,所以它保护普通程序的寄存器组(PUSH PSW )后使用0组寄存器(MOV PSW,#00H );
因为编译器根本不知道你的普通程序使用的是哪一组寄存器组(因为可以用代码改变寄存器组)。 既然你的中断程序使用的是和普通程序一样的寄存器组,那你干吗画蛇添脚在void Time0() interrupt 1添上 using 0 ,又误导了编译器,编译器认为---既然你使用了添上 using 0 ,那么你的普通程序使用的就不是0寄存器组,既然普通程序使用的是0寄存器组,就不必在所有的中断上使用using 0.
你要是想这样做的话----使用void Time0()interrupt 1 using 0并且普通程序使用的是0寄存器组,那你必须在进入中断后自己用代码保存0寄存器组的值,RETI 语句前恢复0寄存器组的值。但干吗这么麻烦呢?你只要删除using 0这些工作编译器就帮你做了。
bluetoothmesh
2008-01-31
打赏
举报
回复
中断函数指定寄存器组0和不指定寄存器组
如
uint8 idata test;
void Time0() interrupt 1 using 0
{
test = 0;
}
编译后的汇编代码是
; void Time0() interrupt 1 using 0
RSEG ?PR?Time0?MAIN
USING 0
Time0:
PUSH PSW
USING 0
MOV PSW,#00H
MOV R0,#LOW (test)
MOV @R0,#01H
虽然指定了寄存器组0,但它和默认的寄存器组是相同的,这样会覆盖之前R0的值,为什么编译器没push R0呢,这样不对呀!
而如果
uint8 idata test;
void Time0() interrupt 1 // using 0
{
test = 0;
}
即中断程序不指定寄存器组,它就会把R0入栈 PUSH AR0
; void Time0() interrupt 1 //using 0
RSEG ?PR?Time0?MAIN
USING 0
Time0:
PUSH PSW
MOV PSW,#00H
PUSH AR0
USING 0
MOV R0,#LOW (test)
MOV @R0,#01H
请大家帮忙分析下,谢谢!
lbing7
2008-01-25
打赏
举报
回复
很有可能是你没用寄存器
编译器太猛,省掉了
KEIL生成代码很干练的
Keil
C51
语言使用技巧及实战, (带书签pdf, 阅读起来就是爽,不是精品我不发)
---------------------------------- 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结论 总结 ----------------------------------
51单片机多任务同时执行
51单片机多任务同时执行。 RTX51 Tiny是一种实时操作系统(RTOS),可以用它来建立多个任务(函数)同时执行的应用(从宏观上看是同时执行的,但从微观上看,还是独立运行的)。嵌入式应用系统经常有这种需求。RTOS可以提供调度、维护、同步等功能。 实时操作系统能灵活的调度系统资源,像CPU和存储器,并且提供任务间的通信。RTX51 Tiny是一个功能强大的RTOS,且易于使用,它用于8051系列的微控制器。该RTOS最多支持16个任务,基于RTX51 Tiny构建的应用
程序
没有main( )函数,是从任务0开始执行的。 RTX51 Tiny的
程序
用标准的C语言构造,由Keil
C51
C编译器编译。用户可以很容易的定义任务函数,而不需要进行复杂的栈和变量结构配置,只需包含一个
指定
的头文件(rtx51tny.h)。 RTX51 Tiny使用定时器0、定时器0
中断
,和
寄存器
组
1。如果在
程序
中使用了定时器0,则RTX51 Tiny将不能正常运转。你可以在定时器0的
中断
服务
程序
后追加自己的定时器0
中断
服务
程序
代码(修改配置文件Conf_tny.A51)。 —————————
STM32的
中断
体系和FSMC控制LCD-第3季第7部分视频课程
本课程是《朱有鹏老师单片机完全学习系列课程》第3季第7个课程,本课程详细讲解STM32的外部
中断
和FSMC模块,这两个模块都是比较有代表性的相对复杂的,通过学习让大家彻底掌握这两个模块的编程和实战,同时对标准库更加熟悉。
C51
指令集 CJNE @Rn,#data,rel 3
51汇编语言指令集 符号定义表 符号 含义 Rn R0~R7
寄存器
n=0~7 Direct 直接地址,内部数据区的地址RAM(00H~7FH) SFR(80H~FFH) B,ACC,PSW,IP,P3,IE,P2,SCON,P1,TCON,P0 @Ri 间接地址Ri=R0或R1 8051/31RAM地址(00H~7FH) 8052/32RAM地址(00H~FFH) #data 8位常数 #data16 16位常数 Addr16 16位的目标地址 Addr11 11位的目标地址 Rel 相关地址 bit 内部数据RAM(20H~2FH),特殊功能
寄存器
的直接地址的位 指令介绍 指令 字节 周期 动作说明 算数运算指令 1.ADD A,Rn 1 1 将累加器与
寄存器
的内容相加,结果存回累加器 2.ADD A,direct 2 1 将累加器与直接地址的内容相加,结果存回累加器 3.ADD A,@Ri 1 1 将累加器与间接地址的内容相加,结果存回累加器 4.ADD A,#data 2 1 将累加器与常数相加,结果存回累加器 5.ADDC A,Rn 1 1 将累加器与
寄存器
的内容及进位C相加,结果存回累加器 6.ADDC A,direct 2 1 将累加器与直接地址的内容及进位C相加,结果存回累加器 7.ADDC A,@Ri 1 1 将累加器与间接地址的内容及进位C相加,结果存回累加器 8.ADDC A,#data 2 1 将累加器与常数及进位C相加,结果存回累加器 9.SUBB A,Rn 1 1 将累加器的值减去
寄存器
的值减借位C,结果存回累加器 10.SUBB A,direct 2 1 将累加器的值减直接地址的值减借位C,结果存回累加器 11.SUBB A,@Ri 1 1 将累加器的值减间接地址的值减借位C,结果存回累加器 12.SUBB A,0data 2 1 将累加器的值减常数值减借位C,结果存回累加器 13.INC A 1 1 将累加器的值加1 14.INC Rn 1 1 将
寄存器
的值加l 15.INC direct 2 1 将直接地址的内容加1 16.INC @Ri 1 1 将间接地址的内容加1 17.INC DPTR 1 1 数据指针
寄存器
值加1 说明:将16位的DPTR加1,当DPTR的低字节(DPL)从FFH溢出至00H时,会使高字节(DPH)加1,不影响任何标志位 18.DEC A 1 1 将累加器的值减1 19.DEC Rn 1 1 将
寄存器
的值减1 20.DEC direct 2 1 将直接地址的内容减1 21.DEC @Ri 1 1 将间接地址的内容减1 22.MUL AB 1 4 将累加器的值与B
寄存器
的值相乘,乘积的低位字节存回累加器,高位字节存回B
寄存器
说明:将累加器A和
寄存器
B内的无符号整数相乘,产生16位的积,低位字节存入A,高位字节存入B
寄存器
。如果积大于FFH,则溢出标志位(OV)被设定为1,而进位标志位为0 23.DIV AB 1 4 将累加器的值除以B
寄存器
的值,结果的商存回累加器,余数存回B
寄存器
说明:无符号的除法运算,将累加器A除以B
寄存器
的值,商存入A,余数存入B。执行本指令后,进位位(C)及溢出位(OV)被清除为0 24.DA A 1 1 将累加器A作十进制调整, 若(A) 3-0>9或(AC)=1,则(A) 3-0←(A)3-0+6 若(A) 7-4>9或 (C)=1,则(A) 7-4←(A)7-4+6 逻辑运算指令 25.ANL A,Rn 1 1 将累加器的值与
寄存器
的值做AND的逻辑判断,结果存回累加器 26.ANL A,direct 2 1 将累加器的值与直接地址的内容做AND的逻辑判断,结果存回累加器 27.ANL A,@Ri 1 1 将累加器的值与间接地址的内容做AND的逻辑判断,结果存回累加器 28.ANL A,#data 2 1 将累加器的值与常数做AND的逻辑判断,结果存回累加器 29.ANL direct,A 2 1 将直接地址的内容与累加器的值做AND的逻辑判断,结果存回该直接地址 30.ANL direct,#data 3 2 将直接地址的内容与常数值做AND的逻辑判断,结果存回该直接地址 31.ORL A,Rn 1 1 将累加器的值与
寄存器
的值做OR的逻辑判断,结果存回累加器 32.ORL A,direct 2 1 将累加器的值与直接地址的内容做OR的逻辑判断,结果存回累加器 33.ORL A,@Ri 1 1 将累加器的值与间接地址的内容做OR的逻辑判断,结果存回累加器 34.ORL A,#data 2 1 将累加器的
51单片机开发指导3
第三大部分讨论了C语言
程序
设计
问题
。C语言
程序
设计步骤与汇编语言基本相同。
C51
程序
主要由函数构成,其中有且只有一个主函数。C语言的主函数相当于汇编语言中的主
程序
。C语言的其他函数主要可以分为两种,一种是编译系统自带的标准库函数,引用这些函数时必须要在
程序
中包含相关的头文件。另一种是用户自定义的函数。除主
程序
之外的其他函数相当于汇编中的子
程序
。单片机C语言的语法与标准C语言相兼容,并在标准C语言的基础上根据单片机的特点有所扩展。这些扩展主要包括:提供了操作单片机特殊
寄存器
的数据类型;在变量定义中允许用户
指定
存储器类型;定义了特殊的重入函数和
中断
函数;除了一般的指针,还提供了存储器指针等。在此部分还给出了
C51
编程的部分技巧。最后列举了
C51
相关的库函数。
单片机/工控
27,374
社区成员
28,770
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章