嵌入式系统分时任务调度算法实现

来源:互联网 发布:免费开源asp源码 手机 编辑:程序博客网 时间:2024/06/05 03:20

 

嵌入式系统分时任务调度算法实现

 

-                                                            2014 酷玩创意

 

 

       直奔主题,今天我们讲的是定时任务处理。简单讲就是我有一系列的任务需要在将来的某个特定时间由系统去处理。补充一下这里的将来去处理不是系统就可以延时阻塞当前的任务,这样的情况没有什么研究的价值,我们说的是在定时时间到达后系统中断当前任务处理定时任务,完了再回到主线程继续运行。

        不知道大家平时有没有遇到过这种需求。就拿之前我们说到过的红外解码的干扰控制:一次成功接收到红外按键后你至少需要在500ms到1000ms后重新打开红外接收的中断,这期间你也不可能用最土的延时等待的方法让系统阻塞在解码函数里(假设你正在控制高速运转的机器,阻塞操作岂不是作死的节奏啊!),这个时候你该整么办呢?

        像MCU这样的器件一般运行在没有操作系统的环境中程序就一个循环到底,要做到这样一点似乎有些困难。我们应该明确处理定时的入口应该是中断机制,要不然这种东西就根本没有第二种方法可能了,他又是和时间强相关的任务,结合我们之前讲到的系统时间戳概念其实我们就可以找到解决问题的办法了!

        这里采用的分时操作的原理即:我们在系统时钟中断中查询系统设置的任务和超时时间,如果判断时间到达我们就执行相应任务我们称之为job。从本质上来讲,其实这和操作系统的时间片的操作相似,在某一个时间系统只会处理一个任务,系统的多线程和多任务不过是分时复用的结果。电脑速度那么快我们感觉就是CPU在并行处理多个任务一样。当然为了更好的管理这些定时任务我们需要做一些数据结构的设计。

        下面就是代码时间了,代码才是程序猿的自我修养啊!



Job数据结构设计

 

        这里我们在一个Job里面定义了time用于job被添加的时间统计,timeout是超时时间,即job会要被执行的时间持外最重要的是job执行体hand 是一个函数指针。在我们的应用中设置了最多10个定时任务,这相当于线程池的概念 如图。

 

        要将任务动态的加载到系统中,我们通过



任务添加

 

        查询系统未使用的job ID将我们要处理的任务添加到全局的Job队列里面(暂且这么叫吧)。

 

        很明显接下来就是job的中断查询和处理的问题了,贴上之前用过的一张图:



 任务查询处理


        我想到这里大家应该都知道该怎么去做了,这里给出的是一种处理的思路,感兴趣的哥们可以看看我们的工程代码。


完整代码工程可通过http://shop108911095.taobao.com/?spm=2013.1.0.0.Z8tf8S取得

 

更多趣味算法、应用更新中。


0 0
原创粉丝点击