- 论坛徽章:
- 0
|
以下是使用互斥访问实现的信号量(Thumb2汇编实现)
最近在考虑使用位带(bit band)实现互斥量
有没有朋友对位带实现互斥操作熟悉的?
给我点意见,不胜感谢
__asm I8 BenOSGetSemaphore1(SEMAPHORE_TYPE* pSem)
{
THUMB
REQUIRE8
PRESERVE8
PUSH {R1,R2,LR}
TryToRead_G
LDREX R2, [R0]
CMP R2,#0
CBZ R2,GetFailed_G
ReadSuccess_G ;Try to get sem
SUB R2, #1
STREX R1,R2,[R0]
CMP R1, #0
BNE TryToRead_G
GetSuccess_G
MOV R0, #1
POP {R1,R2,PC}
GetFailed_G
; STREX R1,R2,[R0]
MOV R0, #0
POP {R1,R2,PC}
}
__asm I8 BenOSReleaseSemaphore1(SEMAPHORE_TYPE* pSem)
{
PUSH {R1,R2,LR}
TryToRead_R
LDREX R2, [R0]
ReadSuccess_R ;Try to get sem
ADD R2, #1
STREX R1,R2,[R0]
CMP R1, #0
BNE TryToRead_R
GetSuccess_R
MOV R0, #1
POP {R1,R2,PC}
}
__asm I8 BenOSWaitSemaphore1(SEMAPHORE_TYPE* pSem,I32U timeout)
{
EXTERN BenOSTimeDly
PUSH {R1,R2,R3,LR}
ADD R1, #1
Loop_W
TryToRead_W
LDREX R2, [R0]
CBZ R2,Wait1Tick_W
ReadSuccess_W ;Try to get sem
SUB R2, #1
STREX R3,R2,[R0]
CMP R3, #0
BNE TryToRead_W
B GetSuccess_W
Wait1Tick_W
; STREX R3,R2,[R0]
SUB R1, #1
CBZ R1,GetFailed_W
PUSH {R0-R3}
MOV R0,#1
LDR R3,=BenOSTimeDly
BLX R3
POP {R0-R3}
B Loop_W
GetSuccess_W
MOV R0, #1
POP {R1,R2,R3,PC}
GetFailed_W
MOV R0, #0
POP {R1,R2,R3,PC}
}
[ 本帖最后由 shmilylxx 于 2009-1-7 22:38 编辑 ] |
|