定时器分时操作系统
前后台系统,RTOS与定时器任务管理系统
前后台系统
在裸机上写程序,通常把程序分为两部分:前台系统和后台系统。
简单的小系统通常是前后台系统,这样的程序包括一个死循环和若干个中断服务程序:应用程序是一个无限循环,循环中调用API函数完成所需的操作,这个大循环就叫做后台系统。中断服务程序用于处理系统的异步事件,也就是前台系统。前台是中断级,后台是任务级。
写这个系统的目的:
- 为了能够充分利用cpu,不让他闲下来
- 可以实现多个功能同时发生
(前置条件):你需要知道只有一个cpu,他在物理的层面上是不可能同时发生的,但是他们可以欺骗人类,人类的视觉暂留有0.1s到0.4s
只要这几个任务执行的频率足够高,那么对你而言,他们就是同时发生的.
第二个点就是(化delay为挂起).
假设我们要执行一个跑马灯的操作,如果我们要设置他跑的慢一点,我们可以再他的每个灯显示后添加一个delay(time)
,但是在delay期间,我们的cpu是单纯的在等待,什么都没做. 于是我们可以设置一个时间任务,设置多少秒(只要设置和delay一样的时间就可以实现和delay一样的效果)而且在这些时间的间隔可以执行其他的任务1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23//原本的功能
show(){
SetLed(0,0);
delay_ms(2);
SetLed(1,1);
delay_ms(2);
SetLed(2,2);
delay_ms(2);
SetLed(3,3);
delay_ms(2);
}
//修改后
show(u8 w, u8 value){
SetLed(w,value);
}
//每两秒执行一次
per_2ms_conduct(){
static int i = 0;
show(i,i);
}
//这样子就没有delay出现了,你可以在同时执行其他的功能.
对于下面这部分的内容加了注解
1 | //这个函数只做了一件事(时间到了,将flag标志置为1,表示可以做) |
以上,
你就可以实现:
例如(我每1ms执行一次显示任务,这样在我眼里他就是一直亮着的,
每3ms执行一次串口通信,每次访问完后都可以及时把内容输送给限时任务执行.
按键任务也是类似的(但是按键要考虑防抖问题,所以你设置的时间间隔需要有考究))
这个时候的cpu就和你一样,飞速运转,一点都没有闲着.
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 小贺同学的blog!
评论