搞了好久,其实这次正式搞,似乎也没有多久,开了一下正式开始弄的时间,大概是7月6号,这样算来,大概是1个月出头的时间。
这一个多月是连续弄这个canopen移植的。
为什么要连续作战?最近看到的文章中不少都提到学习某项技能时,要连续突击。就类似于突击考试一样,很有效果。当然考试有可能是囫囵吞枣,而长时间的时间投入对某项技术的学习确实大有裨益。当然如果有是一段时间一点突破没有,郁闷的很,怎么办?好好休息一两天,干点别的,也是很不错的注意。
------------------------------------------
对于这个代码,我手里的比较久远的代码版本,例子demo是运行在ARM7上,还是用的CARM编译器,目标是要移植到STM32上,是ARMCC编译器,ide是MDK。
编译器的不同对canopen代码而言主要是和处理器相关的代码有点诧异。比如启动代码,比如中断的关键字,CARM编译器用的是__IRQ关键字,而ARMcc编译器就没有这个关键字。
-----------------------------------------
在今天以前,我是担心协议栈部分的代码对于carm能运行很好,但是无法运行在armcc上。但是最终证明这种担心的多余的。这也说明这个代码的可移植性还是不错的。
但是有一点关于
unsigned long int a;
unsig long int b;
if ((a - b) > 100) {
//Do something!!
}
这个代码在51的keil上,在ARM7的carm上都可以运行的很好。但是在MDK的ARMCC上无法运行的很好(必须强制才行,这个以前试过)。但是手里的代码没有强制。这个是我
if (((unsigned long int)(a - b)) >(unsigned long int) 100) {
//Do something!!
}
唯一修改协议栈部分的地方,有好几处。-------------------------------------------------------
我很清楚我尽管非常注意C的规范性,研读过misra,但是我的C语言的功力也不是十分扎实。
------------------------------------------------------
进行这种代码移植,第一步要做的就是建立信心。这个太重要了。
(第一步)就是阅读systec提供的移植porting 要点hint。
讲的就是蜻蜓点水。说选什么驱动,在哪里选波特率,开端之类的,还有根据编译器选关键字之类的CONST IDATA ,就是为了省点内存。里面根本没有ARMCC编译器这个选项。STM32是最近几年才有的芯片,就更没有驱动了。只能自己根据st的官方库自己写了。
(第二步)把CARM编译器的demo删减,把串口,LED之类的全部删掉,就留下干干净净的协议栈的canopen驱动,还有个定时器。从站对这个定时准确性还真是有要求,如果在while(1)下面弄个软件delay还真是不行。
(第三步)打算在armcc编译器下用ARM7的can驱动,结果搞了很久,不加上canopen驱动,代码都跑不起来。ARM7官方的例子好像有ram映射方面的代码,令人很烦躁。ARM7的官方can驱动写的真叫一个差劲。于是果断放弃第三步。直接第四步。
(第四步)写了个ST的demo,有定时器和can1驱动。然后把canopen代码加进来。然后让编译通过,只是很多warning。不管他,很多都是有些代码没有调用的原因。
然后搞清楚canopen协议栈中的canopen协议栈无关的代码都有啥?只有一个时间戳返回函数,一个can中断函数,还有一个是canopen驱动的c文件,还有内存复制函数,内存比较函数。就这些。
(第五步)回到ARM7的carm编译器下,尽量can驱动的c文件。按照自己的理解重新组织一下。然后让其简单化。能让canopen跑起来就行,越简单越好。如把发送邮箱只是设置成一个,接收邮箱也设置成一个。把缓冲区弄成一个。把can发送不放到中断里面,放到while(1)下面。原先代码放到中断里面运行发送can帧是明智的么?不清楚。
第5步是非常繁琐了,也加深了对驱动的理解。但是还是没有彻底搞透。这中间还有个插曲,我不断缩减,用主站一直都能启动从站。但是用分析仪发送自启动代码,却无法让从站启动。于是只能退回去,重新精简canopen驱动。
(第六步)把代码弄到ARMCC下面,把精简后的canopen的原先的arm7驱动用ST的驱动代替。包括接收,发送,波特率,初始化,中断。还有定时器。当然不能鼻子眼一起抓。首先是can初始化要成功,能进入can中断,能正确接收到can帧。刚开始怎么弄都无法搞定!继续删减原先的接收驱动,竟然好用了。这个有点莫名其妙。并且原先的不好用的代码没有保存,我也着急想尽快搞定。于是就没有深究原因。有点小遗憾。然后接收ok。然后弄发送。无非就是DLC data,帧类型 远程帧 数据帧之类的。很快搞定。
然后用分析仪发送启动帧,很惊喜,竟然能发送成功一组。
然后用中断定时提供给canopen时间戳,兴奋异常,竟然能正常发送了。
然后和主站通了一下,竟然主站显示从站在线了。
信心,就这样被建立起来了。。。。。。。。。。。。。。。
剩下的工作,就是进一步理解代码,让其更稳定。更快速。从应用来讲,也要更易用。基本上就是时间问题了。。。。
不过这个时间可能不会太短。。。。
以前弄那个canfestival,就知道里面有两个状态机。想彻底高透源码太累,也没有必要,于是就放弃canfestival的阅读。会剪裁,知道整体架构,已经很好了。可以把时间放在研究别的上,比如bootloadr。。。。。。