[GSOC] RPi BSP memory barrier
Andre Marques
andre.lousa.marques at gmail.com
Tue May 13 19:40:17 UTC 2014
On 05/09/14 07:04, Sebastian Huber wrote:
> On 2014-05-08 18:51, Andre Marques wrote:
>> On 05/05/14 11:50, Sebastian Huber wrote:
>>> On 2014-05-05 12:43, Andre Marques wrote:
>>>>
>>>> Any thoughts on this?
>>>
>>> Why not use C11 atomic operations?
>>>
>>
>> Well, I didn't know they existed, thank you!
>>
>> Since I have not used them before, please check if I'm thinking this
>> right.
>>
>> 1. Include rtems/score/atomic.h
>>
>> 2. Initialize variable with ATOMIC_INITIALIZER_* as per
>>
>> http://www.rtems.org/onlinedocs/doxygen/cpukit/html/group__RTEMS.html#ga676563e3ec750e9faa2727eea8ed99e1
>>
>>
>> 3. Use _Atomic_Load_* to read the variable value and _Atomic_Store_*
>> to set a
>> new value to the variable
>>
>> 4. As for memory models I'm thinking in using ATOMIC_ORDER_ACQUIRE to
>> load and
>> ATOMIC_ORDER_RELEASE to store.
>
> You can also use the _Atomic_Fence() in some situations. If you work
> with devices, then the C11 atomic operations may be not sufficient.
>
> In cpu.h we have on the ARM:
>
> static inline void _ARM_Data_memory_barrier( void )
> {
> __asm__ volatile ( "dmb" : : : "memory" );
> }
>
> static inline void _ARM_Data_synchronization_barrier( void )
> {
> __asm__ volatile ( "dsb" : : : "memory" );
> }
>
> static inline void _ARM_Instruction_synchronization_barrier( void )
> {
> __asm__ volatile ( "isb" : : : "memory" );
> }
>
>
Yes this memory concern is related to multiple devices working at the
same time.
If I understood, I should use the C11 atomic operations to access the
variables (representing a memory register), along with the arm memory
barriers?
Those cpu.h functions call the memory barrier instructions, but from the
little I know about the arm1176 (armv6) used on the RPi it does not
support the memory barrier instructions (dmb, dsb and isb), but instead
relies on a coprocessor instruction
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/I1014942.html
I naively tried to call the _ARM_Data_memory_barrier () on the Raspberry
Pi BSP and it gave me
Error: selected processor does not support ARM mode `dmb'
I just called it, I did not made any other preparation or includes, so
this may be my fault.
This suggests (or confirms) that the inline assembly to implement those
memory barriers are lacking (for the RPi BSP at least).
Thanks for the help.
More information about the devel
mailing list