搜索
bottom↓
回复: 14

外部中断函数可以带参数和返回值吗?

[复制链接]

出0入0汤圆

发表于 2017-6-9 16:06:44 | 显示全部楼层 |阅读模式
本帖最后由 rjx 于 2017-6-9 16:12 编辑

外部中断函数可以带参数和返回值吗?这个中断函数可以在其它地方调用吗?如下:

u8 EXTI1_IRQHandler(u8 MAX_VOLUME,u8 MIN_VOLUME)
{
        static u8 VOLUME;
  if(EXTI_GetITStatus(EXTI_Line1) != RESET)
  {
   delay_us(500);//消抖
    if(EA!=EB)
         {  
                  if(VOLUME<MAX_VOLUME)                                 
                           { VOLUME++;}
                  else if(VOLUME>=MAX_VOLUME)
                           {VOLUME=MAX_VOLUME;}
         }
    else
          {
                    if(VOLUME>MIN_VOLUME)
                          { VOLUME--;     }
                   else if(VOLUME<=MIN_VOLUME)
                          {        VOLUME=MIN_VOLUME;}
         }
                               
    EXTI_ClearITPendingBit(EXTI_Line1);
  }
        return VOLUME;
}

出0入8汤圆

发表于 2017-6-9 17:09:37 | 显示全部楼层
函数如果要给其他模块调用的话,那这个就不是最底层的 ISR。

最底层的 ISR,它的调用者是 MCU 硬件,你想想中断事件发生时,硬件打断当前程序逻辑,转去调用这个函数,调用完毕,重新返回到之前的程序逻辑点,继续执行。
如果有返回值的话,返回值返回给谁用,同样可以想想,参数有谁能来传递。

出0入0汤圆

发表于 2017-6-9 17:11:03 | 显示全部楼层
不建议这么搞。还不如全局变量

出0入0汤圆

发表于 2017-6-9 17:11:31 | 显示全部楼层
全局变量不是恶魔

出50入58汤圆

发表于 2017-6-9 17:16:24 | 显示全部楼层
security 发表于 2017-6-9 17:09
函数如果要给其他模块调用的话,那这个就不是最底层的 ISR。

最底层的 ISR,它的调用者是 MCU 硬件,你想 ...

我只知道不能这么做,但想了半天想不出一个原因来,你这么一说豁然开朗

出0入33汤圆

发表于 2017-6-9 17:17:49 来自手机 | 显示全部楼层
全局变量或者消息队列

出0入0汤圆

 楼主| 发表于 2017-6-9 18:56:35 来自手机 | 显示全部楼层
返回值的问题可以用全局变量来解决,那外部中断函数究竟能不能带参数呢?

出0入0汤圆

发表于 2017-6-9 19:17:41 | 显示全部楼层
rjx 发表于 2017-6-9 18:56
返回值的问题可以用全局变量来解决,那外部中断函数究竟能不能带参数呢? ...

硬件又不给你压栈,硬件只保存特定的寄存器

所以是没法传参和返回值的

出300入477汤圆

发表于 2017-6-9 20:16:16 | 显示全部楼层
rjx 发表于 2017-6-9 18:56
返回值的问题可以用全局变量来解决,那外部中断函数究竟能不能带参数呢? ...

这是一个逻辑问题,不是编程的问题
谁给硬件中断函数传参数??
谁来接收硬件中断函数的返回值??

你仔细想了就知道,没有地方能给中断“传参数”,也没有地方能“接收”中断的“返回值”。
这就是结果。

中断干了事情之后修改一个全局变量,并不表示这个全局变量是中断函数的“返回值”。
这不符合返回值的定义。

出0入0汤圆

发表于 2017-6-9 21:38:35 | 显示全部楼层
rjx 发表于 2017-6-9 18:56
返回值的问题可以用全局变量来解决,那外部中断函数究竟能不能带参数呢? ...

按照cortex-m3中断规则和MDK函数约定 R0,R1表示第一个和第二个参数
你程序运行到一半不知道R0,R1是啥就给函数中断 然后被调用了,结果可想而知

出0入8汤圆

发表于 2017-6-10 08:20:57 | 显示全部楼层
rjx 发表于 2017-6-9 18:56
返回值的问题可以用全局变量来解决,那外部中断函数究竟能不能带参数呢? ...

你可以再认真看看我在 2 楼的回复。

出0入42汤圆

发表于 2017-6-10 08:38:56 | 显示全部楼层
LZ的应用带操作系统吗?

如果带操作系统,LZ需要创建一个线程,在线程中循环等待消息队列,然后根据消息调节音量;而中断中仅发送消息到队列,不直接调节音量;同样的,其它地方调节音量的操作也是通过向消息队列发送消息来完成的。

如果不带操作系统,可定义一个全局标志位,在中断中置位这个标志,而在主循环中检查,若置位则执行音量调节;其它地方调节音量的操作亦通过操作这个标志位间接完成。如果不想用全局变量,用函数封装对全局变量的操作即可。

另外,LZ在中断里延时500us去抖的操作,有强迫症的根本不能忍啊。。

出0入42汤圆

发表于 2017-6-10 08:53:09 | 显示全部楼层
单说“外部中断函数可以带参数和返回值吗”这个问题的话,除非非常特殊的情况,一般是不带的

如9楼所言,中断来的就是一个猝不及防,想给参数也不知道什么时候给啊。。。而返回值,以Cortex-M3为例,在中断返回的时候,r0就被硬件覆盖掉了。

特殊情况就是,用system_call实现一些特殊操作,这时是先写入参数,然后直接调用“系统调用”指令进入system_call中断,这时的system_call中断处理函数就是有参数的。。。但只要是“猝不及防”的中断,都没有这样的操作。。。

出0入0汤圆

 楼主| 发表于 2017-6-10 09:24:00 | 显示全部楼层
感谢各位的解答,是我受益匪浅。
12楼:我没有使用操作系统。我在一楼发的那个中断函数是一个编码器的计数程序,用得到的计数值( u8 VOLUME)来调节音量。
你说的设置一个全局的标志位,在主函数中检查标志位,若标志位置位,再调节音量(编码器中断中如何使标志位置位?),另外我还不太明白,置位后如何才能调节音量如何呢,也就是说如何离开了编码器,如何才能得到一个变化的数呢?
请你不吝指教,谢谢!

出0入8汤圆

发表于 2017-6-10 09:39:46 来自手机 | 显示全部楼层
rjx 发表于 2017-6-10 09:24
感谢各位的解答,是我受益匪浅。
12楼:我没有使用操作系统。我在一楼发的那个中断函数是一个编码器的计数 ...

生产者消费者模型
你的中断只管生产计数值
如何用在主程序中慢慢弄
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-1 03:39

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

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