Да, извините, я исправляюсь ....
исключение нагрузки будет проверять на ноль, затем повторите попытку, пока оно не станет равным нулю.
.spin_lock:
NOP
.stxr_fail:
LDXR R0, .data+0
CMP R0, #0
BNE .spin_lock
Если не ноль, то вы получите
load exclusive
store exclusive
check if the store worked.
repeat the whole thing if not.
Если бы два мастера А и В идеально выстроились в линию
loadx a
loadx b
storex a
storex b
Между эксклюзивным чтением и эксклюзивным письмом могут быть другие
Неэксклюзивные переводы.
...
Если ни один другой мастер не написал в это место со времен Эксклюзива
Чтение передачи, передача Эксклюзивная запись успешно и обновления
объем памяти.
...
Если другой мастер написал в это место после Эксклюзива
Передача чтения, передача исключительной записи не удалась и память
местоположение не обновлено.
storex от мастера a завершится успешно, storex от мастера b выйдет из строя, поэтому мастер a выйдет из цикла. master b будет продолжать цикл до тех пор, пока нагрузка не вернется ненулевой.
Так что он не может зайти в тупик даже на немного.
Мне нужно прочитать еще кое-что (ну, вы должны это сделать, поскольку это находится в документации ARM, где лежит ваш ответ, здесь не используется stackoverflow, чтобы прочитать документацию для вас, которая лежит в основе этого вопроса), чтобы подтвердить, что loadx a, loadx b, storex a будет иметь действительный магазин. Из приведенных выше цитат это было бы так. Если нет, то вы окажетесь в ситуации, когда ни один из них не получит блокировку до тех пор, пока один из них не будет прерван или по какой-либо другой причине не изменит свою частоту ударов, возможно, позволяя другому мастеру получить эксклюзивное хранилище чистой нагрузки. например, может ли логика просто запомнить идентификатор последнего ldrex и сравнить его со следующим strex
Монитор эксклюзивного доступа должен быть способен одновременно
мониторинг как минимум одного адреса для каждого эксклюзивного доступа
способный мастер в системе.
...
Раб, который не поддерживает монопольный доступ, может игнорировать AxLOCK
сигналы. Он должен предоставить OKAY ответ как для нормального, так и для
эксклюзивные доступы. Раб, поддерживающий монопольный доступ, должен иметь
Мониторинг оборудования. Эта спецификация рекомендует, чтобы такой раб имел
блок монитора для каждого основного идентификатора с исключительными возможностями, который может получить доступ
Это. Справочное руководство по архитектуре ARM, редакция ARMv7-A и ARMv7-R
определяет монитор монопольного доступа, а однопортовый подчиненный
иметь такой эксклюзивный монитор доступа, внешний по отношению к ведомому.
Многопортовый ведомый может потребовать внутреннего контроля.
Это означает, что если подчиненный поддерживает монопольный доступ, он должен иметь монитор (должен хранить идентификатор из предыдущего ldrex и сравнивать его с текущим strex). но рекомендуется только иметь монитор на мастер, так что если у него нет монитора на мастер, то вы, скорее всего, окажетесь в такой ситуации
ldrex a, ldrex b, strex a, strex b. Ldrex b и strex a не совпадают, поэтому сохранение не происходит, теперь в этом случае ldrex b и strex b совпадают, поэтому мы можем предположить, что master b получает блокировку, и мастер цикла a должен ждать, пока master b не обнулит ячейка памяти (clrex или, возможно, простая строка).
Arm имеет спецификации шины Axi и AHB, а также различные редакции этих спецификаций, и какой из них соответствует тому, какое ядро, возможно, содержится в техническом справочном руководстве для этого ядра. И чтобы получить полный ответ, вы должны, по крайней мере, попытаться сопоставить их и прочитать правильную спецификацию ревизии для используемого ядра и не предполагать, что все они в точности совпадают. Также следует понимать, что кэш L1 является частью ядра arm, кэш l2 находится за пределами ядра, но вы можете купить l2 у руки (или сделать свой собственный), можно надеяться, что логика ARM поддерживает эксклюзивный доступ, как описано в документации. Кроме того, вы попадаете на территорию производителей микросхем, и они могут реализовать то, что они хотят нарушить или нет, чтобы по-настоящему разделить, можно было бы хотеть, чтобы эти доступы находились в общем пространстве памяти, совместно используемом различными ядрами, и не имели кеш-ответов L1 или L2 и есть проблема согласованности. Производитель чипа может отказаться от эксклюзивного доступа и вернется в порядке. То, как это выглядит в коде, это то, что оно будет вращаться вечно, «возвращаемое значение» из strex передает EXOKAY только в том случае, если оно никогда не возвращается, поскольку проект не поддерживает монопольный доступ, тогда цикл бесконечен. Был там, видел это, вот как я знаю. В более старом документе говорилось, что для однопроцессорных разработок не требуется поддержка эксклюзивного доступа, в текущих версиях спецификаций не говорится, что они просто говорят вещи, связанные с тем, поддерживает ли подчиненный или нет эксклюзивный доступ.
если блокировка ldrex / strex будет работать, вы должны работать против ведомого, который поддерживает эксклюзивный доступ, в этом случае у вас есть один монитор или монитор на ведущее устройство, и я считаю, что я показал худшие случаи выше, если вы получить действительно очень везучий ldrex a, ldrex b, strex a, strex b для двух мастеров a и b, и на первом проходе нужно победить. а другой застревает в ожидании, как хотелось / задумано. добавьте больше мастеров и смешайте нагрузки и хранилища из них, и вы в конечном итоге окажетесь в той же ситуации: один выиграет, остальные проиграют и перейдут в цикл с нулевым циклом. Теперь интересно, если у вас есть два или более из них в этом цикле, тогда, когда один мастер, имеющий блокировку, освобождает его, вам не нужно быть везучим для других, борющихся за блокировку, чтобы получить ситуацию хранилища загрузки и загрузки.