新闻中心

EEPW首页>电源与新能源>设计应用> 高效使用单片机放弃程序中延时函数

高效使用单片机放弃程序中延时函数

作者: 时间:2014-01-16 来源:网络 收藏
-family: Tahoma, Arial, sans-serif; font-size: 14px; text-align: justify; ">这样,在前后台系统中主程序将任务分配完,还有很多余力处理很多事。

本文引用地址://m.amcfsurvey.com/article/226910.htm

比如有很多个键盘、LED点阵、数码管等,它们都需要实时响应,很容造成编程困难、响应迟钝,其实只要把延时的时间回收,处理这些就非常从容了。

可能还有人会说,有些项目用不了这么苛刻的时间,你回收的时间用不了,要那么多干嘛?

其实这时,你就可以用死循环扫描事件,可以实时响应。你的系统跟原来空循环延时比,实时性要高了不知多少倍。2、变异的协作式内核

先说说嵌入式操作系统的内核,简单的说,它就是个任务调度器,让多个任务在同一个CPU上同时执行,所谓同时也是相对的,无非就第一个任务执行几毫秒、第二个任务在执行几毫秒。。。外表看起来就是同时执行。

至于可剥夺式内核和协作式内核的区别,大家可以百度一下。

说道能在上用的嵌入式操作系统,大家会说出一些如uCosII、FreeOS等操作系统。

还有很多人对这些操作系统十分抗拒、十分反对,他们的理由是什么?

1、这些操作系统占用大量RAM、ROM

2、这些实时操作系统所谓的实时是相对非实时操作系统的,跟裸机比实际上是慢了

这些理由不是没道理,因为这些商用操作系统都是可剥夺式内核,它们的原则是保证最高优先级任务在可确定的时间内响应。

它们的有优点是任务切换时间是确定的,不会随任务的多少而改变。

有了这些确定性,让它们在商用产品大放光彩。因为其时间稳定性。

但它们的缺点也很明显,中断级节拍浪费很多时间。任务间同时调用时引发同步问题而引入许多如信号量、邮箱等机制浪费大量RAM、ROM。

综上,可剥夺式内核稳定可定量,在越高级的上越有优势,在8位机上可用,但需要大量裁剪,并不一定合适。

而协作式内核的核心思想是什么?它不像剥夺式内核保证最高级任务速度最快,而是保证所有任务的平均速度最快!

正如我前面的说法,我连续两个之间的代码很难超过1ms,甚至很难超过100us,我们可以将其忽略。这样10个任务,第一个执行完主动放弃控制权,交给第二个任务,第二个任务执行完主动放弃控制权,交给第三个任务。10个任务之间无间隙,每一个任务需要延时时,就主动放弃控制权。

基于这种思想,我们的就达到了回收空转延时的目的,而且应为每个任务是执行完后主动放弃,所以不存在剥夺式内核的同步问题,基本不需要邮箱、信号量等机制,对RAM、ROM的要求就非常低了。

这样来看,协作式内核非常适合8位机。但可能有太多嵌入式系统的书中对剥夺式内核不分场合的认可,造成很多人误解。而且uCos等系统的权威,也让很多RTOS作者争相效仿,没用对8位机的场合做合理分析。

商用系统中没有协作式内核,而民用的,还少有优秀的协作式内核,都是基于传统节拍。

传统协作式内核需要定时中断为时钟基准,也会间歇性打断任务,造成不必要的损失,这并不是我们想要的。

我们其实可以仅仅是让定时器以大分频系数开着, 而不给其产生中断的机会。当任务将要放弃使用权时,读取定时器,作为时钟基准,然后清零。

做法一句两句说不清,而效果是什么?可以做到任务是以不受干扰,与裸机相同的工作状态,这是传统协作式内核做不到的,而仅当它需要延时了,才放弃使用权,将延时的时间给其它任务。这正符合我全文的目的 -- 回收空转延时时间,这样的内核体积会非常小,运行方式与裸机无异,仅仅是把空转延时时间干些其它事。对使用者还没什么要求,不想以往系统那么复杂。

可惜市面上并没有基于这种方式的内核,我已经写了一个,非常精简,运行稳定。但作为一个想应用实际的内核,还需要检验。


上一页 1 2 下一页

关键词:单片机延时函数

评论


相关推荐

技术专区

关闭