我用的华大的m4 spi带一颗 ti的tcan4550 由于默认频率分频到最后 spi只有12.5M 达不到tcan4550的推荐18M ,再加上can的中断实在是太频繁了,理论上可以一毫秒中断5次。导致我通信实在太繁忙,经常跟不上节奏漏掉数据。
我现在转成利用tcan4550的fifo一次性把现存数据读回来,驱动方案是这样的:
这个方案目前有两个点缺点
我是关中断timeout tick加时间 然后再开中断 这个过程有点 感觉不怎么规范 有没有问题
找了下定时器控制的接口,发现有一个rt_timer_control:
这个接口可以修改定时器的超时时间,在源码找了一个使用例程:
要求这么高,还是不要用系统了。频繁任务调度切换任务反而降低系统效率。
用中断驱动比用任务驱动实时性更高。
说起来延长定时器的操作,这个可以自己改源码实现,修改 control 函数的实现,增加一种 control 命令字,
以下面 SET 命令为例,它修改的 init_tick 成员。完全可以根据自己的需求添加一个修改 timer->timeout_tick
成员的命令。
数据正常的 iso15765协议最高还支持 4g数据 分成can帧 一帧一帧发 我容量设计为4096 平时数据1k 2k 也是有的
中断次数多 这个还好说 tcan4550外部中断时我只发送信号量 有专门的很高优先级线程接受信号量处理 任务切换不频繁
其实我spi处理即使像现在用着dma 速度还是慢了 一毫秒只来得及清3次tcan内部的中断三次 可以看我上面的截图
用fifo主要的目的是减少spi通信 到了水位再一次性读取
你是做车载控制系统的吧,如果这样要求就比较高了。不知道你现在MCU支持的主频是多少,因为开FIFO太大,你读数据处理也需要时间。需要计算下你的FIFO单位秒时间接收的数据量和读出数据量之间的关系,否则你的FIFO会爆掉的。
你有没有考虑SPI也用中断来处理,SPI实际就是一个移位串口~~如果这样你可以在tcan4550外部中断触发SPI中断读取数据放入缓冲,这样可以不消耗MCU资源
做的obd 主频200m 目前看来我使用单条信息读取fifo有概率被撑爆 等水位中断批量读取肯定不会被撑爆 毕竟spi 12.5M 比canfd最高速度8M高挺多的
spi我是用的rtt的驱动 dma也做好的 示波器看过了 还可以 找不到优化空间
优化了一下 好了挺多 如果在一个tick内连续好多次新信息中断 我直接定时器开3ms后再读取 然后把新信息中断屏蔽了 3ms后读取完再开 中间如果水位中断就延长定时器时间 并批量读回数据
这样既保证了短信息的实时性 也减少了中断 实测长信息中断变成了2ms左右一次 比之前1毫秒4 5次 好多了
tick开多少是个技术活,一般实时性不是很强的前提下,我们都开10ms,然后根据需要逐次减少,有时候并不是时间越小执行越快的。那这个问题涉及到RTOS系统的内在真正难题了~~~~