工作快1年了,刚进公司的时候本来有3个月的时间试用的,就是做5个练习项目而已,不过后来没有做完就被捉去做项目了,不过现在回想起来,这些练习都非常非常经典,能学到很多东西,不过练习都时针对俺现在做的家电这个行业的,至于
单片机的其它应用领域暂时不做讨论了,也没有这个水平,hoho~~
一 脉冲计数器
学怎么用外部中断+数码管显示。
最主要是学怎么显示数码管。简单的东西,看是简单的 ......但是关键是怎么做的好。刚开始的时候当然是经典的:查表,送数据到端口显示,然后指令死循环计时10ms然后扫第二个数码管了。真是经典的教科书模式啊,90% 的
单片机教科书都是那样说的 ....... 真经典,害人不浅啊。这样的程序结构,做是肯定能做出来的。问题:10Ms之内
单片机什么都不能做了,那是一回事,这样做出来的效果不好,很容易闪,重影等啥问题都出来。第一次深刻的感觉到,所谓的工作跟学习是不同的,做的不好客户是不会收货的.........后来终于想通了,这样做不行,数码管扫描的周期有偏差的话很容易不稳定,闪的,后来将整个数码管的扫描程序放到定时器TIMER 中断里面做。话时话,效果真好,中断绝对保证能准时执行了,嘿嘿,试用期学到的的一样东西。(不过确定是占用了中断很多的时间了,后来还是决定放弃这种做法,这是后话)
二 频率计
这个俺没有做,可以说不会做吧。本来思路就是两个中断,内部TIMER中断计时,然后外部中断数脉冲个数,不过咱们用的
单片机内部外部中断就公用一个资源,也就是只能内部中断,或者只能外部中断,郁闷了很久,没有去做,郁闷..... 不过学到一样东西,测频率还可以这样做:用端口读电平,然后内部计数器计数,可以算出周期时间来的,这样就可以算出频率的了,不过对占空比的方波有要求,不过算了,练习而已,做少1个2个没啥的。
三 RC充放电测原理做的电阻计
说实话,这个东西好啊,很多现在的家电也正在用的。假如测热敏电阻,我们一般用AD来做,这个非常方便的,但是碰到没有AD的普通
单片机,也是可以用普通IO口来做的,而且精度还算可以的。具体办法就是:用一个100K的基准电阻对一个电容充电(独石103就可以了),然后不断的扫IO口边计数,一直到读到高电平为止,记录计数值,也就是时间。然后用待测的电阻对同一个电容充电,同样记录充电时间,这两个过程的充电时间绝对成正比的,所以
单片机在通过一下运算就可以得出电阻的阻值了,1K-100K 的电阻误差在1K之内,算可以的了。这个练习非常深刻的理解,什么是IO口的状态,也就是所谓的输入状态和输出状态了,输出状态时候的拉电流给电容充电,还有输入状态的时候端口的高阻态,以便能正确读高低电平。这个东西非常非常重要,以后的应用也多的是,俺面试的时候也被问过类似的,俺当时不懂的,不过好在蒙过去了 ...... 之后就是双字节的乘法和除法,这个没啥,很多例子程序,对着抄 --b ,说原理这个东西还是比较简单,不过真正用硬件板来调试的时候就知道什么是恶梦了。非常非常恶劣的,俺现在还怕这样来测温的 .......
四 跑马灯
跑马灯是很容易的做的,不断的控制输出就可以了,关键这个跑马灯是需要控制亮度的,方法是输出PWM到端口,改变PWM的占空比的话就可以控制亮度的了。原理也不难,关键还是那个,
单片机没有PWM输出,又要手工编写PWM输出程序,这个东西时间要求太快了,确实很难写好的。就算到了现在也想不到有什么好办法解决,必须在主程序死循环产生PWM,整个程序结构都被改变了。
五 智能风扇
这个可以到商场看看,那些卖300-400RMB左右的智能风扇的控制程序就是这个了。orz,开始的时候看这个东西真实烦啊,控制说明都2页多,N多个时间控制,这个醒目俺也没有做,说实话,那个时候不能有这种水平,取而代之的是迟点做的MD风扇的那个程序,那个比较简单点。
多任务思想的建立
真正第一个量产的项目MD的遥控风扇,也是俺的一个真正意义的蜕变。一个真正意义上的
单片机系统,肯定是多任务的,像教科书上面那些例子程序,都是单任务,都是死循环等待延时,从某种意义上一点用都没有。想一下,那么多的CPU时间,都被死循环浪费掉了,这个还不要紧,最重要是怎么控制那么多个任务?数码管,LED,红外遥控解码,按键处理,延时逻辑,输出控制,好了,一堆任务同时到来的时候,我看该怎么办好 orz ,这个一直都是我一直最深恶痛决的一点,干嘛 99% 的
单片机教科书都没有说这个问题?是真正的
单片机工程师收藏的不愿意分项经验吗?还是说要咱们就去单任务就扫扫数码管满足一下“玩”
单片机的欲望就足够了?后来发现,网上偶尔有些帖子会说说这个问题,不过也是凤毛麟角了,根本没有人去重视,或者说这个本来比较深,而且相当部分直接是去说操作系统的问题的,没有人愿意去看?
好了,牢骚发完。我觉得处理多任务问题是介于一个初学者和一个真正能做产品的工程师最重要的分界线,所以我建议想用
单片机来做东西的朋友,首先必须搞定这个部分。其它
单片机外围接口可以慢慢学的。否则只是想玩玩的就算了,这个东西还是比较恶心的。
要理解多任务的处理,最好的办法就是去看《操作系统》这书了,这是计算机系的课程,咱们电子系没有开(这个也是深恶痛绝啊,干嘛不开呢,自己学多BT)。其实不用仔细学的,理解最主要的处理思想就足够了,看看60年代的时候操作系统的雏形的时候,是怎么处理多任务的?分时嘛,平时说多了,但是到实际用还是有点不知所措啊。
好了,有了这思想之后可以谈谈咱们怎么实现多任务的处理了。俺结出过的大概有3种
1 前后台系统
2 时间片轮询(有两种结构)
3 任务调度系统(可以说成是
单片机的操作系统了,也有抢占和非抢占两种形式)
1 前后台系统,后台是执行主程序,当中断来了,就转到前台来执行时间性要求高的任务。不断的切换。这个俺看过而已,没有用过。
2 时间片轮询,这个估计是最多人用的吧?hoho~ 很实用的。思想是为每个任务分配一个固定(或者不固定)的执行时间,如2ms,执行时间之内,CPU都是在这个任务内不断的死循环,TIMER中断2ms到的时候,强制切换任务,这样中断结束之后,cpu就可以跳到第二个任务执行了,这样每个任务都可以分配到CPU时间,整体来看,就好像每个任务都在同时执行,实现了多任务了。一个任务不全可能在一个分配的2ms的时间内全部执行完毕的,所以必须分很多个状态,产生了所谓的“状态机(status machine)”,例如按键,可以分 按下,延时消抖,松开 等好多状态的。嘿嘿,这个就是最重要的两个概念了,俺说的估计是比较抽象,不过不要紧,记住“时间片轮”和“状态机”两个最重要的概念,网上慢慢找资料学习吧,理解并且能应用之后,
单片机算是入门了。 阿门 ......
不过俺自己用的时间片轮询跟这个有点不同,俺是用一个子程序同时处理所有的时间处理和计数器的,然后每个任务(子程序)的入口都会有一个判断,判断时间是否已经到了,到了则进入处理,没有到则执行其它任务。其实也挺好用,不过就是计时器太多了,有时很烦 ..... orz ,这个东西我以前写过文章 ,貌似叫 “分时扫描”什么的,那时还没有树立时间片轮询这个概念,只是单纯的觉得这个东西很好用而已,hoho~~
3 任务调度系统,在我理解中的操作系统,只是实现了 任务调度,时间处理,内存管理功能的系统级别程序而已。然而实际上也差不多,不过做操作的优势非常明显,很多底层的东西可以抽象出来,提供一个通用的接口实用,非常方便项目开发。然后任务调度功能,提供了时间片轮差不多的处理效果,更重要的是,时间片轮是需要自己去切换的,而系统可以帮你搞定。鉴于这个优点,俺梦想中还是想编写自己的操作系统,这个也是开始研究这一块的开始,俺觉得,这个可以算研究
单片机的最后阶段了。当然并不是代表
单片机什么都懂了,相反,如果你问我一些
单片机的知识,我会很诚实的告诉你,我不懂。确实,很多东西没有玩过,但是我觉得掌握了对核心的思想,慢慢学其它东西是不难的。
两本书值得推荐的 《uCOS/II 中文版》,《smallRTOS 实时操作系统》 ,前者太出名了,一个很好的开源抢占式操作系统内核,C语言的,很值得一看,后者是北航出版,周立功公司的吧,反正内容很多雷同,纯粹巧合吧?--b ,不过好处是基于C51写的,比较实际一点。
啃这些东西不是三两天就可以搞定的,慢慢来吧,每天看多两遍“不要做浮躁的嵌入式工程师”,先要保证自己不要浮躁,能安心的学习,这个才是最重要的。
我现在就是学习那种操作系统的思想来写的,非抢占式,因为对于家电的
单片机系统,没有哪个任务的优先级那么高必须去抢,况且我用的
单片机没有指针(因为C编译器烂的不行,还是用汇编爽),没有堆栈指令(这个最要命了),RAM比较少,48字节(没有看错,是字节),俺将系统的用RAM控制在30多个字节,已经郁闷的想死了,还有就是用汇编,传闻中最恶心的编程语言,感觉纯粹就是一个郁闷的混合体。
不过算是熬过去了。前两天,最核心的任务调度和时间调度已经完成了,任务执行不能打断,必须按照自己放弃CPU的使用权,8个任务,分优先级的,按照优先级运作,这个是比之前的时间片优秀,而且实用的。最精萃的是那个时间的处理,任务调用延时程序,然后退出就绪队列,然后CPU不对任务执行,直到延时时间到了,重新加入任务队列继续执行。这个东西是我最初衷的想实现的功能,算是达到了。这样做编程变得很方便,一个字爽。昨天牛刀小试,用这个系统来跑3个任务,分别对3个LED闪烁,不同时,不同步,不同闪烁速度,不同占空比。这个东西以前的话足够让你郁闷一段时间了,但是用系统之后,简简单单的20来行程序就完工了,系统终于跑起来的时候真的有种莫名的兴奋,1年工作以来最有成就感的一次了。现在正在移植程序,以前的扫描LED和红外解码都移植过来用了,很爽。所以我还是衷心的建议,
单片机玩到一定阶段的朋友,尝试一下自己弄个操作系统吧,保证是最好玩的。
废话一堆,总之算是俺一年工作以来参透的东西,感悟的东西。信不信就由你了,hoho
Etual
2007-6-1
(本文引自www.mcujl.com/article.asp?conID=451)