搜索
bottom↓
回复: 40

怎么让中断后不返回到中断前执行的代码?

[复制链接]

出20入26汤圆

发表于 2017-9-28 18:31:16 | 显示全部楼层 |阅读模式
不修改返回的PC地址,如何让中断返回到其它函数?好像不修改PC地址实现不了?

我的问题实际就是,在主函数执行过程中,突发事件来了,突发就是串口中断接收到某数据,这时
我不能返回到原来的地址继续执行,想跳到另外一个处理函数A去,这个函数可以是空的,但要一直在
这个函数循环等待,等待只要串口再次接收到某数据,则可以退出A函数,继续执行主函数。

这个,没有操作系统。
但如果不上系统,能实现吗?
用上系统是不是好实现一些?

希望大家指点下!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2017-9-28 18:57:05 来自手机 | 显示全部楼层
看你的MCU有没有软中断,软中断优先级设置比串口低,串口接收完成后开启软软件中断。如果没有用定时器中断也可以用

出20入26汤圆

 楼主| 发表于 2017-9-28 19:01:28 | 显示全部楼层
superAFE 发表于 2017-9-28 18:46
为什么不可以在中断函数里死循环?直接等到你想要的数据再返回主函数。去修改pc指针和堆栈指针都太麻烦了。 ...

恩,在串口中断中判断,最后死循环,然后再次串口中断来了,处理数据,判断是否退出死循环。

出0入4汤圆

发表于 2017-9-28 19:47:52 | 显示全部楼层
主循环里等待不行吗

出0入0汤圆

发表于 2017-9-28 19:51:50 来自手机 | 显示全部楼层
goto不行?

出0入0汤圆

发表于 2017-9-28 20:08:34 | 显示全部楼层
使用OS,在你需要的线程中等待对应的中断事件。

出0入8汤圆

发表于 2017-9-28 20:26:39 来自手机 | 显示全部楼层
随便搞个轻量的操作系统就好了

出0入0汤圆

发表于 2017-9-28 20:44:03 | 显示全部楼层
程序逻辑问题吧 我觉得.  你完全可以给串口做个BUFFER  中断里面放入数据   主循环里面做检测就好了.  通过数量来检测是否有数据,然后进一步做某数据的判断. 别谈什么实时. 实时都是相对的, 只可能尽量减小反应时间并且让这个反应时间在可预测并且相对固定的范围内, 不可能有绝对实时的系统.

出20入26汤圆

 楼主| 发表于 2017-9-28 20:47:27 | 显示全部楼层
ztrx 发表于 2017-9-28 19:47
主循环里等待不行吗

主循环可以扫描串口的buff,但是担心有点延时。我需要收到马上判断及时作出处理。

这个,到时实测下,现在先准备多个方法。

出20入26汤圆

 楼主| 发表于 2017-9-28 20:49:03 | 显示全部楼层
浮华一生 发表于 2017-9-28 20:44
程序逻辑问题吧 我觉得.  你完全可以给串口做个BUFFER  中断里面放入数据   主循环里面做检测就好了.  通过 ...

是的,我要的是马上能处理执行。担心有点延时,影响了。
先收集多个方法,到时就测试下你说的这个,这个逻辑才比较符合。

出20入26汤圆

 楼主| 发表于 2017-9-28 20:49:24 | 显示全部楼层
canspider 发表于 2017-9-28 20:26
随便搞个轻量的操作系统就好了

有推荐的吗?我也可以学习下

出20入26汤圆

 楼主| 发表于 2017-9-28 20:49:43 | 显示全部楼层
aozima 发表于 2017-9-28 20:08
使用OS,在你需要的线程中等待对应的中断事件。

谢谢      

出20入26汤圆

 楼主| 发表于 2017-9-28 20:51:07 | 显示全部楼层

程序中不想出现goto

出20入26汤圆

 楼主| 发表于 2017-9-28 20:51:32 | 显示全部楼层
q457344370 发表于 2017-9-28 18:57
看你的MCU有没有软中断,软中断优先级设置比串口低,串口接收完成后开启软软件中断。如果没有用定时器中断 ...

谢谢               

出0入0汤圆

发表于 2017-9-28 20:56:06 | 显示全部楼层
jufr12315 发表于 2017-9-28 20:49
是的,我要的是马上能处理执行。担心有点延时,影响了。
先收集多个方法,到时就测试下你说的这 ...

这个还好吧, 你在主循环做个状态机, 平时属于检测串口是否有数据的状态,  一旦检测到, 立马进入另一个状态啊, 可以去一直循环啊什么的 都可以. 串口的速率 够你做很多事情了吧.  而且平时检测数据有无的时候 你要是担心在执行其他操作的时候会错过, 你可以用笨办法, 隔一段时间检测一次呗, 哈哈.     当然如他们所说加入操作系统肯定是最好的啦.  

出0入0汤圆

发表于 2017-9-28 21:04:14 | 显示全部楼层
循环队列,接受数据与处理同时进行,而不是简单的将数据放在一个缓存里。接受数据归接受,处理归处理,两不误

出20入26汤圆

 楼主| 发表于 2017-9-28 21:15:47 | 显示全部楼层
浮华一生 发表于 2017-9-28 20:56
这个还好吧, 你在主循环做个状态机, 平时属于检测串口是否有数据的状态,  一旦检测到, 立马进入另一个状 ...

恩,这样可以!!!

出20入26汤圆

 楼主| 发表于 2017-9-28 21:16:57 | 显示全部楼层
AlertTao 发表于 2017-9-28 21:04
循环队列,接受数据与处理同时进行,而不是简单的将数据放在一个缓存里。接受数据归接受,处理归处理,两不 ...

谢谢  

出0入20汤圆

发表于 2017-9-28 22:52:08 | 显示全部楼层
本来还想说,确实有硬改堆栈这种黑科技的。。。
不过LZ的帖子看下来,还是软中断最适合你。。。
串口中断->匹配->软中断(any source->while(1){do something})->串口中断->一般程序

倒是一个简单粗暴的办法,mark一下~

出0入0汤圆

发表于 2017-9-28 22:54:06 | 显示全部楼层
这个就是RTOS经常做的事情,任务切换~

出0入0汤圆

发表于 2017-10-2 07:29:11 来自手机 | 显示全部楼层
楼主您需要的是嵌入式实时操作系统!

出10入95汤圆

发表于 2017-10-2 09:41:32 来自手机 | 显示全部楼层
串口中断最高优先级不行?你要多快响应?

出0入0汤圆

发表于 2017-10-2 10:15:26 | 显示全部楼层
你那个属于嵌套中断   并且在低级中断触发另一个中断,另一个中断处理完,返回后,原来的中断接着返回,执行原有的地址继续执行

出200入2554汤圆

发表于 2017-10-2 12:18:01 | 显示全部楼层
在执行到 RET 之类的指令之前,向堆栈额外压入(PUSH)返回地址,是可以实现任意跳转的,但这个已经破坏了 C 的结构了,还不如直接 JMP

出0入0汤圆

发表于 2017-10-2 14:31:24 | 显示全部楼层
jufr12315 发表于 2017-9-28 20:49
是的,我要的是马上能处理执行。担心有点延时,影响了。
先收集多个方法,到时就测试下你说的这 ...

想快,FPGA的串口,最快在你最后一个有效数据停止位来后被处理时钟(简单就是16倍串口位速率)同步后可以处理。话说串口属于低速外设,你何必要很快响应呢,慢点有啥后果?

出0入4汤圆

发表于 2017-10-2 17:52:59 来自手机 | 显示全部楼层
用汇编可以实现你想要的效果

出0入0汤圆

发表于 2017-10-2 18:07:50 | 显示全部楼层
串口通信是低速的,还要拼命地谈论实时性。

出0入0汤圆

发表于 2017-10-2 18:18:31 | 显示全部楼层
直接在中断里做吧 这里需要你把中断的数据都接受完了,然后做你想要的处理,再跳出中断。

出0入0汤圆

发表于 2017-10-2 19:28:29 来自手机 | 显示全部楼层
这个其实只要主循环里判断个标志位就行了。

出0入0汤圆

发表于 2017-10-2 19:45:48 | 显示全部楼层
串口本来就慢,楼主想要多快?72MHzl的主频,0.1152M的通讯速率,加上标志位,响应起来绰绰有余。

出0入0汤圆

发表于 2017-10-2 20:59:03 | 显示全部楼层
研究一下操作系统里处理任务切换的机制。

出0入0汤圆

发表于 2017-10-5 20:06:21 | 显示全部楼层
反思一下自己程序思路是否有问题。在中断中等待下一次串口不行?

出300入477汤圆

发表于 2017-10-5 20:31:42 | 显示全部楼层
zyw19987 发表于 2017-10-5 20:06
反思一下自己程序思路是否有问题。在中断中等待下一次串口不行?

在中断里面不能等任何东西啊~
最清晰的方式就是上RTOS,在中断里面收到数据后发送一个事件,唤醒平常一直等待的优先级比目前任务更高的数据处理任务来执行(这样实际上RTOS就是悄悄的替你做到了“中断后不返回中断前执行的代码”。被中断的是当前的任务,中断发送事件后在退出中断前RTOS的代码会替换堆栈为准备唤醒的数据处理任务)

出0入0汤圆

发表于 2017-10-6 08:34:56 | 显示全部楼层
邪恶的思路。中断就是中断,在中断里接收到数据,置相应的标志位,然后主函数里判断标志位就可以控制流程了。别想这些歪门邪道的搞法了。

出0入0汤圆

发表于 2017-10-6 13:13:15 来自手机 | 显示全部楼层
果断上RTOS,RTOS就是为干这个而生的

出0入0汤圆

发表于 2017-10-6 22:35:22 来自手机 | 显示全部楼层
如果没有不方便分解长任务 主循环就够了 如果有 软中断或rtos切换任务

出0入0汤圆

发表于 2017-10-6 22:36:00 来自手机 | 显示全部楼层
估计是没有不方便分解的长任务

出0入0汤圆

发表于 2017-10-8 11:15:40 | 显示全部楼层
居然有人提出中断里面死循环这种招数啊,无语啊

出0入0汤圆

发表于 2017-10-8 11:23:35 来自手机 | 显示全部楼层
段胖子 发表于 2017-10-8 11:15
居然有人提出中断里面死循环这种招数啊,无语啊 ...

既然楼主提出收到串口会中止当前的事去死等另一个串口数据 顺着楼主的话用软中断去死等有什么奇怪 符合楼主要求就好  中断可嵌套  普通中断优先级高 不用的外设中断优先级低 用软件置位人为触发 比如不用的定时器外设 可以多个 不会影响正常中断只会卡死主程序 符合楼主说的

出0入0汤圆

发表于 2017-10-8 11:25:19 来自手机 | 显示全部楼层
细节当然有超时 各种标志和逻辑等 对楼主的环境没觉得有毛病

出0入0汤圆

发表于 2017-10-8 15:32:35 | 显示全部楼层
本帖最后由 段胖子 于 2017-10-8 15:35 编辑
huangqi412 发表于 2017-10-8 11:25
细节当然有超时 各种标志和逻辑等 对楼主的环境没觉得有毛病


楼上的误会了,我说的无语不是针对你的发言,我的意思是就像34、35楼的朋友提到的“中断内死循环不可行”,中断内死循环这个编程逻辑就有问题。另外很好奇楼主做的什么项目,需要这么奇怪的应用吗?串口2帧数据间隔应该不可能很短啊?即使程序在跑长程序,第2帧串口数据也会触发中断啊,难道楼主的长程序放到其他高优先级中断里了,不是很理解
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-2 00:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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