打印
[51单片机]

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

[复制链接]
4590|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xxdcq|  楼主 | 2021-6-29 10:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
广东梁百万| | 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不能这么搞的,会乱掉的

但这样的操作在实时性要求非常强,速度要求非常快的场合用得很多

使用特权

评论回复
5
henangongda123| | 2021-6-29 15:12 | 只看该作者
C语言里面这样嵌入汇编会影响编译吧?

使用特权

评论回复
6
ayb_ice| | 2021-6-29 15:13 | 只看该作者
本帖最后由 ayb_ice 于 2021-6-29 15:14 编辑
xxdcq 发表于 2021-6-29 15:03
但这样的操作在实时性要求非常强,速度要求非常快的场合用得很多

那你要保护现场,恢复现场,否则堆栈指针就乱掉了,RTOS的本质就是在搞这些
纯汇编可以玩玩,你非要做是可以的
可以用_push_,_pop_库函数,注意添加相关头文件

使用特权

评论回复
7
xxdcq|  楼主 | 2021-6-29 15:18 | 只看该作者
ayb_ice 发表于 2021-6-29 15:13
那你要保护现场,恢复现场,否则堆栈指针就乱掉了,RTOS的本质就是在搞这些
纯汇编可以玩玩,你非要做是可 ...

就是说还是要混合编程是吧?但程序标号哪里来?就是说我要指定返回到哪里

使用特权

评论回复
8
ayb_ice| | 2021-6-29 15:34 | 只看该作者
xxdcq 发表于 2021-6-29 15:18
就是说还是要混合编程是吧?但程序标号哪里来?就是说我要指定返回到哪里 ...

都说了,你的做法是不行的,你返回到别的地方是没问题,但堆栈指针,寄存器变量,局部变量这些都需要特殊处理,否则,这样搞几次就乱掉了,程序的运行不是説只要程序指针转到相应的地方就可以的

使用特权

评论回复
9
minihang| | 2021-6-29 15:38 | 只看该作者
新人来学习了

使用特权

评论回复
10
William1994| | 2021-6-30 09:00 | 只看该作者
步骤1: 调用一个用interrupt修饰的空函数。相当于只使用了它的RETI指令, 把中断优先级清空,调用返回后,CPU会回到中断代码,但是此时是可以进入中断的。
步骤2:平衡堆栈。比如SP=SP-5*2;
步骤3:函数指针调用。
无论做操作系统,还是异常处理,都建议参考SETJMP函数的实现。虽然现在高级语言流行try-catch了,但是楼主作为一代轮子大师,应该还在C88的年代,也就是C89还没有发布的前一年。

使用特权

评论回复
11
jimsboy| | 2021-6-30 10:12 | 只看该作者
这种用C语言不能行.嵌汇编也不爽.
这样做,无非就是快一点.
如果用C不能满足,两个方法,继续用汇编,更换快的MCU.我认为后者更靠谱
我记得我们上学时,51都要12分频,12M的晶振只能跑1M的指令周期的速度.想弄个波特率还得去找11.0592M的晶振,否则波特率偏差会大.而现在随随便便一个MCU都能跑到16M,也就是说性能是原来的十多倍.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

1268

帖子

23

粉丝