嵌入式技术william hill官网
直播中

青sky

8年用户 1245经验值
擅长:模拟技术
私信 关注
[问答]

怎样去解决外部中断回调函数执行错误的问题呢

1.jpg

我想问个事,正在使用外部中断。配置好引脚,绑定中断回调函数。一开始为了验证编程正确,能进入回调函数,就在回调函数里写了个LED闪烁的代码段,结果发现灯没闪,特意搜了很久答案,也没发现。后来就干脆加入打印,发现是可以打印的,意味着能进入外部中断,但是感觉时间已经不是这个时间了。灯闪的不正确。

回帖(15)

刘超

2022-8-22 14:23:01
中断里面,使用延时是不合适的,修改下程序吧
举报

青sky

2022-8-22 14:23:13
正常不会这么用,只是测试而已。为啥时间短了,是定时器中断等全被关了吗?
举报

石玉兰

2022-8-22 14:23:31
rt_thread_mdelay延时也是要滴答定时器中断的,你这个在中断里阻塞等中断?
举报

青sky

2022-8-22 14:23:38
没有的,中断里就是调用上面那个test()
举报

石玉兰

2022-8-22 14:23:47
中断程序会独占cpu,但你里面又使用延时,会将cpu控制权给其他线程,这里有冲突了
举报

青sky

2022-8-22 14:23:56
这里在RT-Thread里有文档说明吗?谢谢!进入中断,占用CPU,遇到延时阻塞起来,其他线程得以运行?那时间到是不是又回到中断里?但是灯的情况是,几乎不存在时间上的差异,就是延时跟没有一样。好像说不通呢。
举报

石玉兰

2022-8-22 14:24:10
给你找个出处
1.jpg
举报

青sky

2022-8-22 14:24:18
我看看哪些是非线程延时函数先。
举报

石玉兰

2022-8-22 14:24:26
可以使用循环计数实现延时,或者使用rt_hw_us_delay
举报

王利祥

2022-8-22 14:24:34
IO口模式设置了没,单独控制一下灯是否能正常点亮闪烁呢?
另外,延时的函数不要放在中断里执行,中断执行时间太长会影响其他线程的。
举报

青sky

2022-8-22 14:24:54
放在main函数里单独控制灯,灯会闪亮,安意思去执行。但是放在中断里不会的。我知道不能放延时在中断里。只是为了直观测试才这么做。
举报

石玉兰

2022-8-22 14:25:02
从开始学单片机老师就教中断不能用延时,会影响其他程序或者中断。
不过在RT里,我试了一下,在中断回调里用延时,延时函数并不执行,所以你的点灯和关灯应该是瞬间完成,所以看到的是没有点亮。
另外延时如果加长,比如5s,程序直接就出错了,我用了syswatch,所以出错后直接被复位了。
总之,中断里面是不能延时的。
举报

青sky

2022-8-22 14:25:09
中断不能用延时,主要影响实时性的吧?比如高优先级使用了延时,低优先级就进不去。我觉得应该问题出现在rt_thread_mdelay()这个函数,可能不能用在中断函数里。如果使用其他延时函数应该可以延时。
举报

石玉兰

2022-8-22 14:25:19
有可能是,rt_thread_mdelay()调用的是rt_thread_sleep(),这个函数是This function will let current thread sleep for some ticks。而中断里没有当前线程,所以会出错,理解应该是这样。
举报

贾埃罗

2022-8-22 14:25:26
一、中断中的rt_thread_mdelay()延时函数并没有成功执行);所以灯的状态应该是“瞬间”设置完成的(超过人眼的识别);
二、rt_thread_mdelay();函数,最终是通过rt_thread_sleep()函切换线程的;但是中断种又不能进行线程的切换,从而调度失败(系统没崩算好的);系统继续执行中断接下来的程序;
三、最重要一点,中断中不能加延时;中断中的函数要尽可能的短,不能有延时、等待的函数;
举报

更多回帖

发帖
×
20
完善资料,
赚取积分