现在手头有一个项目,需要驱动一些电机。电机驱动模块外购,支持CanOpen协议(DS301 + DS402)。之前在论坛上搜了一下,发现只有一篇提到。
因为没什么基础,先了解Can总线,再读DS301的DataSheet,又在网上找到了开源的CanOpen协议栈源代码CanFestival学习了一下。
CanFestival算是开源的比较完善的DS301协议栈实现(主站,从站均可以支持),支持Linux,Windows平台,也支持单片机平台,同时也有一些例程提供。了解之后,决定在项目中采用该协议栈。
之前在一个研究性的项目中使用过RT-Thread,手头也有网络收音机的板子(刚好有CAN口)和STM32的评估板(CAN通信至少要两个节点),就尝试CanFestival + STM32 + RT-Thread
的结合,
1.先将CanFestival移植到STM32。由于有其他单片机平台的移植例程,移植过程不是很复杂。主要是在具体的硬件平台上实现几个函数:
void setTimer(TIMEVAL value);
TIMEVAL getElapsedTime(void);
2.加入RT-Thread。其实如果只是完成简单的CanOpen通信,不一定要上OS,在加入RT-Thread之前,用中断 + 主程序的前后台方式也实现了一个测试例程。不过因为项目比较大,后续还有其他的控制要求,也包括人机界面,还是决定加入RT-Thread。
CanFestival在OS上的移植还是比较简单的,也有Windows上的例程提供。和OS有关的,主要包括创建定时器和CanOpen数据包处理两个线程,同时利用了OS提供的互斥量,完成线程间的协调。
3.在RT-Thread + STM32上实现一个Canfestival提供的例程,TestMasterSlave。如果该例程能顺利跑起来的话,说明Canfestival的移植完成,同时对CanFestival的使用和DS301协议也有进一步的了解(例程的测试只是第一步,后续需要利用CanFestival的API接口实现控制功能)。
先将相关代码发上来:
将CanFestival.rar解压到RT-Thread的Components目录下。
将project.rar解压到RT-Thread的bsp/stm32f10x
目录下。
用MDK打开。工程中包含两个工程,一个主站,一个从站。分别编译,写入两块开发板(我这边是STM32评估板做Master, 网络收音机板做Slave。主从的区别主要在与CanFestival相关的
不好意思,有点长。待续…
Canfestival的主页
http://www.canfestival.org/
国内关于Can和CanOpen能找到的比较好的网站
http://www.dndev.com/cgi-bin/forum/forums.cgi?forum=2
由于本人还是菜鸟一枚,关于提交的例程,还有几点与RT-Thread或者说与OS的使用相关的基础知识,即是说明,也是问题,还请各位方家指教。
1)CanFestival中有两个与移植相关的关键函数,canDispatch()和TimeDispatch()。这两个操作是互斥的,在一般的OS,例如Windows上是利用Mutex实现的;单片机平台上是利用关中断或者直接利用不能嵌套的同级中断实现。TimeDispatch()对时间的要求相对比较严格,执行的时间也不太长,我直接放在中断中调用;而canDispatch()在线程中调用,相关代码:
通过关中断实现与TimeDispatch()的互斥。
也可以创建一个单独的定时器线程,等待在信号量上;在定时中断中发送信号量;然后在调用canDispatch()和TimeDispatch()之前加入rt_mutex_take();
2)下面是我不太有把握的地方,请高手不吝赐教
CAN数据包的接收在中断中进行:
接收到的数据包放在一个循环队列中,然后发送信号量到can_recv_thread()线程。这应该算典型的生产者和消费者问题。我看了RT-Thread编程指南的相关章节,对这个问题也有不同的解决方法,既要用到信号量,也有对临界资源的加锁操作。我这里只有一个生产者,一个消费者。生产者负责写入,修改尾指针;消费者读取,修改头指针。在上面的程序中,recv_sem相当于空闲单元的资源计数器,如果头尾指针的读取和写入都是原子操作,那么操作该队列的时候是否可以不加锁?
非常好,非常好,大力支持
不知道lz后续时间如何,如果有可能希望能够把这块维护起来。另外关于CanOpen的实现,我得先看看它的许可证协议。
项目本身是工作的一部分,时间没有问题,只是能力比较有限。
此次提交的代码只是个开始,主要是测试CanFestival协议栈的移植,后续要以此为基础进行下一步的开发。对我而言,不管是RT-Thread,还是CanFestival,还有很多需要深入的地方。我会尽力而为,有新的进展我也会汇报上来。
也希望对Can和CanOpen有兴趣或比较了解的同学多提宝贵意见。
建议加个maillist吧,这样有什么问题也可以在邮件列表中沟通。
CAN是工业总线中极为常用的一种,我也希望RT-Thread在其中能够做好。
好。
申请加入不成功,邮件总是被退回来。
rt-thread-cnusers+subscribe@googlegroups.com没错吧?
web方式的你能够访问吗?
http://groups.google.com/group/rt-thread-cnusers
如果能够访问,那么可以在上面提交加入。