Я читаю Cortex M4 TRM, чтобы понять циклы выполнения инструкций. Тем не менее, там есть некоторые запутанные описания
- В Таблица процессоров ,
STR
занимает 2 цикла . - Позже Тайминги загрузки / сохранения , это означает, что
STR Rx,[Ry,#imm]
- это всегда один цикл . Это потому, что генерация адреса выполняется в начальный цикл, и хранилище данных выполняется одновременно с выполнением следующей инструкции.
Если размер хранилища равен write buffer
, а write buffer
заполнен или не включен, следующая инструкция откладывается до завершения сохранения.
Если магазин не относится к write buffer
, например, к сегменту кода, и эта транзакция останавливается, влияние на синхронизацию ощущается только в том случае, если перед завершением выполняется другая операция загрузки или сохранения. 3. По-прежнему в Тайминги загрузки / сохранения , это указывает на то, что LDR
может быть конвейерно, следуя LDR
и STR
, но STR
не может быть обработан конвейером согласно следующим инструкциям. Другие инструкции не могут быть обработаны конвейером после STR
со смещением регистра. STR может быть конвейерным только тогда, когда он следует за LDR, но ничего не может быть конвейеризовано после сохранения. Даже застрявший STR
обычно занимает только два цикла из-за буфера записи
Подробнее c о том, что меня смутило:
Q1. 1 и 2 кажутся противоречащими друг другу, сколько циклов на самом деле занимает STR
, 1 или 2? (Мой эксперимент показывает 1)
Q2. 2 указывает, что если хранилище от go до write buffer
недоступно, оно, тем не менее, остановит конвейер, но если хранилище обходит его, конвейер может остановиться только при выполнении инструкций загрузки / сохранения. Запах типа write buffer
может только усугубить ситуацию. Это противоречит здравому смыслу.
Q3. 3 означает, что STR
не может быть конвейерно с помощью следующей инструкции, однако 2 означает, что STR
всегда конвейерно с помощью следующей инструкции при надлежащих условиях. Как понять противоречивые утверждения? (И здесь это означает, что STR
занимает 2 вместо 1 цикла из-за write buffer
)
Q4. Я не нахожу дополнительной информации о том, как реализован write buffer
. Насколько велик буфер? Как STR
определить, использовать его или обойти?