On 01/22/2014 03:12 PM, Gilles Chanteperdrix wrote:
> On 01/22/2014 03:04 PM, Alexandre COFFIGNAL wrote:
>>
>> Le 22/01/2014 14:30, Gilles Chanteperdrix a écrit :
>>> On 01/22/2014 02:27 PM, Alexandre COFFIGNAL wrote:
>>>>
>>>> Le 22/01/2014 13:00, Gilles Chanteperdrix a écrit :
>>>>> On 01/22/2014 12:36 PM, Alexandre COFFIGNAL wrote:
>>>>>>>> +        cf->data[3]=((data0 >> 0)  & 0xFF) ;
>>>>>>>> +        cf->data[2]=((data0 >> 8)  & 0xFF) ;
>>>>>>>> +        cf->data[1]=((data0 >> 16)  & 0xFF) ;
>>>>>>>> +        cf->data[0]=((data0 >> 24)  & 0xFF) ;
>>>>>>>> +        cf->data[7]=((data1 >> 0)  & 0xFF) ;
>>>>>>>> +        cf->data[6]=((data1 >> 8)  & 0xFF) ;
>>>>>>>> +        cf->data[5]=((data1 >> 16)  & 0xFF) ;
>>>>>>>> +        cf->data[4]=((data1 >> 24)  & 0xFF) ;
>>>>>>>>
>>>>>>>> rtcan flexcan works perfectly.
>>>>>>>> is  anyone know what is the problem with first instructions ?
>>>>>>> Probably mb->data does not have the right alignment. Could you not
>>>>>>> arrange to get it properly aligned? Failing that, you should use
>>>>>>> put_unaligned instead of open coding it.
>>>>>>>
>>>>>>>
>>>>>> here structures used in flexcan driver, it seem to be aligned
>>>>>
>>>>> I am talking about the alignment of cf->data, since obviously, that is
>>>>> the one which is causing problems.
>>>>>
>>>>>
>>>> Thank a lot, put_unaligned fix this issue if you want, i can send a
>>>> path
>>>>
>>>
>>> The other solution (getting cf->data to be properly aligned) would be
>>> more efficient, why is not it possible to get cf->data properly aligned?
>>>
>> I think, i can't get cf->data to be properly aligned because "cf" is
>> receive internal frame representation within the ring buffer
>> of a struct rtcan_socket and struct rtcan_rb_frame is a generic
>> structure used in all rtcan drivers .
> 
> Well, if you fix rtcan_rb_frame to be aligned, it will be aligned for
> all drivers, so that looks like a worthwile improvement...

I had a closer look. The CAN message (frame) queuing is optimized for
size to get as much as possible messages into the queue. Therefore the
CAN data are copied using memcpy, but only the real bytes. Directly
behind the real data is the 64 bit timestamp, if requested, which is
also not aligned. Therefore I suggest to use memcpy or byte accesses in
the flexcan driver as well. If this was a good decision is another question.

Wolfgang.


_______________________________________________
Xenomai mailing list
Xenomai@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai

Reply via email to