找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1594|回复: 5
打印 上一主题 下一主题
收起左侧

关于单片机外部中断返回问题

[复制链接]
跳转到指定楼层
楼主
ID:706567 发表于 2020-8-9 18:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void ext0() interrupt 0
{

keyscan;();//键盘里改变 F 的数字

}
void main()
{
                        while(1)
                                {
                                        switch(F)
                                                {
                                                        case 1:
                                                                 pattern1();//里面很多语句
                                                        break;
                                                        case 2:
                                                                 pattern2();//里面很多语句
                                                        break;
                                                        case 3:
                                                                 pattern3();//里面很多语句
                                                        break;
                                                                                                
                                                }

}
按下外部中断键 进入中断,中断里就是键 盘扫描,改变F的数值 ,但是中断结束返回后,不会立即执行F数值 所指定的语句,而是返回中断点执行完原来的,才会重新判断F的数值 ,执行相应的语句,我想这个应该 怎么写才能F数值 发生改变后  立即执行,大师门给个思路。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:804115 发表于 2020-8-9 23:56 | 只看该作者
你的意思是不是在执行pattern2();的过程中,突然来了中断,中断按键扫描的结果是F=1;但是中断退出后你想直接执行pattern1();但是程序还是会把pattern2();执行完才会执行pattern1();导致1的任务被立即执行,产生了问题,是这样吧!

如果是这样,你需要将pattern1();直接放到中断中去执行,但是要确保它不会占用太长时间,尤其是delay肯定是不能有的。其实我们把这种任务叫做“刹车”任务,有危险就要刹车,车就要立即停止,所有其它任务都要靠边儿站,这样才不会发生交通事故。

你还可以通过引入OS来尽可能保证单核MCU的资源尽可能不被delay这种耗时间的任务占用不必要的时间,
同时,也可以通过给任务排版优先级来解决任务排序问题,但是以你目前的能力,不建议立即引入,再多写写代码,多看看代码吧。
另外,如果你是多核的mcu,可以让不同内核做不同的事情,也能解决你的问题,这个不太符合你的情况。
回复

使用道具 举报

板凳
ID:706567 发表于 2020-8-10 08:05 | 只看该作者
谢谢回答!
刚才开始弄,水平有限,把pattern1()放到中断里执行,那执行完不还是要返回原来的断点吗?
我的意思是 只要F是什么值就循环执行相应的程序。
回复

使用道具 举报

地板
ID:429003 发表于 2020-8-10 09:46 | 只看该作者
简化任务,优化设计,使程序尽可能多的时间处于休眠状态,而非高速循环运行!中断发生时,程序尽可能是从一个固定的休眠位置唤醒!
回复

使用道具 举报

5#
ID:804115 发表于 2020-8-11 19:25 | 只看该作者
无限飞翔 发表于 2020-8-10 08:05
谢谢回答!
刚才开始弄,水平有限,把pattern1()放到中断里执行,那执行完不还是要返回原来的断点吗?
...

退出中断就是要返回原来中断的地方继续执行啊!芯片就是这样设计的,这个改变不了。
回复

使用道具 举报

6#
ID:706567 发表于 2020-8-14 08:56 | 只看该作者
1692483014 发表于 2020-8-11 19:25
退出中断就是要返回原来中断的地方继续执行啊!芯片就是这样设计的,这个改变不了。

之前的思想不对,重新安排了下,基本解决。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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