Thread (7 messages) 7 messages, 4 authors, 2016-02-07

Re: [Rfi] Cyclone V CAN errors when application pinned to CPU1

From: Tom Evans <hidden>
Date: 2016-02-07 22:19:43

On 07/02/16 10:56, Vlastimil Setka wrote:
6.2.2016 23:34 Tom Evans:
quoted
On 7/02/2016 4:59 AM, Vlastimil Setka wrote:
quoted
quoted
quoted
We have a linux application which sends data
periodically (1 to 20 ms period) out over the
can0 socketcan interface. Sometimes the first
data byte in the CAN frame is zero on the wire,
but non-zero in the data sent!
The TX functions is usually pretty straight forward. Copy all data bytes into the hardware, write ID and DLC, then hit the send bit (or whatever triggers the hardware to send the frame). Maybe there's some barrier missing in this sequence?
I'd suggest you "objdump -S" the CAN driver object file and check to see the optimizer hasn't re-ordered the above sequence too much.
...
quoted
quoted
It can be reproducibly triggered by a high network load on
ethernet generated by iperf for example.
Which generates a lot of interrupts. Which are probably
 >> interrupting the above transmit sequence and delaying its
 >> completion. During which time something else can get in.
...
quoted
I'd suggest you add a "reentry counter" to the driver
An easier way to investigate this (initially, you'll need things like reentry 
counters later) is to add "spin_lock_irqsave()" and "spin_unlock_irqrestore()"
pairs around sections of the CAN driver code you want to "protect". Have a 
look at the other CAN drivers that do this and some of the large number of 
Ethernet drivers for examples of how to declare the variables and call the 
functions.

I'm not recommending the above as a fix, just as a tool for narrowing down the 
cause of your problem.

If this is bad advice (the wrong functions etc) I ask others on the list that 
know better to correct me.

Tom
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help