最近用rtthread系统下AD采样并低功耗,中断响应不及时

发表在 PM2016-1-29 20:03 [复制链接] 8 3006

问题一描述:rtthread下采样AD,AD中断大概80微秒一次,并且CPU执行4MHZ,目的是降低功耗。
: Y0 h. ]9 G, U4 l( t8 U大概分析了原因可能是内核的调度程序过程void rt_schedule(void);中关闭全局中断,导致AD中断无法及时响应,因为此时CPU运行在4MHZ。0 t# v" }$ `5 [1 _2 `
各位有没有好的办法啊?最好改一下内核什么或者其他。
* }8 v# \9 s- r- q: G
# [/ L" k) r* W问题二描述:rtthread如果调度过程中并开启中断会出现什么情况?没有仔细想,先mark一下这个问题
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2016-1-29 20:39:39 | 显示全部楼层

最近用rtthread系统下AD采样并低功耗,中断响应不及时

测算出AD的ISR的执行时间,并评估可能性。
& g- h' V4 }/ B" {$ |  T4 o
7 G1 v  U; I' A! E7 ~- e6 t尽可能把AD用DMA来采
使用道具 举报 回复
发表于 2016-1-29 20:51:05 | 显示全部楼层

最近用rtthread系统下AD采样并低功耗,中断响应不及时

补充:rtthread下采样AD,是采用DMA方式,当DMA数据传送结束以后,需要及时在DMA的中断服务程序中重新写入DMA搬运的长度,DMA的中断服务程序大概是80微秒中断一次。
使用道具 举报 回复
发表于 2016-1-29 22:02:16 | 显示全部楼层

最近用rtthread系统下AD采样并低功耗,中断响应不及时

问题二:是对临界区的保护,无法开启中断。
使用道具 举报 回复
发表于 2016-1-30 20:28:18 | 显示全部楼层

最近用rtthread系统下AD采样并低功耗,中断响应不及时

问题一描述:rtthread下采样AD,AD中断大概80微秒一次,并且CPU执行4MHZ,目的是降低功耗。
4 j; ^) L1 ^& l  X$ G) F1 x% g大概分析了原因可能是内核的调度程序过程void rt_schedule(void);中关闭全局中断,导致AD中断无法及时响应,因为此时CPU运行在4MHZ。1 V) I  o, R/ \$ }
各位有没有好的办法啊?最好改一下内核什么或者其他。
& h6 M0 [+ q% K! v
0 ~1 Q/ Y1 W7 R8 T6 \- G5 K问题二描述:rtthread如果调度过程中并开启中断会出现什么情况?没有仔细想,先mark一下这个问题
; H& ^# t3 |4 B) W% N7 k$ d
中断 80us 一次,CPU频率 4MHz,两次中断之间 CPU 只能运行 320 条单周期指令…… 你这系统别干别的了,光进中断出中断就已经跑死了……
使用道具 举报 回复
发表于 2016-2-3 15:55:41 | 显示全部楼层

最近用rtthread系统下AD采样并低功耗,中断响应不及时

需求:ADC  采样频率 1S/12800个,即78us采样一次,并且要求4个通道采到,CPU频率需要工作在4MHZ或者8MHZ,以便保证功耗,采用rtthread 系统,CPU采用cortex-M0+,freescale KL series,此芯片有个限制:4个ADC通道不能同时采样。
: L/ a3 A1 H* ?* g* c
8 c+ U) ?2 R. R2 f' i, T1 d8 u6 H
- D4 m8 ]! n* m3 h: y  C1 X8 _# k一、        需要解决的问题:
$ N8 g  i. O1 `& _! z1、        ADC轮流采样。6 M$ v4 D+ _5 d, c+ Y" y( P: w
2、        78us采样一次。
% J" G# ?0 X4 [* U5 |8 r3、        低功耗问题。
2 H' y! \) g$ j- h/ X4、        在cpu工作在4MHZ或者8MHZ情况下,rtthread系统在78us能及时的响应。
5 ^0 c& x: _+ m3 [6 M二:对策及思考:+ J( w2 @7 P9 l) O/ p
1、        根据一、条件4,采用中断方式基本行不通,大概评估了一下在4MHZ情况,rtthread系统响应时间大约要150us.
3 p4 q2 o9 t6 @; Q2 s, L/ ~( g2、        采用DMA方式来采样ADC的值。. {  F4 Z& H" M
3、        采用DMA方式来改变ADC的采样通道从而触发ADC采样,DMA的触发源为:周期性硬件定时器 78us触发一次。0 Q1 z% j) l' P8 ]; Y: {, _2 q
二、        方案:, |) ]: Z7 w! I4 C- [4 a9 _
; F$ {' W; S4 Z' y' L1 n& A
                                图1
% q. p3 {3 h: Y9 q& R0 J3 B三、        实现:
, D0 s) w' y8 P" |; o4 v9 E
4 Z2 H! x3 @- p  n; Y8 J0 I! B $ F( v( d2 L* Z7 e( m0 v
                                                                                                                              图28 {3 Y7 e$ b' Z5 i: L
' ~- K8 M- V, r2 [
" e: B# F+ C$ Z# |" U- e
1 x" h' \' H& g& H' o5 d
3 K; \* f7 X. _: S& I7 r- u3 Z/ r

; P$ y) I1 t5 L! U+ V                                                  图3
, E+ K( u3 H; }3 F) Y五、上述方案及实现存在的问题:
! F$ M" B* ]; j  ]* ~7 F' Q1、如上图2: 当4个通道值传送完成以后,DMA0的BCR如何及时进行填充?因为TPM的触发频率78us/次,如果DMA0传送结束以后没有及时填充BCR,会导致DMA0出错。  a8 \$ P: R  k; ?
2、同样上图3MA1的BCR如何及时填充?虽然它的触发间隔是78us+DMA0传送时间+ADC采样完成时间。 试了一下这个是可以用DMA中断来进行BCR填充,但它仍然有一定的风险,导致DMA1出错。
* o* c# F3 ?4 d& x/ j! m六、接下去的方案及实现:3 `. D2 z3 b$ ?4 A
就是解决 五  中的2个问题,由于芯片有一个link功能:当一个DMA结束以后可以启动另一个DMA,即采用另一个DMA(设DMA2)中对DMA0的BCR进行赋值。
' |: c* U/ m! a+ P7 M3 g: a( f+ n0 H这里DMA2需要传送清除DMA0完成标志+DMA0的BCR等2个数据到DMA0的寄存器来实现,而DMA2本身的BCR可以采用DMA2中断来实现,因为DMA2中断只要在有大约64*4*78us时间里面完成对BCR的填充就OK。
' ^8 V9 e* a6 p, y4 K同时道理可以在DMA1 link 到DMA3,让DMA3来完成DMA1的BCR和清除标志的工作。当DMA3中断来时发信号量到任务,然后进行数据copy,为了防止采样BUF溢出,采用循环2倍BUF,同时在DMA3中断到来时,cpu根据标志读取相应的BUF段。
( f) x  c, w/ Z如下图:
4 g. ?& P" H8 |: a8 N& I2 Y
5 Z5 Z' E  z9 L( t; K) m注:相当于采用4个DMA来规避。
7 `) i: I' K* a2 s* I0 _3 V注: 不知道怎么上传图片。。。。
使用道具 举报 回复
发表于 2016-2-4 15:22:45 | 显示全部楼层

最近用rtthread系统下AD采样并低功耗,中断响应不及时

你的方案本身有问题呐。另外一个,低功耗和实时性有的时候是比较难兼顾到的
使用道具 举报 回复
发表于 2016-2-6 18:00:00 | 显示全部楼层

最近用rtthread系统下AD采样并低功耗,中断响应不及时

啥问题?请指教,哈!
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

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