打印
[MCU]

MCU运算时间超过采样间隔怎么办?

[复制链接]
3712|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pkuzhx|  楼主 | 2015-7-8 10:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人菜鸟一枚,使用的是silicon lab家的EFM32WG990。
现在要做的事情是,MCU每隔40ms去读取外部传感器的数据,并存储下来。每当存够25个新数据(1s),就进行一次计算,显示计算结果。然后继续采集,继续重复做同样的事情。
现在的问题是:每次计算的时间大概在100ms以上,这样每当到计算的时候,就会错过2~3个传感器数据。
请问各位大侠,有什么办法能够不缩短计算时间,也不丢失数据吗?

相关帖子

沙发
dirtwillfly| | 2015-7-8 10:05 | 只看该作者
把计算时间分散到每次采样后

使用特权

评论回复
板凳
dirtwillfly| | 2015-7-8 10:05 | 只看该作者
不要集中计算

使用特权

评论回复
地板
pkuzhx|  楼主 | 2015-7-8 10:13 | 只看该作者

嗯,这确实是一个办法。
我计算中耗时的主要是fft,把一个fft拆成几部分去运算也不是不行,但是程序就被打散了,感觉会很混乱。最后实在不行也只能这样了

使用特权

评论回复
5
pkuzhx|  楼主 | 2015-7-8 10:15 | 只看该作者
我正在看manual中的DMA部分,不知道有没有人对DMA熟悉的?
DMA可不可以每隔固定时间间隔,通过I2C去读取外部传感器数据?

使用特权

评论回复
6
ayb_ice| | 2015-7-8 10:28 | 只看该作者
FFT也要不了这么久吧,何况这是ARM核的

使用特权

评论回复
7
dirtwillfly| | 2015-7-8 10:37 | 只看该作者
pkuzhx 发表于 2015-7-8 10:13
嗯,这确实是一个办法。
我计算中耗时的主要是fft,把一个fft拆成几部分去运算也不是不行,但是程序就被 ...

不这样的话,就只能提高mcu的运行频率,或者采用更高频率的mcu了

使用特权

评论回复
8
gx_huang| | 2015-7-8 10:42 | 只看该作者
难道精度很高?FFT计算,我用普通的MCU,也不要这么长时间。
数据采集要定时中断采集,累计采集25个后,通知主程序FFT处理。时间就足够了。

使用特权

评论回复
9
ningling_21| | 2015-7-8 11:17 | 只看该作者
或许程序或关键算法不够精简

使用特权

评论回复
10
mcu5i51| | 2015-7-8 11:17 | 只看该作者
中断,OS优先级都可以
你40mS采样一次,采样一次要用40吗,合理安排一个时间就好

使用特权

评论回复
11
pkuzhx|  楼主 | 2015-7-8 11:39 | 只看该作者
gx_huang 发表于 2015-7-8 10:42
难道精度很高?FFT计算,我用普通的MCU,也不要这么长时间。
数据采集要定时中断采集,累计采集25个后,通 ...

fft是512点的,不过确实没有做优化,所以可能时间会比较长

使用特权

评论回复
12
pkuzhx|  楼主 | 2015-7-8 11:40 | 只看该作者
mcu5i51 发表于 2015-7-8 11:17
中断,OS优先级都可以
你40mS采样一次,采样一次要用40吗,合理安排一个时间就好 ...

嗯,我再回头看看中断。
主要是新手,这些东西都不懂。。

使用特权

评论回复
13
pkuzhx|  楼主 | 2015-7-8 11:41 | 只看该作者
ningling_21 发表于 2015-7-8 11:17
或许程序或关键算法不够精简

嗯,我也在做程序上的精简,不过感觉凭我能力要从100多ms精简到40ms以内还是任重道远的

使用特权

评论回复
14
bald| | 2015-7-8 11:42 | 只看该作者
采样、运算、显示三个进程分离
将采样优先级置为最高。
显示更新率没有必要这么高,每秒25次更新既无必要又耗时间。

使用特权

评论回复
15
pkuzhx|  楼主 | 2015-7-8 11:44 | 只看该作者
gx_huang 发表于 2015-7-8 10:42
难道精度很高?FFT计算,我用普通的MCU,也不要这么长时间。
数据采集要定时中断采集,累计采集25个后,通 ...

其实除了FFT还有其他运算的,不过FFT占用时间有2/3吧。
对了,你用的FFT是多少点的?大概运行多久?

使用特权

评论回复
16
pkuzhx|  楼主 | 2015-7-8 11:45 | 只看该作者
bald 发表于 2015-7-8 11:42
采样、运算、显示三个进程分离
将采样优先级置为最高。
显示更新率没有必要这么高,每秒25次更新既无必要又 ...

嗯,多谢。
可能我没说清楚,显示是每采25次才更新一次,也就是每秒一次

使用特权

评论回复
17
lgq1542380129| | 2015-7-8 11:58 | 只看该作者
FIFO+DMA应该行吧

使用特权

评论回复
18
john_lee| | 2015-7-8 12:24 | 只看该作者
楼主这种情况属于“过载”。
先解释一下“载荷”和“载荷周期”的概念:在嵌入式环境中,CPU 都是为了处理一些“周期性”或“非周期性”的事务,每个事务的处理都需要 CPU 付出一定的计算时间,我们称之为该事件的“单次载荷”。
而宏观上该事务的载荷在 CPU 运行的整个过程中所占的比重,可以用“该事务的载荷比率”来表示:
某事务的单次载荷(秒)* 平均每秒载荷次数 * 100% = 该事务的载荷比率
所有事务的载荷比率相加,即得到了“CPU 的总载荷比率”,总载荷比率如果大于 100%,即表示“过载”。过载的后果一般会导致需要处理的事务丢失,如果还有连锁反应,那后果就难以预料了。
出现了这种情况,一个简单的办法是“使用更快的 CPU”以降低事务的单次载荷。
如果不想换 CPU,那么办法也有,要复杂一些,涉及 4 个概念:“无效载荷”,“有效载荷”,“绝对过载”和“相对过载”。
在事务处理的具体逻辑中,可能包含一些延时或等待,这些延时或等待仅仅是为了同步的需要,是事务逻辑本身或设备本身要求的,
并不是 CPU 要求的,换句话说,CPU 在这些延时或等待过程中,没有任何实际的功效和出力。这部分逻辑所消耗的计算时间,我们称之为“无效载荷”。
而“有效载荷”自然指的是事务处理的整个“载荷”去除掉“无效载荷”后计算时间。
如果我们把 CPU 在某事务的“无效载荷”上所消耗的计算量,通过一些手段转移到其它事务,就可能变为其它事务的“有效载荷”。这样做可以有效地降低载荷,现在我们使用另一个载荷比率:
某事务的单次有效载荷(秒)* 平均每秒载荷次数 * 100% = 该事务的有效载荷比率
所有事务的有效载荷比率相加,即得到了“CPU 的总有效载荷比率”,这个比率如果大于 100%,即表示“绝对过载”。
如果发生了“过载”但没有发生“绝对过载”的情况,称之为“相对过载”。
对于发生了绝对过载的情况,你还可以优化现有算法,或更换算法,这也是为了降低“单次有效载荷”。如果仍然发生绝对过载,你只能回到第一个办法了。
如果是相对过载的情况,办法是使用一些 RTOS 或前后台等等的调度方法,把无效载荷转为有效载荷。
对于周期性不强或非周期性的事务来说,整个平均有效载荷比率不会导致绝对过载,但在事务的突发时期内,其有效载荷比率也有可能会导致单位时间内的绝对过载,这种情况的一般处理方法是设置一个足够大的事务缓冲,把发生的来不及处理的事务暂存起来,不至于丢失。
最后一点,虽然理论如此,但实际情况的一些细微的分析不到的变数,可能引起载荷失控,导致灾难性的后果,所以不要把总的载荷比率搞得太高,要留有一定余量。

使用特权

评论回复
19
gx_huang| | 2015-7-8 12:24 | 只看该作者
pkuzhx 发表于 2015-7-8 11:44
其实除了FFT还有其他运算的,不过FFT占用时间有2/3吧。
对了,你用的FFT是多少点的?大概运行多久? ...

这家公司有一个应用笔记,有FFT代码和运行时间数据。见附件。

e-AN142.pdf

646.97 KB

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
baiyunfei.k.f + 1 赞一个!
20
songchenping| | 2015-7-8 12:50 | 只看该作者
如果你关心的是最近25次采集数据,可以考虑用DMA的方法,边采集边计算啊。

使用特权

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

本版积分规则

45

主题

730

帖子

6

粉丝