打印
[STM32F0]

中断需要执行的程序过长优化问题

[复制链接]
6036|44
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
norman7890|  楼主 | 2016-1-11 16:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  程序systick中40us进一次中断,中断程序大概耗时38us,除此之外,每过1ms会有耗时4us的中断,还有10ms的中断。担心中断时间不够,程序出问题。
  请教各路大神,如何精简程序,38us的那个程序,大致都是加减乘除等计算,有没有什么有效的程序精简办法。左移右移还有减少除法之类的都用过了。
沙发
norman7890|  楼主 | 2016-1-11 16:09 | 只看该作者

使用特权

评论回复
板凳
huangcunxiake| | 2016-1-11 16:31 | 只看该作者
进入中断后,先关掉总中断啊。干完了活,再开

使用特权

评论回复
地板
luofeng2g| | 2016-1-11 17:46 | 只看该作者
复杂算法放后台执行,中断激活后台任务就行了

使用特权

评论回复
5
捉虫天师| | 2016-1-11 20:48 | 只看该作者
解决这个问题最简单的方法就是用RTOS来做,通过线程来解决冲突。

使用特权

评论回复
6
捉虫天师| | 2016-1-11 20:50 | 只看该作者
1建议你把中断程序优化下,写到其他位置,和中断分离,这样扫描的周期 会短点
2另外,你可以考虑用定时中断啊,这样避免了中断程序没扫描完,中断就被复位。
3程序一般控制毫秒控制肯定能达到工业使用要求的,你也可以把定时时间加长点。

使用特权

评论回复
7
ofourme| | 2016-1-11 21:32 | 只看该作者
你这个cpu的占用率也太高了吧,40微秒的时间中断程序就占用了38微秒。建议优化中断程序或是换芯片。还有,程序实时性要求有那么高吗?一定要用中断?

使用特权

评论回复
8
Bingoes| | 2016-1-11 22:57 | 只看该作者
优化算法,或者再换性能更高的芯片。。。40us每次的中断,38us的每次中断处理时间,单单从字面的描述上来看就感觉够呛了。。。

使用特权

评论回复
9
sl3340| | 2016-1-12 09:11 | 只看该作者
这个问题其实是两方面问题,第一,你的CPU能不能满足你的代码实时性的要求。第二,你的代码是否需要这个实时性。

第一个问题,可以优化这些代码或者更换更高主频的器件。

第二个问题,不需要这么强的实时性就降低代码运行的次数,systick中的代码如果不需要25KHz的调用次数可以降低一点。

使用特权

评论回复
10
norman7890|  楼主 | 2016-1-12 10:15 | 只看该作者
luofeng2g 发表于 2016-1-11 17:46
复杂算法放后台执行,中断激活后台任务就行了

不管放在那儿,它总是需要耗时的,而中断控制对象所需的实时性很高。

使用特权

评论回复
11
norman7890|  楼主 | 2016-1-12 10:16 | 只看该作者
捉虫天师 发表于 2016-1-11 20:48
解决这个问题最简单的方法就是用RTOS来做,通过线程来解决冲突。

RTOS是什么,我去查查,谢谢。

使用特权

评论回复
12
norman7890|  楼主 | 2016-1-12 10:17 | 只看该作者
捉虫天师 发表于 2016-1-11 20:50
1建议你把中断程序优化下,写到其他位置,和中断分离,这样扫描的周期 会短点
2另外,你可以考虑用定时中断 ...

systick的没法挪到别的位置,控制对象实时性很高。而且必须是40us啊,这都是硬件设计好了的

使用特权

评论回复
13
norman7890|  楼主 | 2016-1-12 10:18 | 只看该作者
ofourme 发表于 2016-1-11 21:32
你这个cpu的占用率也太高了吧,40微秒的时间中断程序就占用了38微秒。建议优化中断程序或是换芯片。还有, ...

确实很高,硬件电路都设计好了,而且不允许换芯片

使用特权

评论回复
14
norman7890|  楼主 | 2016-1-12 10:20 | 只看该作者
sl3340 发表于 2016-1-12 09:11
这个问题其实是两方面问题,第一,你的CPU能不能满足你的代码实时性的要求。第二,你的代码是否需要这个实 ...

用的f051的R8的片子,只能尽力去满足,已经不能再改芯片了。而且控制对象确实需要这种实时性

使用特权

评论回复
15
yhn1973| | 2016-1-12 11:16 | 只看该作者
你把你那个38us的运算式子贴出来,看看有没办法优化。

使用特权

评论回复
16
whtwhtw| | 2016-1-12 11:36 | 只看该作者
如果中断程序实时性要求不高的情况下,中断后给个信号量就行了,程序放在中断外面执行
如果中断程序实时性要求高,就要优化设计了,可以肯定的说,你的程序有问题

使用特权

评论回复
评论
幸福至上 2016-1-12 19:07 回复TA
完全赞同 
17
norman7890|  楼主 | 2016-1-12 11:53 | 只看该作者
yhn1973 发表于 2016-1-12 11:16
你把你那个38us的运算式子贴出来,看看有没办法优化。

主频48M,这是程序计算最多的一部分,还有些没贴,这部分耗时20us。

使用特权

评论回复
18
changmiao| | 2016-1-12 12:37 | 只看该作者
norman7890 发表于 2016-1-12 10:16
RTOS是什么,我去查查,谢谢。

RTOS是实时操作系统,任务调度之类的也会占用资源,你用了之后只会死的更快。如果38us的计算是每次必须执行的话,只能是提高主频,加快CPU的执行速度了。什么放到后台执行不但没有解决问题,还可能导致错过该次运算。

使用特权

评论回复
19
huangqi412| | 2016-1-12 13:55 | 只看该作者
程序systick中40us进一次中断,中断程序大概耗时38us,   这还只是一个中断,还有其他工作。

如果整个程序不能有大的优化空间,或者这个中断函数不能有大的优化空间,唯一办法就是换单片机了。。。

使用特权

评论回复
20
huangqi412| | 2016-1-12 14:01 | 只看该作者
25K计算频率,而且要复杂式子。有点像开关电源之类,但是F0没有高精度的PWM模块啊,数字电源不是要高分辨率PWM模块么。

使用特权

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

本版积分规则

1

主题

15

帖子

1

粉丝