canFestival移植(1)

前序

canFestival是实现了canopen协议,本文分析canFestival架构和移植原理。

canFestival各个文件夹功能

  1. 下载canFestival源码包。

canFestival的官网下载地址:https://canfestival.org/apps.html.en
这些老外的官网地址在国内去访问总是很慢,甚至不能打开,此时此刻我们最后另想其他办法,因为这些源码肯定有别人下载过,他们就会传到网上其他的地方,我在github上找了一个下载地址(https://github.com/ljessendk/CanFestival.git),用git下载妥妥的,很稳很顺利,如果你git也不好玩,那么可以百度其他地方的网址下载。

  1. 解压和各个文件夹的作用。

把源码解压可以看到:
canFestival移植(1)_第1张图片
(1)debian和doc文件夹分别是Linux相关、文档说明文件夹,感兴趣的话可以自行探索。
(2)drivers目录是各种MCU相关的底层硬件操作驱动,主要是定时器、CAN接口。
(3)examples目录里面是各种MCU使用的例子。
(4)include目录是与src对应的头文件。
(5)objdictgen目录是对象字典生成的工具,在examples目录里面的例子都要使用到的。
(6)src是canopen实现的核心代码,如下图所示,包含了各种报文实现的c文件、状态转换处理states.c文件,定时器使用timer.c文件。
canFestival移植(1)_第2张图片

canFestival运行机制

下图是官网给出的整体运行机制的框图,总共分为3层,canFestival移植(1)_第3张图片
(1)底层硬件相关实现接口。对应的是drivers目录下的各种文件,实现硬件定时器定时功能,各种MCU硬件的CAN接口收发数据。
(2)核心层。这个层对应的是src目录下的各种文件,这一层实现的是各种报文的生成、报文处理、报文管理,同时,还在硬定时器基础上实现软定时器timer.c的功能。
(3)应用层。用户的主从站点就在这一层,这一层调用核心层提供的各种接口进行对象字典操作等,并且在报文处理完成后还可以执行用户添加的回调函数;本层canfestival实现了data.h头文件,里面包含用户需要到的各种数据结构,CO_DATA结构体的使用就需要objdictgen目录下的对象字典工具生成对象字典;

怎么让canFestival工作起来

通过上面的分析能看出canFestival各个文件夹中代码的作用,从非常的宏观上对canFestival机制只能有大致的了解,如果想要移植还是要从应用开始,那么用户到底怎么使用呢?可以随意的从example下面找个例子看看一下,打开examples\AT91\Master\main.c文件,找到main()函数,看到内容非常简单:
canFestival移植(1)_第4张图片
从中可以看出,只是简单的调用两个两个函数就完事了,
(1)sys_init();timer_init(10);忘记这两个函数,只是让AT91能够正常跑起来做的系统初始化。
(2)canInit(CAN_BAUDRATE);函数,通过分析他的作用就是初始化最底层的can硬件接口,以及can中断初始化配置。
(3)initTimer();函数进行AT91硬件的定时器初始化,并且需要初始化定时器的中断。
(4)如下图,接着调用了三个函数,并且传入变量ObjDict_Data的地址,ObjDict_Data结构体中包含了对象字典(用工具生成)的信息,这三个函数功能就是对ObjDict_Data结构体进行初始化。
在这里插入图片描述
(5)接下来可以发现就是for(;;)死循环,这个死循环就是用户设计的报文处理(收发)功能。
canFestival移植(1)_第5张图片
分析得知这个应用的过程:
canFestival移植(1)_第6张图片

canFestival移植需要修改和添加修改的代码

通过AT91的example可知,让canFestival运行起来也是比较简单的事儿,那么新的MCU移植到底需要哪些工作呢?
(1)CAN硬件、硬件定时器初始化必定不可少。打开drivers\AT91文件夹,可以看到正好有两个c文件分别对应CAN硬件、硬件定时器。
在这里插入图片描述
问题来了,硬件初始化完成后,“核心层”怎么来使用这些硬件,换句话说,除了初始化函数,还应该提供哪些函数?
答:解决这个问题其实有两种思路,
a)直接打开着driver下的c文件看看里面提供了哪些函数,我们也对相应的MCU实现这几个函数即可。
b)核心层的timer.c对应使用硬件定时器,那么就打开timer.c文件分析里面的函数,看看怎么调用到硬件相关的函数;核心层的报文收发的c文件对应的是调用can硬件收发函数。

(2)ObjDict_Data结构体中的对象字典生成、状态初始化必定不可少。

(3)通过(1)(2)后,其实canFestival已经可以跑起来了,接下来的工作就是用户进行应用设计,比如什么时候发送管理报文,什么时候进行SDO报文的发送,收到SDO报文后怎么处理(报文解析canFestival完成),怎么修改自己的对象字典等等。

核心思想总结

移植的工作只有三方面:
(1)can、定时器硬件相关的操作代码,可以参考drivers\AT91下面的两个c文件。
(2)对象字典资源的生成。
(3)用户自己设计业务逻辑处理。

到此,你肯定还处在半信半疑中,要想更深入了解定时器和can硬件接口与“核心层”是怎么匹配的请看下一篇文章分析

你可能感兴趣的:(canopen协议)