这段时间终于把短距离通信的无线接收模块弄完了。本来一两周时间就可以弄完,但前两周由于尝试采用eclipse开发环境,遇到了很多问题,尤其是6410中断的实现。这导致后期赶工,花了几个通宵才算搞定,弄得自己一身疲惫。
回过头想想,这个项目在很多方面都值得总结和吸取教训。避免以后接项目时类似情况再次发生。后续文章再介绍三星6410的裸机程序开发环境和方法。
开发环境
对于三星6410的裸机程序开发环境,想当然的使用eclipse。如果作为研究和探索,这未尝不可,实际上也是可行的。但问题是,这次是开发项目,是有时间限制的。所以应该选择最正确的开发环境—RVDS。
在eclipse上遇到的一个最大问题是修饰中断处理函数的关键字__irq的实现。
* 在C语言中,关键字”__irq”的作用:当ISR定义时有此关键字,则ISR结束后CPU自动从栈中恢复中断前
* 模式的LR,并把它赋值给PC,完成ISR的正常返回。如果无此关键字,则CPU只能返回到二级ISR前的中
* 断状态,此时仍为IRQ工作模式。当然也能够继续执行用户程序,只是工作模式不对,此模式下再不能响
* 应其它IRQ中断。
__irq在eclipse中没有定义,所以必须参考ADS1.2或RVDS中的定义(输出的汇编指令)进行实现。这遇到了不少麻烦,至今,__irq在eclipse中还是没有完全实现。
信息收集
在开始项目前,未对6410的裸机程序开发进行比较深入的了解。以为友善之臂提供了裸机程序例程,可在此基础上进行开发。过份的依赖友善之臂例程,导致没有去了解其它家的裸机例程。
其实,最好的6410裸机程序例程是三星提供的6410_Test工程。该工程提供了全部模块的功能实现和API接口。在此基础上进行开发,可以大大减少工作量。遗憾的是,我是在调试6410 SPI驱动时,才发现6410_Test工程。
友善之臂提供的6410裸机程序例程,个人认为不是很好,而且有一些例程是有问题的,如UART例程。提供的中断例程还是基于51那种跳转方式,而不是VIC模式。
此外,友善之臂开发板光盘上的资料,像原理图,十分混乱,各个版本放在一起,都不知道买来的开发板应该使用哪一个版本的原理图。
无线模块
在此之前,未接触过短距离无线通信模块。客户要求使用433MHz短距离无线通信模块CC1101,并给我们指定了一家淘宝卖家。稍微看了下这无线模块说明,通信距离可以达到客户要求的至少200米。所以没有调查就买下了一对模块。
实际测试时,却只能传输20多米。再次询问那位淘宝卖家,他说他们的实测距离是50多米,把传输速率降到最低1200bps且在空旷地带可以达到100多米。如果要达到200米,CC1101必须加PA。
我勒个去,感觉被骗了,但也只能怪我们自己不小心,没有仔细盘问,没有仔细调研。
后面放弃了CC1101,改为nRF2401,并买了加有PA+LNA的nRF2401无线通信模块,确保通信距离,满足客户要求。至于CC1101不加PA到底能传输多远,则不去细究了。
这里范的一个错误是,客户帮我们指定了无线通信模块,但自己却没有去深入了解,自以为客户指定的应该可以满足要求的通信距离。
基本工具
这次开发,涉及驱动的调试。可是,我们连基本的工具像烙铁、万用表都没有准备。所以在调试驱动时,效率很低。正所谓,工欲善其事必先利其器。
兼职困惑
兼职开发项目,一个很大的障碍是:不方便项目开发人员的及时沟通和交流,也不方便配合调试。这个问题,目前暂时无法改变,只能不断强化彼此的合作,探寻最佳的合作方式。
改进措施
以上谈论的总总问题,归根结底为:开发项目没有计划、规划和统筹,各自为战。具体到自己身上,项目前期心态未摆正,过于乐观!改进措施如下:
接项目之前,分析客户需求,调研项目可行性。
制定项目计划,选定项目管理人员,进行统筹规划。
做项目时,必须从确保完成项目这个目标出发,选定正确的工具、开发环境、硬件平台等,切勿以学习的心态开展项目。