查看: 1549|回复: 7
打印 上一主题 下一主题

AVR的延时与MCU的资源占用率

[复制链接]
跳转到指定楼层
沙发
发表于 2014-7-30 15:03:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

我是七月初过来因仑“3+1”特种兵训练营的,以前从来没接触过像马潮老师这样的高手,之前虽说没用过AVR,但是单片机上的东西大多是相通的,在这里学到很多东西。但也意识到以前的硬件编程思想与马老师,李老师编程思想上的很多不同,引发了一些思考。我说一说,供大家参考,只为学习,无意争论。

我第一次看到一行来的战友Delay()函数的代码时我吓了一跳,竟然让单片机空转以实现和外界同步,这怎么可能?
试想,如果PC机CPU空转一秒,那么音乐会断一秒、画面会停顿一秒、下载文件会断一秒,这怎么可行?

我看到很多单片机程序,它们的单片机99.9%的工作时间都在打空转,99.9%大家可能感到有些危言耸听,那就让我们算一算:

已内部8M频的AVR单片机来说,单指令周期仅为1/8 = 0.125us,那一毫秒可以执行多少个单周期指令? 1%0.125*1000 = 8000个

而我看到论坛里下到的绝大多数程序,两个延时函数之间代码的执行时间要远远小于8000个指令周期。
说实话,很多16K以上的程序,把所有延时函数去掉,总体能执行几毫秒就不错了。

换句话说,我说单片机的利用率小于0.01%还是口下留情了。

要说怎么解决问题,就要先找到问题,我问问大家,程序中,我们为什么延时?

原因很多,可能是外设速度太慢,也可能是为了躲过人眼视觉停留时间,等等。
总之就是与外界不同步,而我们想要同步。

所以说这些延时应该是很有道理的,我不否定这一点,但问题的关键这些延时空转,我们为什么不能把这些时间回收起来做一些别的事呢?
试想,如果把这99.9%的时间回收,那可以一笔相当巨大的资源。

有很多人有些特殊方法回收过这些空转时间,比如说在延时函数中做点事。

但这些往往都不通用,下面我说一下我的方法,这也是我根据之前的程序和这几天敲出的程序总结的:


前后台模式下延时时间回收的方法:

前后台模式就是大家最常用的主程序大循环 + 中断的模式。

首先解决外设太慢问题,像串口、键盘、LCD、SD卡等I/O,这些收发可以建立外部缓冲区。比如串口收发在中断中完成保存到缓冲区,而主程序操作缓冲区而不直接操纵串口,这已经看到很多人这样用了。但像矩阵键盘的缓冲区,我很少看到有人这么用,在中断中接收按键信息保存到缓冲区。
还有像LCD,我们一个个往显存中写数据是很浪费的,也应该建立缓冲,统一处理。

建立缓冲区这类方式中间有一些技术难点,比如像串口接收,无法判断对发是否全部发完,怎么办?可以设立定时,如果一个字节接收之后1ms之内没收到下一个,则认为接收完毕。这只是一个思想,具体应用大家掌握。

可能有人会说,除了外设太慢,还有像视觉停留的问题怎么解决,总不能让流水灯快到人眼都看不清吧。
这就我下面要说的问题,这些延时的时间怎么回收?就是全部放到定时中断中!

可能又有些人会说,书里、教程都说了,中断处理东西的时间要尽量短,你这样整个中断有太多判断、很长,时间很长,这不行。

这是一种教条的思想,把书读死了。可以在中断中这样处理,比如:

void (*Task)(void);
ISR
{
      (*Task)(void);
}

中断里用的内容通过函数指针来调用,这样可以在主程序根据需要时任意改变要执行的任务,还可以改任务的周期。所用的判断都是在主程序需中执行,然后改变指针的指向,来确定中断中下一步的任务。

这样,在前后台系统中主程序将任务分配完,还有很多余力处理很多事。

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

可能还有人会说,有些项目用不了这么苛刻的时间,你回收的时间用不了,要那么多干嘛?
其实这时,你就可以用死循环扫描事件,可以实时响应。你的系统跟原来空循环延时比,实时性要高了不知多少倍。

好了,这只是小弟个人的总结,跟大家分享!



回复

使用道具 举报

板凳
发表于 2014-7-30 15:14:04 | 只看该作者
不错,确实是这样的,但是回过来想,有时我们又不得不这样啊,比方说向内存里面写入数据时的等待
回复 支持 反对

使用道具 举报

地板
 楼主| 发表于 2014-7-30 15:16:50 | 只看该作者
完全可以采用计数的方式
回复 支持 反对

使用道具 举报

4#
 楼主| 发表于 2014-7-30 15:17:22 | 只看该作者
SDC158477392 发表于 2014-7-30 15:14
不错,确实是这样的,但是回过来想,有时我们又不得不这样啊,比方说向内存里面写入数据时的等待 ...

完全可以采用计数的方式
回复 支持 反对

使用道具 举报

5#
发表于 2014-7-30 15:18:12 | 只看该作者
delay确实不好,要是用定时器和中断像马老师水平一样,那资源节省率真是太极致
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2014-7-30 15:20:37 | 只看该作者
还你一世界 发表于 2014-7-30 15:18
delay确实不好,要是用定时器和中断像马老师水平一样,那资源节省率真是太极致 ...

定时器中断其本身并不难,难就难在怎么才能分配好中断时长,还有就是考虑MCU的占用率。
回复 支持 反对

使用道具 举报

7#
发表于 2014-8-3 09:06:50 | 只看该作者

还你一世界 发表于 2014-7-30 15:18
delay确实不好,要是用定时器和中断像马老师水平一样,那资源节省率真是太极致 ...

定时器中断其本身并不难,难就难在怎么才能分配好中断时长,还有就是考虑MCU的占用率。
很受教
回复 支持 反对

使用道具 举报

8#
发表于 2014-8-3 09:52:56 | 只看该作者
让我有种拨开云雾见日的感觉
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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