diff options
Diffstat (limited to '')
| -rw-r--r-- | demo/lock.S | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/demo/lock.S b/demo/lock.S index 3ec2765..120728b 100644 --- a/demo/lock.S +++ b/demo/lock.S @@ -11,13 +11,17 @@ spin_lock: orr r2, r2, #0xc0 @ Levanta I, F msr cpsr_c, r2 mov r3, #1 -1: ldrex r2, [r0] - teq r2, #0 - strexeq r2, r3, [r0] - teqeq r2, #0 - bne 1b - mov pc, lr - +1: ldrex r2, [r0] @ se carga el valor del lock + teq r2, #0 @ se revisa si el valor del lock, si es 1, se bringa al jump + strexeq r2, r3, [r0] @ trata de guardar r3 en r0, pero solo si el monitor se lo permite + teqeq r2, #0 @ revisa si en efecto se hizo el store o no + bne 1b @ regresa al inicio + mov pc, lr @ retorna de la función + @ + @ la implicación de esto es que si dos + @ cores intentan hacer accesar al mismo + @ recurso, el monitor solo va a dejar a uno + @ de ellos hacerlo .global spin_unlock spin_unlock: mov r2, #0 |
