欢迎光临散文网 会员登陆 & 注册

《二》canfestival的软件定时器分析

2021-08-12 19:19 作者:GXTon_阿通  | 我要投稿

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单片机为例.


《二》canfestival的软件定时器分析的评论 (共 条)

分享到微博请遵守国家法律