RTCan missing frames

Wolfgang Grandegger wg at grandegger.com
Tue Feb 12 18:53:45 CET 2019



Am 12.02.19 um 18:24 schrieb Johannes Holtz:
> Am 12.02.19 um 18:05 schrieb Wolfgang Grandegger:
>> Am 12.02.19 um 16:19 schrieb Johannes Holtz:
>>> Am 12.02.19 um 16:00 schrieb Wolfgang Grandegger:
>>>> Hello Johannes,
>>>>
>>>> Am 12.02.19 um 15:38 schrieb Johannes Holtz:
>>>>> Am 12.02.19 um 12:24 schrieb Wolfgang Grandegger:
>>>>>> Hello,
>>>>>>
>>>>>> Am 12.02.19 um 11:42 schrieb Johannes Holtz:
>>>>>>> Am 11.02.19 um 17:46 schrieb Wolfgang Grandegger:
>>>>>> ... snip ...
>>>>>>>> UI suggest to write a simple test program to demonstrate the
>>>>>>>> issue. It
>>>>>>>> should just open the socket and trying to receive messages... just
>>>>>>>> the
>>>>>>>> necessary stuff. First with a blocking recv() and then
>>>>>>>> non-blocking.
>>>>>>>>
>>>>>>>> What hardware and software are you using (arch, board, linux,
>>>>>>>> xenomai)?
>>>>>> ?
>>>>>>
>>>>>>>> Wolfgang.
>>>>>>> The source code is attached:
>>>>>>>
>>>>>>> compiled with -I/opt/xenomai/include -D_GNU_SOURCE -D_REENTRANT
>>>>>>> -D__XENO__ -lrtdm -L/opt/xenomai/lib -lxenomai -lpthread -lrt
>>>>>>> -lnative
>>>>>>>
>>>>>>> can frames sent by rtcansend
>>>>>>>
>>>>>>> Test 1: blocking:
>>>>>>>
>>>>>>> ID:0 DLC:2hex:  81 00       <-- NMT request
>>>>>>> ID:709 DLC:1hex:  00        <-- answer node #9
>>>>>>> ID:708 DLC:1hex:  00        <-- answer node #8
>>>>>>> ID:703 DLC:1hex:  00        <-- answer node #3
>>>>>>> ID:705 DLC:0hex:             <-- here it gets weird ! DLC == 0
>>>>>>> ID:70400 DLC:1hex:  01
>>>>>>> ID:70600 DLC:1hex:  01
>>>>>>> ID:70100 DLC:1hex:  01
>>>>>>> ID:70200 DLC:1hex:  01
>>>>>>> ID:1010000 DLC:1hex:  08
>>>>>> This means that you can receive messages from the CAN bus.
>>>>>>
>>>>>>> ID:53220 DLC:124 out of bounds. abort.
>>>>>> But that's wired.
>>>>>>
>>>>>>> Test 2: non blocking:
>>>>>>>
>>>>>>> ID:0 DLC:2hex:  81 00    <-- NMT request
>>>>>>> ID:709 DLC:1hex:  00     <-- answer node #9
>>>>>>> ID:708 DLC:1hex:  00     <-- answer node #8
>>>>>>> ID:703 DLC:1hex:  00     <-- answer node #3
>>>>>>> ID:705 DLC:0hex:          <-- same issue DLC is 0
>>>>>>> ID:70600 DLC:1hex:  01
>>>>>>> ID:70400 DLC:1hex:  01
>>>>>>> ID:70200 DLC:1hex:  01
>>>>>>> ID:70100 DLC:1hex:  01
>>>>>>> ID:1010000 DLC:1hex:  08
>>>>>>> ID:53220 DLC:124 out of bounds. abort.
>>>>>> Looks identical.
>>>>>>
>>>>>>> Also, I found another possible error source and I don't know if this
>>>>>>> error picture would corresponds to this.
>>>>>>>
>>>>>>> However,  While reviewing all settings, I noticed that I made a
>>>>>>> mistake
>>>>>>> with the RXBUF_SIZE which is set to 8096 instead of 8192. Must have
>>>>>>> been
>>>>>>> asleep when writing this. I'm going to rebuild this module.
>>>>>> Let's try to understand why rt_dev_recv() does return bogus dlc.
>>>>>>
>>>>>> What hardware and software are you using (arch, board, can
>>>>>> controlelr,
>>>>>> linux, xenomai)?
>>>>>>
>>>>>> Wolfgang.
>>>>> I modified the program a little to send it's own requests via one
>>>>> single
>>>>> socket. The output look like this.
>>>>>
>>>>> send succeeded
>>>>> ID:708 DLC:1hex:  00
>>>>> ID:709 DLC:1hex:  00
>>>>> ID:703 DLC:1hex:  00
>>>>> ID:706 DLC:1hex:  00
>>>>> ID:705 DLC:7hex:  00 00 01 01 00 09 07
>>>>> send succeeded
>>>>> send succeeded
>>>>> send succeeded
>>>>> send succeeded
>>>>> send succeeded
>>>>>
>>>>> And a parallel rtcanrecv output  like this:
>>>>>
>>>>> root at machinectrl:~# rtcanrecv rtcan0
>>>>> #0: (1) <0x000> [2] 81 00
>>>>> #1: (1) <0x708> [1] 00
>>>>> #2: (1) <0x709> [1] 00
>>>>> #3: (1) <0x703> [1] 00
>>>>> #4: (0) <0x706> [0]
>>>>> #5: (0) <0x500> [1] 01
>>>>> #6: (0) <0x400> [1] 01
>>>>> #7: (0) <0x100> [1] 01
>>>>> #8: (0) <0x200> [1] 01
>>>>> #9: (0) <0x000> [1] 08
>>>>> #10: (24) <0x220> [124] 00 00 82 00 00 00 01 08 01 00 00 00 f0 84
>>>>> 04 08
>>>> Why is "addr.can_ifindex = 24"? Something is broken in you build.
>>> In the xenomai build? how do I find out what? it all compiled well.
>>>
>>> I patched the driver  before building tkernel with
>>> 0001-rtcan-ems_pci-driver-update-to-support-more-devices.patch.gz
>> Can you show me that patch.
> See attachment.
>>
>>> I used the ipipe patch from the stable release,
>>>
>>> and then build it normally.
>>>
>>> Might the RX buf size that I changed a problem?
>> What exactly did you change? I think "rtcanrecv" does not use it.
>>
>> Wolfgang
> 
> The kernel option CONFIG_XENO_DRIVERS_CAN_RXBUF_SIZE I at first I set it
> to a wrong value  8096 but eve after I changed it to 8192 it didnt
> change anythingand now i set it back to 1024 with no improvement either.

Ah, a value of 8096 does make trouble, e.g. with expression like the
following:

        sock->recv_tail = (sock->recv_tail + cpy_size) &
            (RTCAN_RXBUF_SIZE - 1);

Could you please make a *clean* rebuild from scratch with a value 2^N,
either 8192 or 1024.

Wolfgang.



More information about the Xenomai mailing list