找回密码
 立即注册
查看: 541|回复: 14

求教下,SDCC\IAR下32号以上中断跳转语法?|已测试,不需要

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:163
  • 最近打卡:2025-05-02 13:26:59
已绑定手机

56

主题

1319

回帖

2942

积分

荣誉版主

无情的代码机器

积分
2942
发表于 2024-12-3 15:17:11 | 显示全部楼层 |阅读模式
本帖最后由 ercircle 于 2024-12-3 20:43 编辑

如题,Keil C51下isr.asm里中断跳转语法貌似不能直接用于sdcc\iar。
有木有坛友已经搞过了请指点下谢谢!

截图202412031515178944.jpg


截图202412031515037373.jpg

截图202412031516304840.jpg
截图202412031516389281.jpg

结论:不需要跳转,附Keil C251/Keil C51/SDCC/IAR RTC测试工程
Project.zip (5.71 MB, 下载次数: 34)


三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-19 16:12:35
已绑定手机

60

主题

777

回帖

4001

积分

论坛元老

自定义头衔

积分
4001
发表于 2024-12-3 15:35:37 | 显示全部楼层

昨天拜读了你的普中移植Ai8051U代码后,我对这个Keil C51下isr.asm里中断跳转语法也有疑问

这几句是怎么发挥作用的呢?

    CSEG        AT 01F3H
    LJMP        00C3H
    CSEG        AT 018BH
    LJMP        006BH

    END

方便讲解一下吗

点评

CSEG:Code Segment,插入代码段 AT:at,定位绝对地址,类似C语言的 _at_ LJMP :Long Jump,长跳转,长度3字节,机器码02H后面跟2字节操作数,是地址 END:结束 代码: CSEG AT 01F3H LJMP 00C3H CS  详情 回复 发表于 2024-12-3 17:39
我也不懂汇编语法,按我的理解,使能中断后,由MCU触发中断进入01F3H这个原始中断地址,然后这段汇编跳转地址到00C3H这里,就实现了自定义中断号映射。  详情 回复 发表于 2024-12-3 15:42
联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:163
  • 最近打卡:2025-05-02 13:26:59
已绑定手机

56

主题

1319

回帖

2942

积分

荣誉版主

无情的代码机器

积分
2942
发表于 2024-12-3 15:42:58 | 显示全部楼层
VC*** 发表于 2024-12-3 15:35
[md]昨天拜读了你的普中移植Ai8051U代码后,我对这个Keil C51下isr.asm里中断跳转语法也有疑问

这几句是怎 ...

我也不懂汇编语法,按我的理解,使能中断后,由MCU触发中断进入01F3H这个原始中断地址,然后这段汇编跳转地址到00C3H这里,就实现了自定义中断号映射。

点评

能不能跳转到00C3H之外的其他地址呢?这么做代价是什么呢?  发表于 2024-12-3 15:45
这可怎么办,看来我得单独发个帖求教了  发表于 2024-12-3 15:44
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:163
  • 最近打卡:2025-05-02 13:26:59
已绑定手机

56

主题

1319

回帖

2942

积分

荣誉版主

无情的代码机器

积分
2942
发表于 2024-12-3 15:49:02 | 显示全部楼层
论坛里关于这个讨论挺多的可以看看。但是sdcc和iar的就比较冷门了
有关使用超过31号中断问题的解决方法2的疑问
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:163
  • 最近打卡:2025-05-02 13:26:59
已绑定手机

56

主题

1319

回帖

2942

积分

荣誉版主

无情的代码机器

积分
2942
发表于 2024-12-3 15:50:26 | 显示全部楼层
sdcc的搜到了,不需要汇编跳转。。。
截图202412031550231546.jpg

点评

同理IAR应该也没32的限制,待测试  详情 回复 发表于 2024-12-3 16:07
三天不学习,赶不上刘少奇~
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-12-3 15:51:13 | 显示全部楼层
erci*** 发表于 2024-12-3 15:49
论坛里关于这个讨论挺多的可以看看。但是sdcc和iar的就比较冷门了
有关使用超过31号中断问题的解决方法2的 ...

感觉那个大佬想问的是方法3的东西,,想跳转任意地址..
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:163
  • 最近打卡:2025-05-02 13:26:59
已绑定手机

56

主题

1319

回帖

2942

积分

荣誉版主

无情的代码机器

积分
2942
发表于 2024-12-3 16:07:34 | 显示全部楼层
erci*** 发表于 2024-12-3 15:50
sdcc的搜到了,不需要汇编跳转。。。

同理IAR应该也没32的限制,待测试
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:424
  • 最近打卡:2025-05-02 14:37:11
已绑定手机

77

主题

4850

回帖

8384

积分

超级版主

DebugLab

积分
8384
发表于 2024-12-3 17:39:20 | 显示全部楼层
VC*** 发表于 2024-12-3 15:35
[md]昨天拜读了你的普中移植Ai8051U代码后,我对这个Keil C51下isr.asm里中断跳转语法也有疑问

这几句是怎 ...

CSEG:Code Segment,插入代码段

AT:at,定位绝对地址,类似C语言的 _at_
LJMP        :Long Jump,长跳转,长度3字节,机器码02H后面跟2字节操作数,是地址

END:结束


代码:

CSEG    AT    01F3H
LJMP    00C3H
CSEG    AT    018BH
LJMP    006BH
END

截图202412031629533827.jpg

编译后可以看到机器码中指定位置正确插入了2个LJMP
截图202412031631043548.jpg

根据数据手册,中断向量01F3H处是I2S中断

截图202412031623436920.jpg

当触发I2S中断后,单片机中断系统硬件会让程序计数器PC为01F3H,跳转到中断向量处执行程序
因为I2S中断向量处是LJMP 00C3H(02 00 C3),此时软件会让程序计数器PC为00C3H,跳转到00C3H处
根据数据手册,00C3H是I2C的中断向量
截图202412031641017367.jpg

但此时00C3H处没有中断函数入口地址
截图202412031643498852.jpg

根据数据手册中的指令集部分,BINARY模式的FFH指令是MOV R7,A,SOURCE的FFH没有指令
截图202412031647308336.jpg

截图202412031648149660.jpg

所以单片机会执行错误的操作,导致程序跑飞、死机、复位等问题
这就是为什么打开了中断就必须要有中断函数的原因,初学者经常遇到这个问题!
中断函数注意查询次序(中断向量)填I2C中断的,这决定编译器在哪里插入I2S中断函数的入口地址,必须是之前跳转过来的地址

截图202412031658555805.jpg

此时机器码中就可以看到这个地址处出现了一个LJMP指令,地址为0010H
截图202412031700261624.jpg

到这个地址看看程序要干什么了
截图202412031707241234.jpg

BINARY模式和SOURCE模式都是RETI,中断返回

截图202412031709144728.jpg

截图202412031708452593.jpg

因为中断函数是空的,空的中断函数,也会正确中断返回
这就是为什么打开了中断就必须要有中断函数的原因,初学者经常遇到这个问题!
这就实现了一个中断借用

018BH的DMA_SPI中断同理,就不赘述了
说完了中断借用再说下中断共用的问题
那I2C中断被占用了怎么办?
此时如果I2C中断也打开了,发生I2C中断时,硬件也会往这个地址跳转,只不过比I2S中断少跳转了一次,会进入相同的中断函数,那么在同一个中断函数中判断中断请求标志位就可以判断发生了哪个中断,类似UART1的RI和TI,但不建议这样做,还是使用保留中断或未使用的中断比较好
如果设置了不同的优先级,会形成中断嵌套,通过同一个RETI中断返回,CPU会在响应中断时暂存PC,中断返回时会从之前响应中断时暂存的PC处继续执行,不会出现跑飞问题,但存在函数重入问题,注意共用中断时不要在中断函数内执行不可重入的操作(一般是多个if判断中断请求标志位,也没什么不可重入的操作)
注意响应中断时自动清除中断请求标志位的中断不可以中断共用,因为进了中断后不知道是谁请求的
多个中断可以共用USER_VECTOR
截图202412031738485566.jpg

点评

超详细,学习  详情 回复 发表于 2024-12-3 19:47
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-19 16:12:35
已绑定手机

60

主题

777

回帖

4001

积分

论坛元老

自定义头衔

积分
4001
发表于 2024-12-3 17:54:16 | 显示全部楼层
Debu*** 发表于 2024-12-3 17:39
CSEG:Code Segment,插入代码段

AT:at,定位绝对地址,类似C语言的 _at_

感谢!非常详细和清晰的讲解!!!

我还有一个疑问。

为什么不在I2S的中断向量里,像正常Keil C51一样,LJMP到另外一个专门编写的I2S_ISR函数里,而是要跳转到I2C这里呢。是必须如此吗?为什么会这样呢

点评

I2C这个00C3H是可以修改的,一般借用中断13 Keil不支持中断31以上的中断 使用中断号扩展插件,可以直接使用中断31以上的中断,不需要借用  详情 回复 发表于 2024-12-3 18:09
联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:424
  • 最近打卡:2025-05-02 14:37:11
已绑定手机

77

主题

4850

回帖

8384

积分

超级版主

DebugLab

积分
8384
发表于 2024-12-3 18:09:24 | 显示全部楼层
VC*** 发表于 2024-12-3 17:54
感谢!非常详细和清晰的讲解!!!

我还有一个疑问。

I2C这个00C3H是可以修改的,一般借用中断13
Keil不支持中断31以上的中断
使用中断号扩展插件,可以直接使用中断31以上的中断,不需要借用
DebugLab
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 22:06 , Processed in 0.147729 second(s), 118 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表