我的单片机应用系统设计职业之路
我于2004年考进一所大专院校,学习电气工程及其自动化专业。2005年第二学期,我们这个专业开设了单片机课程。从那以后,我便有了单片机这个概念。虽然学习了一个学期,但对单片机还是云里雾里,只知道单片机就是一个完全集成在一个芯片上的微型计算机,也只知道单片机要用汇编语言编程。虽然在学校里做了一些实验,但像我们这些理解能力迟钝的学生,在这种应付的学习环境下,根本就不会去了解实验的原理,实验的目的,跟着其它优秀的同学把实验报告写出来就完事了。
但我们那个单片机老师对学生还是很负责的。尽管他在课堂教学上,不是那么严厉,但他对我们毕业后的就业还是很关心。我清楚地记得他说过这样一句话:我们这个专业的学生,不要毕业后,只会做接个灯泡这么简单的工作,我们要做些有水平的工作,比如单片机开发,plc开发。可以说,这句话,深深的印在了我的脑海里。是呀,虽然我是大专生,但我也是有梦想的。虽然小时候,梦想自己可以考上清华、北大,可以成为科学家,但现在是绝对不可能的了,但我也要往高处走,尽自己最大所能,把技术学好,做好。所以,我报名参加了这位老师办的单片机培训课。
这个培训课没有我想像的收获有多大。可以说,在这个培训课上,我只知道了几个单片机开发的软硬件工具,keil、开发板、仿真芯片、protel99se绘图软件,会看着原理图搭接电路了。但对单片机程序设计,还是一点想法没有。因为,这位老师,也是用汇编语言给我们讲解单片机开发。很快毕业了。我就陷入了找工作的茫茫人海中。
第一份工作是跟着一位包工头做电工,第二份工作是在一个电气设备公司做烟台癫痫治疗最权威医院电气装配工。第三份工作是给一个BOSS仿一个大型机械公司做的平衡仪控制板。前两份工作,可以说和单片机开发一点关系都没有。第三份工作我还是有所收获的,因为,它正合我意。我当时是这样想的,单片机系统开发实际上属于电子技术范畴的,所以,我必须打好电子技术基础,但我在学校里学的是强电,电子技术只学了一些皮毛。所以,前两份工作,必然做不长。但徐州电子技术企业太少了,虽然有一些比较好点的公司,人家一看你这学历、你这水平,根本就不给你面试的机会。这第三份工作,我还是有所收获的,我自学会了电子线路绘图软件。但两个多月的时间过去了,我也没弄出啥结果来,自己也感觉不好意思待了,所以,就主动离职了。没工作的心情不好受呀,心里着急呀,但我还是有明确思路的,就是找电子方面的工作。于是,第五份工作,名义上是电子技术员,实际上是电子装配工,而且,我一干竟然是一年半。在这里,我真的接触到了实际电路。无论是模拟的,还是数字的,还是基于单片机的。虽然,我只是一个电子产品装配工。但我不同于其它人,每个产品的电路原理,我都会仔细的思考。所以,在这里,我知道了,开关电源、高频电子镇流器、还有一些实用的电子元器件。后来,我发现在这里,真得没啥前途,在这里,只会离我单片机开发的梦想越来越远,所以,我又选 择了离职。
那是2009年刚过完春节。我想,这次找工作,我一定要找到对口的,我一定要实现单片机开发这个职业。找工作真的很难。但我想,之所以难,是我心里没底,没有底气。如果我想求得一单片机开发的岗位,但我一点开发经验也没有。我就算是在做好准备、在自圆其说,在热爱这个技术,我一点实战经验没有呀。
所以,我还是选择了一家很小的公司。但这家公司用到的单片机与我平时自学的不一样,我平时看了许多51单片机方面的书,甚至通过同学的介绍也了解目前单片机的开发已普遍采用C语言了,但这家公司用的单片机是非常的小,有的只有8个管脚 ,而且只支持汇编语言。还有一种情况是,另外一个工程师特别封闭自己的技术,我只是个画板子工,根本就没功夫去碰软件上的东西。 画了大概两个多月的板子,原来的工程师因为和老板有矛盾,辞职了。公司就剩我一个技术人员,但老板对推出新产品特别急切,在加上我当时对汇编语言编程没啥思路,所以,我还是继续做我的画板子工。仿别人的机器时,芯片都是找人破解的。后来,因为种种原因,我离开了那家公司。在那边所收获到的就是会用protel99se绘制单层PCB,如此而已。
又一次陷入了找工作的状态中。这次找工作花的时间比较长。在没工作这段时间,我拿起了买了将近一年多时间的谭浩强老师写的C语言程序设计一书。大学的时候,没学过C语言,觉得C语言多难多难。但翻了翻,看了看视频,感觉也不是太难,就是由函数构成的。然后,所有的函数有一个公共入口main函数,还有各种各样的基础数据类型,构造数据类型等。而且,用于单片机开发的C语言-C51更是挺简单的,一些较复杂的数据结构在单片机程序设计中用得很少。还有更重要的是,我终于拿起了,买了许久的51单片机开发板。跑了一些程序,自己也做了一些简单的实验。我觉得对基于C语言的单片机系统开发入门了。但应付实际工作,可能还会存在一些问题。所以,我迫切希望自己能找到单片机开发的职位,哪怕工资不是很高。因为那一年,我结婚了,即将面临着来自生活上的压力。所以,在找对口的工作和工资高的工作之间,我一直在犹豫。并且心理也清楚自己的技术实力。但单片机开发依然是我追求的目标,我绝对不会放弃的。
在这种情况下,我对工作也不在挑三拣四了,最重要的是工资高,我要养家活口呀。但我一直没放弃对单片机开发的自学,虽然,我心理明白,搞单片机开发是一个实践性很强的工作,但没有深厚的理论也是不行的,只有真正理解了,见识的多了,才会提高能力,所以,闲暇时,我一直在读单片机开发方面的书。甚至,用自己低微的收入买了一块ARM开发板,那时,我了解到,很多人都在搞ARM,所以,我也买了一块开发板,想自学,不过现在,也把它束之高阁了。可能是由于压力大吧,也可能是我和她的学历上的差异等,我和原来的那位分了。这又一次,让我陷入了人生的低谷。我开始在外面租房子住,因为一个人,所以,我更有时间看书学习。
有时候,我把单片机开发板拿出来,在电脑旁做一些实验,大部分时候,我是在看书。因为没有了家庭的束缚,我对找工作更加自由。一定要找一个对口的工作,能学到东西的工作。所以,我又开始了离职,找工作,再离职,再找工作的循环中。因为年龄比较大了吧,看同龄人毕业那么多年后,收入都在增加,而我还在学技术,还在为找对口的工作而发愁。所以,在工资、对口、学习三方面,我不得不做一些平衡。最终,我还是选择了工资不能太低的工作。
我虽然自学了很多科目,看了许多单片机开发方面的书。但真正对我有帮助的,还是我现在的这份工作,或许是多年的理论知识消化吧。尽管在找到这份之前,我没有完整的开发过一个单片机应用系统,但是,我对单片机不在感到神秘了。也许是单片机用的太广了,也许是一个很普及的技术了,也或许是我看得单片机书多了吧。来到这家公司,我确实收获了许多。尽管大多数时候我在抱怨公司这不好,那不好,但我心理清楚,在这里,我是很有收获的。学到了许多单片机程序设计思想。
如今C语言已经成为单片机程序设计公认的语言。我用C语言进行单片机程序设计也有两年多的时间了,C语言程序的特点使我对单片机开发更加感兴趣。让我从一个了解单片机的彷徨者到今天能用单片机开发一些产品,这期间我深有感触。
众所周知,单片机实际上就是一个典型的微型计算机系统。作为一款单片机,无论大小,都集成了计算机最基本的五大部件,运算器、控制器、存储器、输入输出。但单片机在用途上是与通用微处理器不同的。单片机是面向特殊用途的,常作为某一个设备的控制单元,所以单片机又常称为微控制器,英文缩写MCU。
最初的单片机开发语言是汇编语言,但汇编语言会随着单片机种类的不同而不同。程序设计起来难度较大。后来人们改用C语言作为单片机程序设计的通用语言。这种不依赖于机器硬件的语言,可以方便的在各类单片机系统中移植,极大的加快了单片机程序开发的时间。
我们知道,从总的方向来讲,指令是按顺序被执行的,除非遇到中断。但作为单片机软件系统,我们不能用指令流的思想去构建一个单片机软件系统。通常我们会借助PC软件系统的思想,对单片机软件系统在宏观上进行分层。
首先,我们要通过单片机系统的硬件资源,明确要对哪些硬件资源进行软件封装或者软件抽象,这一步我们称为硬件驱动程序设计。对应的软件层,我们称为驱动层。这一层的程序设计是纯粹面向硬件设计的。要求程序设计人员必须对器件时序、内部可编程寄存器相当熟悉,而且还要熟悉常用的芯片级总线,如I2C、SPI等。有时,我们也将外部总线(通信接口),如RS232协议、RS485协议、CAN总线等,也归到这一层。
其次,是监控程序层,或者,我们冠之以操作系统层。这一层陕西癫痫病重点医院最主要的任务是管理。主要管理应用程序与应用程序之间、驱动程序与应用程序之间的关系。从某种意义上讲,也是一种通信关系。这一层基本上决定了程序的框架。比如常用的治疗癫痫病微创手术状态机思想、消息存取思想等。
最后一层是应用层。这一层是体现系统功能的。应用程序通常也称为任务,是直接面向使用者的。与驱动层相比,这一层的程序设计是面向逻辑的,面向数据处理的。
不论一个单片机软件系统规模有多大,它都体现了这三层架构。这也是我们程序设计最基本的思路。按照这种思路,我相信,设计出来的软件更有条理,更有层次感 ,便于分工,同时也加快了程序开发的时间。
终于有机会从事基于单片机的电子产品开发这种工作。这是一家从事车载收放机生产的小型公司。公司规模不大,大概有四五十人。核心技术主要靠方案商的支持。具体来讲,方案商提供基本的开发包,并且提供技术支持。这对我来讲,是很有意义的。因为可以从方案商提供的软硬件开发包里面学到很多开发上的技巧。尽管公司效益不是太好,但对我这个没有实战经验,只会纸上谈兵的,所谓单片机技术人员,是非常有益处的。
刚一接触以前工程师留下的程序时,我真是有些晕头转向。唯一知道的是,程序的入口是main函数,不管这个项目里面有多少源文件。幸亏有在线调试器,只需和目标板连上几根线,就可以在线仿真所写的代码了。不过,刚一开始是盲目的,或者说,没有具体想好程序如何编制,就开始写代码,然后用仿真器实验运行结果。这种盲目的编码,往往带来巨大的返工。所以,后来我想到,得先在纸上画画程序的思路,尽管,我写不出完美的程序流程图或者什么NS流程图,但最起码,我要对所写的程序有个整体的把握。
后来我发现,其实方案商已经给出程序框架的说明了,是什么基于消息存取的。我立马意识到这应该是一种单片机程序设计思想。我上网也找了一些资料,也在仔细揣摩这种思想在我们这个产品开发中的具体应用。所以,我总结了一下,我接触到的这个产品软件上的特点。
首先分析下这个系统的构成。由按键、显示模块、U盘接口、SD卡接口、24C02、FM模块、静音电路以及功放和电源模块。按键采用ADKEY。即采集每个按键按下后,对应电阻上所分得的电压值,以此来区分是哪个键被接下。显示模块用得是段式LCD。这种显示器与LED不同。LED是单向供电,自发光。而这种段式LCD所显示的段本身不发光,需要背光源,并且段两端需要接交流电压,长时间通直流电压,会损坏液晶。其它的如U盘文件、SD卡文件读取,以及解码是方案商提供的。虽然最核心的东西没有学到,但对于按键驱动、LCD驱动、24C02驱动等还是长了见识。
1、很多函数是放在定时中断里面执行的。比如按键扫描、LCD扫描都是放在定时中断函数里面的。
2、采集到的按键值转换成“消息”存放到消息池里面,消息池有深度,存满后,自动从头开始存放。
3、每个功能模块(FM、MP3、RTC)都是相互独立的,都是采用相同的程序框架。
4、关于while(1)。必须在while(1)内部有跳出此死循环的条件。
5、函数是分段存储的。
这种表象的认识,对我在此源程序上女性癫痫的修改是有帮助的。以后,我会一一分析每一个模块的编程策略。