打印

IAR 环境中断函数中不能使用goto语句

[复制链接]
3800|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
司徒老鹰|  楼主 | 2011-7-29 22:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
main()
{
program1:
F1()
  {.....}

program2:
F2()
  {.....}

}

ISP
{
if(...)
    goto F1

if(....)
  goto F2
}

根据中断中的判断,直接跳转到对应的地方,如何实现?
沙发
llljh| | 2011-7-29 23:04 | 只看该作者
不是不可以用GOTO,是你用错了,幸好IAR比你聪明
这是当然的
即使可以编译,运行也会出错的
中断返回RETI和子程序返回返回RET是不同的

使用特权

评论回复
板凳
栩栩如生| | 2011-7-29 23:15 | 只看该作者
LZ的C基本语法需要加强一下main()

{

program1:    F1()

                    {.....}

program2:    F2()

                    {.....}

}



ISP()

{

    if(...)

        goto program1;

    if(....)

        goto program2;

}

使用特权

评论回复
地板
supernan| | 2011-7-30 09:16 | 只看该作者
中断里用goto,当然可以,但你对自己的做法代表的含义以及可能产生的一切后果还不清楚的话就别这么用
宁可在中断里对一个声明为volatile的全局变量进行赋值操作,再回到主程序中根据该值跳转到相应程序处

使用特权

评论回复
5
司徒老鹰|  楼主 | 2011-7-30 09:28 | 只看该作者
我意思是直接goto 出中断函数,到我要操作的函数,应为我的应用要求立即跳转,在主函数中的循环时间很长,如果用全局变量的话,会等很久的,有没有好的办法,谢谢

使用特权

评论回复
6
llljh| | 2011-7-30 09:39 | 只看该作者
LZ用汇编写过程序,就应该明白
当你进入中断服务程序时,单片机本身会备份当前程序状态,中断部分执行完毕后会用RETI恢复现场
如果这时候主程序是在执行一个子程序时进入的中断,那么中断执行完毕后自然会继续执行之前的子程序毫无影响,问题就在这...中断部分用LJMP之类跳转指令(相当于goto),自然是“合法”得跳转到目的地,但之前被执行到一半的子程序将会被彻底打断,程序架构一旦没处理好这部分,出问题也在所难免

使用特权

评论回复
7
renyaq| | 2011-7-30 09:43 | 只看该作者
goto语句本来就不提倡使用

使用特权

评论回复
8
司徒老鹰|  楼主 | 2011-7-30 09:47 | 只看该作者
还是和你们解释一下吧,不是语法的问题,是流程问题,这个程序很简单,我的意思是每个函数执行时间很长(而且你面包含很多外部函数)如果设置flag会有延迟,希望中断中通过判断直接跳转到要执行的函数,我希望知道这种架构能否实现,这是我临时敲的语法错误请忽略,谢谢

main()
{
//初始化,省略。。。
while(1)
{
    F1()    //这个函数是大概运行时间是3分钟
     {.......}
    F2()    //这个函数是大概运行时间是3分钟
     {.......}
    F3()    //这个函数是大概运行时间是3分钟
     {.......}
}
ISP
{
if(情况1)
    goto F1;
if(情况2)
    goto F2;
if(情况3)
   goto F3;
}
   

}

使用特权

评论回复
9
juventus9554| | 2011-7-30 09:56 | 只看该作者
LZ竟还没有搞清楚RETI与RET区别

使用特权

评论回复
10
司徒老鹰|  楼主 | 2011-7-30 10:18 | 只看该作者
你意思是这种方法行不通,必须用flag咯?

使用特权

评论回复
11
renyaq| | 2011-7-30 10:25 | 只看该作者
中断必须用RETI返回,只有声明为中断属性的函数编译器才会编译成用RETI指令返回,而F1~F3编译器会用RET返回,你说会不会出错,
你那样中断立马出错,要么同级和低级中断被屏蔽,要么返回到火星上去了(成了外星人了),这取决于内核架构
...
但汇编可以...

使用特权

评论回复
12
dingy| | 2011-7-30 10:30 | 只看该作者
可以使用,不过你必须恢复现场比如
main()
{
program1:
F1()
goto isrexit;
  {.....}

program2:
F2()
goto isrexit;
  {.....}

}

ISP
{
if(...)
    goto F1

if(....)
  goto F2
isrexit:
}

因为会跳过很多数据初始化,以及变量覆盖的存在,因此出问题的可能相当高,尽量不用,或做好数据处理后用

使用特权

评论回复
13
chuxh| | 2011-7-30 11:02 | 只看该作者
LS
请问RETI怎么办

使用特权

评论回复
14
zwll| | 2011-7-30 11:06 | 只看该作者
当然你可以说用汇编
这根本就是不懂中断

使用特权

评论回复
15
司徒老鹰|  楼主 | 2011-7-30 11:10 | 只看该作者
不讨论了,结贴!

使用特权

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

本版积分规则

427

主题

3735

帖子

8

粉丝