Я знаю, что это может быть странным использованием. Я просто хочу знать, могу ли я использовать LDREX/STREX с отключенным SCU.
Я использую двухъядерный процессор Cortext-A9 SoC. Два ядра работают в режиме AMP: у каждого ядра своя ОС. Хотя контроллер памяти является общим ресурсом, каждое ядро имеет собственное пространство памяти. Один не может получить доступ к памяти другого. Поскольку когерентность кэша не требуется, SCU не включен. В то же время у меня также есть общая область памяти, к которой могут получить доступ оба ядра. Область общей памяти не кэшируется, чтобы избежать проблем с когерентностью кэша.
Я определяю спин-блокировку в этой области общей памяти. Эта спин-блокировка используется для защиты доступа к общим ресурсам. Прямо сейчас спин-блокировка реализована просто так:
void spin_lock(uint32_t *lock)
{
while(*lock);
*lock = 1;
}
void spin_unlock(uint32_t *lock)
{
*lock = 0;
}
где блокировка — это переменная в общей памяти, поэтому оба ядра могут получить доступ к этой блокировке.
Проблема этой реализации в том, что доступ к блокировке не является исключительным. Вот почему я хочу использовать LDREX/STREX для реализации спин-блокировки. Пожалуйста, позвольте мне переформулировать мой вопрос:
Могу ли я использовать LDREX/STREX без включенного SCU?
Спасибо!