2013-05-02 2 views
3

Ниже приведен пример реализации спин-блокировки в руководстве ARM. Пожалуйста, проверьте здесь: http://infocenter.arm.com/help/topic/com.arm.doc.genc007826/Barrier_Litmus_Tests_and_Cookbook_A08.pdf. Раздел «Использование ожидания для события (WFE) и отправки события (SEV) с помощью замков».Использование STREXEQ вместо STREX для реализации спин-блокировки в ARM

Блокировка Код:

Loop: 
    LDREX R5, [R1]  ; read lock 
    CMP R5, #0   ; check if 0 
    WFENE    ; sleep if the lock is held 
    STREXEQ R5, R0, [R1] ; attempt to store new value 
    CMPEQ R5, #0   ; test if store suceeded 
    BNE Loop    ; retry if not 
    DMB ; ensures that all subsequent accesses are observed after the 
     ; gaining of the lock is observed 
     ; loads and stores in the critical region can now be performed 

Код блокировки выпуска:

 MOV R0, #0 
    DMB   ; ensure all previous accesses are observed before the lock is cleared 
    STR R0, [R1] ; clear the lock. 
    DSB ; ensure completion of the store that cleared the lock before sending the event 
    SEV 

Вопрос: Почему используется STREXEQ? Что делать, если вместо этого используется STREX? Насколько я понимаю, strexeq будет выполняться, только если установлен флаг EQ. Но в любом случае, если EQ не установлен, WFENE обеспечит, чтобы мы ждали события? Так что не STREX EQ не нужно?

Заранее благодарен!

ответ

6

Нет, у WFE нет гарантий, о которых вы думаете. Руководство ARM описывает большой набор событий, которые должны вызывать выход из WFE, но ядро ​​может просыпаться по другим причинам. Например, ядру разрешено реализовать тайм-аут в своей реализации WFE. Эти события совпадают с событиями для WFI с добавлением некоторого процессора, выполняющего инструкцию SEV. Однако у него нет никаких требований, чтобы уснуть. Фактически, NOP - это архитектурно обоснованная, хотя и голодная реализация WFE. Вам небезопасно предполагать, что вы проснулись, потому что видели SEV. Например, возможно, было прерывание, процессор обработал прерывание и вернулся к потоку. Затем поток выполнил следующую команду в серии STREX.

+0

Thank you. В этом есть смысл. Я должен был больше обратить внимание на инструкцию wfene. – piscianemperor

1

SEV, WFI и WFE - это советы по энергосбережению для CPU, они не имеют ничего общего с синхронизацией памяти. Также WFE/SEV не подходит для того, чтобы соединять друг друга.

От ARM ARM:

A8.8.168:Отправить событие является инструкцией намек. Это заставляет событие передавать сигналы всем процессорам в многопроцессорной системе.

A8.8.425:ВДИ инструкция дает подсказку, что ничто не должно быть сделано до тех пор, пока процессор не принимает прерывание или подобное исключение.

A8.8.424:WFE инструкция дает подсказку, что ничто не должно быть сделано до тех пор, как инструкция SEV генерирует событие.

+0

Спасибо за указание этих разделов! – piscianemperor

Смежные вопросы