《二》canfestival的软件定时器分析
canfestival中的时间是靠一个硬件定时器完成的.
这个硬件定时器还需要配置成中断模式,
在中断里面加入canfestival编写好的接口函数:TimeDispatch();.
这个函数是用来轮询检测各个软件定时器有没有被触发.
触发之后完成所对应的不同动作(通过回调函数)
比如完成pdo,sdo,同步帧等的发送.
所以,时间对于canfestival很重要,因为发送pdo,sdo或同步帧等,每个事件和动作,都需要软件定时器驱动.

所以需要配置一个硬件定时器.
计算出硬件定时器每次增加1消耗多长时间.
canfestival中的最小时间单元就是硬件定时器计数加1的耗时.
canfestival中的时间也都是按照计数的个数去计算的.
在canfestival中,会有ms和us,这两个时间需要进行系数的设置.比如定时器1us计数一次.
那么us的系数就是1;ms的系数就是1000;如下图,需要根据你的硬件定时器去配置两个系数:
(在timerscfg.h文档中)
其实就是宏定义,对计数进行转换,最终时间走的还是硬件定时器的计数.
这时,canfestival就有了us和ms基准,它的时间准不准,主要看配的系数好不好.

硬件定时器的周期会被canfestival进行改变.
比如下面的B事件.
下面,原有定时器周期1000,
TIMEVAL_MAX也是1000.(在timerscfg.h文档中)
B事件时间的周期是3500.
那么canfestival会把硬件定时器修改为下图中的第二个图形.
如果调小TIMEVAL_MAX的值,那么canfestival会把硬件定时的周期进行调小修改.变成下图中第三个图形.

那么一个硬件定时器如何产生多个软件定时器.

canfestival会更加快速的改变硬件定时器的触发周期,从而保证A和B的溢出事件都不会错过.
具体代码查看:
TimeDispatch();

TimeDispatch();
这个函数是canfestival的最外层接口函数.
需要把它放入到硬件定时器中断里面,进行调用.
它的作用是轮询检测多个软件定时器,查看有无软件定时器需要触发.
如果触发就执行响应的回调函数.
它的具体执行流程为:
执行流程:
软件定时器触发之后,会执行row->callback.
这里就是回调函数.
在这里会发送pdo或sdo等
一切活动都是在中断里面完成的,主函数切换到总线开启,进入空循环就行.

进入TimeDispatch();你会发现还有两个函数需要进行编写.
需要按照自己的开发环境去配置.
下面是以stm32单片机为例.