OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16081|回复: 7

中断服务函数结束后如何返回到一个程序点继续执行?

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2014-12-27
在线时间
0 小时
发表于 2015-3-9 09:35:32 | 显示全部楼层 |阅读模式
5金钱
最近在用STC12做毕业设计,现在遇到了一个难题。
一般来说,中断服务函数执行完后会返回到原先的程序继续执行,也就是出栈。

我现在用串口传输数据,想每次接受完数据后进行一个解码函数,再从发送的码值判断是否执行亮灯函数,但是亮灯函数有点长,如果在执行亮灯函数的时候串口发送数据过来,只能等这次亮灯函数执行完了才能解码并判断是否执行亮灯函数。

能不能在串口中断接收到数据后,就从亮灯函数跳出来,直接从解码函数开始执行?如图:



解码函数和亮灯函数在主函数里,如何写出红色的那一条跳转语句?更通俗一点地说,串口接收完所有数据后,如何产生一个「复位」,使ISR结束后不返回原来的程序,而是重头开始运行程序?或者有没有其他更好的办法?

不知道我说清楚问题没有,望高手赐教。

最佳答案

查看完整内容[请看2#楼]

回复【6楼】正点原子: --------------------------------- 谢谢原子哥。 技术难题已经解决了,我的解决大概思路是这样的: void 灯亮函数   {          while(1)        {               if  (UARAT_OK_FLAG==0)     &n ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2014-12-27
在线时间
0 小时
 楼主| 发表于 2015-3-9 09:35:33 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
谢谢原子哥。

技术难题已经解决了,我的解决大概思路是这样的:

void 灯亮函数  
{  
       while(1)  
     {  
            if  (UARAT_OK_FLAG==0)  
            {  
                    UARAT_OK_FLAG=1;      //软件设置串口接收成功标志位为1,串口接收成功后
                    红灯; 
                    delay; 
                    绿灯; 
                    delay; 
                    蓝灯; 
                    delay; 

             }  
           else   break;  
     }  


delay函数
{
      if(UARAT_OK_FLAG==0)  //串口接收数据成功后会设置此标志位为0
               return;                 //如果接收到串口数据则跳出delay函数
      for循环延时
}
回复

使用道具 举报

30

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
594
金钱
594
注册时间
2014-4-3
在线时间
74 小时
发表于 2015-3-9 10:54:03 | 显示全部楼层
bit  UARAT_OK_FLAG=0;
 串口接收中断完成:UARAT_OK_FLAG=1;
   
void 灯亮函数
{
       while(1)
     {
            if  (UARAT_OK_FLAG==0)
            {
                    灯亮;
             }
           else   break;
     }
}
回复

使用道具 举报

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2015-3-9
在线时间
1 小时
发表于 2015-3-9 10:55:44 | 显示全部楼层
我想在中断那部分加一个标志位,然后数据接收结束后,标志位置1或清0,类似于if(a==1){解码函数;a=0;}这样就会每次接收数据都会进行一次解码了
学无止境
回复

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2015-3-9 11:39:17 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2014-12-27
在线时间
0 小时
 楼主| 发表于 2015-3-9 17:12:58 | 显示全部楼层
谢谢高手们答复,如果亮灯函数需要执行很长时间,比如三色跳变,红-绿-蓝-红-绿-蓝,执行一次红-绿-蓝三色跳变函数需要1分钟,如果这期间有数据传输过来,说不要红绿蓝跳变了,直接亮红色,那怎么快速执行?而不是等红绿蓝三色跳变结束后再亮红色。

例如:
void 灯亮函数 

       while(1) 
     { 
            if  (UARAT_OK_FLAG==0) 
            { 
                    红灯;
                    延时20秒;
                    绿灯;
                    延时20秒;
                    蓝灯;
                    延时20秒

             } 
           else   break; 
     } 
}

在延时20秒的时候串口有数据传输过来,数据是接收了,但是要等蓝灯延时20秒结束后才能解码执行。能不能一接收到数据就跳出这个三色跳变函数?或者有没有其他的思路?谢谢。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-3-9 22:29:44 | 显示全部楼层
回复【5楼】阏男秀:
---------------------------------
加个标记位, break就可以了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

133

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2014-12-21
在线时间
1 小时
发表于 2015-4-3 10:59:04 | 显示全部楼层
这种延时是直接跳过了一个灯亮循环。。 。一般会用标志位,而不是死延迟来做。
while(1){
     如果串口有数据,查询指令并改变标志。
      如果红灯该亮,亮红灯,否则灭红灯。
。。。。。。
}
流过汗水才能代表自己真的学会了如何不流汗。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 08:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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