本帖最后由 tianshuihu 于 2014-8-13 00:11 编辑
从接触单片机以来先后使用了Keil、IAR、CodeWarrior、CCS、Atmel studio...各种开发环境,各有优缺点
经过时间的洗礼,总的来说对Keil和IAR的印象最好!
Keil是最先接触到的编译器,界面十分美观、友好,软件仿真也很方便,但是不支持硬件仿真(传统51单片机),
另外51的内存太小,外设不够丰富,处理速度尤其是乘法运算的速度不够快,所以入门之后用的就比较少了
再说MSP430和IAR,第一次接触的430是149,没想到单片机居然可以做这么小,而且自带ADC、PWM、多路可中断IO等很实用的外设,并且其时钟源应用非常灵活,自带硬件乘法器....只需一次就深深的爱上她了
更让我惊喜的是其开发环境IAR居然把编译、链接、下载(或仿真)集合成一体,对于软件调试十分方便!并且其下载工具也十分丰富,并口或USB的JTAG下载器、BSL下载器等等
再后来TI推出了G2系列的LaunchPad,这块板子自带下载器,同时十分小巧,和IAR配合可以快速开发一下小的应用,从此这款LaunchPad几乎成了我实验桌里面必不可少的一块开发板!
下面说两个基于IAR开发LaunchPad的经验或者故事吧
1.利用软件仿真优化算法
单片机不像电脑有着强大的运算能力,所以应尽量优化算法,减少其运算量
TI 的官方参考例程利 "msp430x20x2_adc10_temp.c"中有用片内AD的第10通道采样热敏元件获得温度,有如下一段程序
long temp;
long IntDegC;
....
// oC = ((A10/1024)*1500mV)-986mV)*1/3.55mV = A10*423/1024 - 278
temp = ADC10MEM;
IntDegC = ((temp - 673) * 423) / 1024;
前面是两个变量的声明,后面是将AD量化的信号ADC10MEM装换成温度值IntDegC
其实long型的声明完全没必要,int已经够用(10位的AD),这里先不做探讨(或许设计者是为了保险起见,而我没发现其妙处)
下面说说
优化
IntDegC = ((temp - 673) * 423) / 1024;
这条语句等效如下
等效一:
IntDegC= temp*0.4131-278.0068;
等效二:
temp = (temp - 673);
IntDegC= temp*0.4131;
修改完成之后,在Debug模式中选择 “Simulator”,可以模拟一下看看哪种方式更快、更准
编译之后,点击下载即可开始仿真,F11为单步执行,F10为执行当前行
图中标示的框3中“CCSTEP”可以看做是机器周期,每执行一步其值都会更新,并显示为红色
我分别试了3个初值,最终的运算结果3者相同,但是消耗的“
CCSTEP”却不同,结果如下
ADC10MEM | 原始语句(CCSTEP) | 等效一(CCSTEP) | 等效二 |
678 | 570 | 728 | 576 |
700 | 604 | 708 | 556 |
789 | 632 | 688 | 541 |
从上表可以看出,整体来说等效二的处理方法更高效一点
当然,这里只是一个小小的改进,起到抛砖引玉的作用,期待大家能发现更多
PS.
其实如果把long型的声明改为int的话,结果也是对的,并且原始语句仅需要200个CCSTEP即可获得正确的结果,而后面的两种等效消耗时间变化不大
这是因为long型(4字节)的乘法明显比int型(2字节)运算量大很多;而后面两种等效用到了浮点数的乘法,可比性不大
另外,一般来说比较精确的
温度需要保留一位小数,这时等效一和等效二的优势就比较明显了,大家有兴趣可以对比一下,我就不再罗列了
2. 软件仿真获取精确的延时
经过上面的仿真就会发现同一个等式,初值不同时,运算消耗的时间是不一样的
但是有时候又想获得准确的延时,这时候软件仿真就可以派上用场了;
你只需把断点设到延时函数所在行,然后F10一下,即可得出该函数消耗的
CCSTEP
另外,需注意这个CCSTEP的时间为一个机器周期,即主时钟的一个周期,需要换算之后才能获得实际的延时
3. 软件仿真与硬件仿真
软仿真的好处是不依赖于硬件,当遇到问题时可以帮你判断是不是软件方面的问题,如果不是再从硬件方面着手去解决,免得面对问题无从下手
但是有时候,系统需要配合外设才能工作,那只能硬件仿真了,这时候断电的设置就很有用了......
最后再补充一下,软件仿真通过了,并不意味这硬件就能很好的工作!
比如有一天我发了几乎一个上午的时间去调试一个通讯的程序,发现有个指示灯总是莫名的闪烁,但是软件仿真看不出任何问题
最后翻出了原始的程序才发现我把第一行,关闭看门狗的程序弄丢了。。。
哎,瞬间有种可笑不得的感觉
学习使用430好久了,今天小小的总结一下,思绪不够清晰,大家见谅!