单片机C语言编程的经验总结
单片机C语言编程的经验总结
[摘 要]总结单片机C语言编程的经验和教训。
[关键词]经验教训,单片机,函数,编程
中图分类号:TP273.4;TP18 文献标识码:A 文章编号:1009-914X(2017)14-0335-02
[Abstract]Summing up the experience and lessons of C programming language.
[Key words]experiences and lessons; Single-Chip Microcomputer/ Microcontroller ; function ; programming;
一、引言
单片机,也被称为“单片微型计算机”、“微控制器”和“嵌入式微控制器”[1],是指在一个集成芯片中,集成微处理器、定时/计数器、存储器、通信部件和基本的I/O接口,即在一个芯片上实现一台微型计算机的基本功能[2]。虽然它存储量小、接口简单、功能较低,但是控制能力强、可靠性高、低功耗、低电压、系统扩展容易[1],体积小、价格便宜可大大降低各类开发的成本。
最近几年特别是开始从事3D打印开发工作以来,逐渐接触了单片机,并开始做了一些单片机C语言编程的工作,到?F在已经5、6年了,感觉是总结一下的时候了。
二、经验
1.找到入口
开始学习时总是一头雾水,看示例程序也总感觉那么多文件不知从何开始,后来想起以前用任何语言编任何程序实际都有一个整个程序开始的入口位置,仔细观察果然发现单片机程序实际也都是从一个main函数开始进入的。就是在用户程序中没找到main函数的,也在所使用软件的核心程序中找到了(比如Arduino软件).
不仅如此,单片机的main函数的内容都很有规律,一般都是前面做初始化工作,然后就是一个循环一直运行。以Arduino软件为例,针对AVR系列单片机的核心main函数如图1:
其中init()是单片机核心部分的系统初始化函数,initVariant()是核心部分的变量初始化函数,setup()是用户的硬件和变量的初始化函数,loop()是用户运行的循环函数,其余USBDevice.attach()、serialEventRun()是对串口设备的连接、中断处理的通用函数。这样一来用户程序中基本就只需要编写setup和loop就可以了,无需编写main函数。
找到了入口,就一下子找到了头,可以对示例程序一步步研究下去,自己编程也知道从何开始了。
2.单独的设备测试程序
在新增加一些外部设备时,我感觉不要一开始就把它加到整个程序中去,那样经常会把自己弄混,出了错都不知道原因在哪。
最好先排除其他全部设备或尽量把无关的设备排除掉,单独做一个简单的专门针对这个设备的程序来测试,成功后再把它加入到整个工程中去。就是说要先基本确定这个设备单独的初始化、运行都是正常的,再把它混合到大系统中观察与其他设备的联合运行情况,至少可以先排除某些错误、确定某些问题,在实践中我感觉这样做很有用。
3.使用工具
在增加比如LCD、EPROM之类的外部设备时,开始调试期间总是这样那样的不顺利,特别是一些元件的协议不清楚的情况下。找供应商拿例程、上网查找资料当然是必要的,但我感觉这种时候示波器、逻辑分析仪之类也是很有用的,至少可以先看清楚信号是否发送,是否发送得准确,然后可以再检查其他部分,确定是哪部分的原因,是硬件接线出错还是对它的设置出错,给自己调试确定一个方向。
比如有一次增加一个I2C的LCD屏,写好程序后测试LCD屏却无法显示,开始一心以为是程序对屏的初始化设置有问题造成数据没有发送出去,不断修改参数却一直无效,后来想起用示波器,一看才发现信号都是正确发出的,赶紧去检查其他部分,很快发现是地址错误,一修改正确马上就显示正常了。
所以适当的时候使用工具是编程测试中很好的辅助。
三、教训
1.别忘了"喂狗"
由于单片机自身抗干扰能力不强,尤其在一些条件比较恶劣、电磁干扰较强的场合,常会出现单片机因受外界干扰而导致死机或程序跑飞的现象,造成系统不能正常工作,业界通常采用"看门狗"技术来防止单片机死机,将死机的系统重新复位并使其正常工作[3]。常用的"看门狗"技术分为软件"看门狗"和硬件"看门狗"。
这里要讨论的是软件"看门狗"的问题。所谓软件"看门狗"一般采用高级中断的方式执行,通过在中断程序中设置系统复位寄存器或对程序计数器赋予初始值的方式进行系统复位。同时在系统正常的主循环中适当插入"喂狗"指令来重置定时器值,说明系统是正常运行不需重新启动。这样当程序真正跑飞或进入死循环时,定时器因计时完成执行复位程序,