EDA365电子论坛网
标题: 单片机通过定时器来实现多任务,充分利用定时器资源来实现异步处理 [打印本页]
作者: damengshu 时间: 2021-10-26 15:50
标题: 单片机通过定时器来实现多任务,充分利用定时器资源来实现异步处理
在单片机系统中,有许多情况下需要等待某个事件的发生,来继续下一步操作,如果有一个任务还好说,单片机可以无限等待事件的发生,但是如果单片机要处理多个事件时,这种系统一般不能实现,除非用中断,对!用中断,但是中断源的数量是有限的,并且有很多中断源是针对特殊用处,这样能给我自由分配的中断源就只有定时器中断和外部中断,如果仅使用这几个中断源来实现异步,这样可实现的异步事件时非常有限的,每个中断源完成一个异步事件,效率是相当低,大大降低了系统的性能,降低了定时器的利用率.
因此在这里我考虑使用定时器中断来实现多个事件的异步,一个定时器如何实现多个任务的并发?
在这里使用一个任务一个计数器,根据任务实时性的强弱,来设计任务计数器的计数溢出值,每个任务的变量通过一个全局结构体来定义,当然这个结构体必须包括这个计数溢出值。每到一个定时器中断,各个任务计数器都加一,然后检查计数器是否溢出,如果计数溢出就执行相应的任务,同时将此任务的计数器值清零,,如果溢出执行相应的任务,如果没有,则此任务就不执行!但一定要注意在中断程序,千万不能有死循环,如果有等待一定要进行超时检测,来避免死机!
这里举个例子,刚刚成思路,因此写的不是很好!这个程序使用一个4连体数码管显示从DS18b20中采集的温度值,4位连体数码管当然只能使用动态扫描方法来显示数据,并且这个动态扫描不能在主程序中执行,因为在主程序动态扫描效果很容易收到中断程序的影响,而使显示效果下降,因此必须使用定时器来控制延时实现动态扫描,但是ds18b20的读写时序对延时的精度要求也是相当高的,如果在主程序中,中断程序造成的延时必然会对ds18b20采集数据的延时精确度造成干扰,而不能采集正确的数据!因此DS18b20采集数据的程序也不能够放在主程序中,当然我们可以使用两个定时器来实现!这里我们使用一个定时器来实现,由于DS18B20温度转换时间比较长12位精度的温度转换需要接近1秒的时间,这对动态扫描是无法容忍的,可行的办法是将启动转换,读取温度值放在同一个中断的不同状态,也就是在任务中实现状态机,从而避免了在中断中出现长时间的等待,而影响系统的性能!以下中断函数的具体实现:
void interrupt main_int()1 O4 L, A- [! ~! m! O: ~
{: v4 C0 B* @- k B7 {& E
// t0_int(&data) ;
% G4 h) B" B `1 e( a% L v! luchar tl ,th ;
; i% ]5 p. f- n: S; z$ g' nuint temp ;
& ` |. L2 b" H: }" T/ gif(T0IF)8 }' q- Z5 M, I# ?, K7 M3 x |
{1 N% i( y1 z; L5 f) Q$ L
T0IF=0 ;
. Z- ~% [8 R/ W% x! v$ R (ds.count)++ ;4 U+ f5 S. ^% @! b2 f
if(ds.count==80)
+ H7 i% {, U4 r; X5 v& f {
3 V. @# K9 y1 W4 G5 k' S ds.count=0 ;
# n' }: g. d/ U! h3 X switch(ds.state)
% B0 e1 _3 v7 H4 X1 S4 a { n8 D8 y# |6 o9 e' U1 R6 \
case 0 :
/ {: h. w. _7 z# f ds.state=1 ;; p6 g3 Z. A# r8 N+ T; ~7 p
init_ds18b20() ;
2 w0 c" W4 k4 d7 u7 F3 ^ write_ds18b20(ROM_SKIP) ;( y: b g5 b+ H4 K3 H+ b
write_ds18b20(MEM_CONVERT) ;; R. k8 x2 H& B
break ;
% U, f0 P) t0 Y+ v! T case 1 :5 Z1 o$ |1 @2 w7 I1 J2 p, Z- N
init_ds18b20() ;
& B6 ?) d3 E6 v5 l% t7 { h write_ds18b20(ROM_SKIP) ;2 B9 `/ \1 h- i% C
write_ds18b20(MEM_READ) ;
( H% d+ G. b; F5 p tl=read_ds18b20() ;
4 [: R+ \$ r# Y+ F( x th=read_ds18b20() ;
' \. ^3 s- ?* h! ~ if(!(th&0xf0)); r3 u3 j* b3 Q1 ?
{3 V- }; q: I& o3 k, Q; T7 j
th=th&0x07 ;1 L! a# }/ ^5 T' p3 Y
temp=th*256+tl ;9 z- j5 S- u- m- U* m1 ?0 F$ Q
ds.data=temp/16 ;
8 s: F. s+ a% y; P8 s }& c1 w7 d. X5 W* w; v1 t- B0 f
else. D7 R8 a/ B% L$ ~. {' k
{ th=th&0x07 ;
8 R# `: K9 F) r$ V temp=th*256 +tl ; a1 Y4 M2 x7 Z0 j/ R8 p2 b+ D9 r
ds.data=temp/16 ;
j8 m7 j! p; [9 X" O1 V3 G }
1 i7 l' {) E/ G: V. b ds.state=0 ;
5 O$ b+ x' ~. _1 d( r) ~4 f7 a* r break ;; F7 ^3 I- Y5 Z& V7 s
default :1 t: U8 J+ `8 w3 \) e5 \) R
ds.state=0 ;
2 N6 ?( X: X$ X% N4 A break ;
. f: b2 U: C1 n. q* V }
0 ^+ Q! U6 T& E, l }0 n. g) Q& w G; ?; T
int_display1(ds.data) ;
) j O, K% P2 I: x# C f' Q" F TMR0=210 ;
\5 C" y( m. W9 F" K}
$ x* |- U' K2 U2 W, f}
1 ?( Q+ g& ]7 S! ]0 b0 a- D
作者: guanshen 时间: 2021-10-26 16:00
如果有等待一定要进行超时检测,来避免死机
作者: MLXG 时间: 2021-10-26 17:42
必须使用定时器来控制延时实现动态扫描
作者: kiygb 时间: 2021-10-26 17:43
中断程序造成的延时必然会对ds18b20采集数据的延时精确度造成干扰
| 欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) |
Powered by Discuz! X3.2 |