[51单片机] 51汇编中的中断重定向返回在C程序里怎么实现?

[复制链接]
5220|10
 楼主| xxdcq 发表于 2021-6-29 10:37 | 显示全部楼层 |阅读模式
例如:
POP DPH
POP DPL
MOV DPTR , #LOP
PUSH DPL
PUSH DPH
RETI
中断返回到指定位置LOP而不是产生中断的地方
C程序不能直接操作堆栈如何实现这个操作?
广东梁百万 发表于 2021-6-29 12:01 来自手机 | 显示全部楼层
本帖最后由 广东梁百万 于 2021-6-29 12:06 编辑

汇编语言把原来的入栈地址修改后可做到,c语言就不懂
ayb_ice 发表于 2021-6-29 13:27 | 显示全部楼层
C不能这么搞的,会乱掉的
 楼主| xxdcq 发表于 2021-6-29 15:03 | 显示全部楼层
ayb_ice 发表于 2021-6-29 13:27
C不能这么搞的,会乱掉的

但这样的操作在实时性要求非常强,速度要求非常快的场合用得很多
henangongda123 发表于 2021-6-29 15:12 | 显示全部楼层
C语言里面这样嵌入汇编会影响编译吧?
ayb_ice 发表于 2021-6-29 15:13 | 显示全部楼层
本帖最后由 ayb_ice 于 2021-6-29 15:14 编辑
xxdcq 发表于 2021-6-29 15:03
但这样的操作在实时性要求非常强,速度要求非常快的场合用得很多

那你要保护现场,恢复现场,否则堆栈指针就乱掉了,RTOS的本质就是在搞这些
纯汇编可以玩玩,你非要做是可以的
可以用_push_,_pop_库函数,注意添加相关头文件
 楼主| xxdcq 发表于 2021-6-29 15:18 | 显示全部楼层
ayb_ice 发表于 2021-6-29 15:13
那你要保护现场,恢复现场,否则堆栈指针就乱掉了,RTOS的本质就是在搞这些
纯汇编可以玩玩,你非要做是可 ...

就是说还是要混合编程是吧?但程序标号哪里来?就是说我要指定返回到哪里
ayb_ice 发表于 2021-6-29 15:34 | 显示全部楼层
xxdcq 发表于 2021-6-29 15:18
就是说还是要混合编程是吧?但程序标号哪里来?就是说我要指定返回到哪里 ...

都说了,你的做法是不行的,你返回到别的地方是没问题,但堆栈指针,寄存器变量,局部变量这些都需要特殊处理,否则,这样搞几次就乱掉了,程序的运行不是説只要程序指针转到相应的地方就可以的
minihang 发表于 2021-6-29 15:38 | 显示全部楼层
新人来学习了
William1994 发表于 2021-6-30 09:00 | 显示全部楼层
步骤1: 调用一个用interrupt修饰的空函数。相当于只使用了它的RETI指令, 把中断优先级清空,调用返回后,CPU会回到中断代码,但是此时是可以进入中断的。
步骤2:平衡堆栈。比如SP=SP-5*2;
步骤3:函数指针调用。
无论做操作系统,还是异常处理,都建议参考SETJMP函数的实现。虽然现在高级语言流行try-catch了,但是楼主作为一代轮子大师,应该还在C88的年代,也就是C89还没有发布的前一年。
jimsboy 发表于 2021-6-30 10:12 | 显示全部楼层
这种用C语言不能行.嵌汇编也不爽.
这样做,无非就是快一点.
如果用C不能满足,两个方法,继续用汇编,更换快的MCU.我认为后者更靠谱
我记得我们上学时,51都要12分频,12M的晶振只能跑1M的指令周期的速度.想弄个波特率还得去找11.0592M的晶振,否则波特率偏差会大.而现在随随便便一个MCU都能跑到16M,也就是说性能是原来的十多倍.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

1269

帖子

23

粉丝
快速回复 在线客服 返回列表 返回顶部