- 论坛徽章:
- 0
|
最新使用护持访问实现的信号量操作。(汇编实现)
/*当前信号量列表*/
SEMAPHORE_TYPE BenOSSemaphore[MAX_SEM_NUM];
/*
* 创建信号量
*/
SEMAPHORE_TYPE* BenOSCreateSemaphore(I32 conuter)
{
INT_Stat stat = 0;
I32U index;
if (conuter < 0)
{
return (SEMAPHORE_TYPE*)NULL;
}
stat = BenOS_INT_Save();
for(index=0;index<MAX_SEM_NUM;index++)
{
if (BenOSSemaphore[index]==-1)
{
BenOSSemaphore[index] = conuter;
BenOS_INT_Restore(stat);
return &(BenOSSemaphore[index]);
}
}
BenOS_INT_Restore(stat);
return (SEMAPHORE_TYPE*)NULL;
}
I8 BenOSDeleteSemaphore(SEMAPHORE_TYPE* pSem)
{
INT_Stat stat = 0;
stat = BenOS_INT_Save();
/*当且仅当信号量计数为0的时候,才能释放该信号量*/
if ((*pSem) != 0)
{
BenOS_INT_Restore(stat);
return BenOS_Err;
}
else
{
(*pSem) = (SEMAPHORE_TYPE)-1;
BenOS_INT_Restore(stat);
return BenOS_OK;
}
}
__asm I8 BenOSGetSemaphore(SEMAPHORE_TYPE* pSem)
{
THUMB
PRESERVE8
PUSH {R1,R2,LR}
TryToRead_G
LDREX R2, [R0]
CLZ R1,R2
CBZ R1,GetFailed_G
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 BenOSReleaseSemaphore(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 BenOSWaitSemaphore(SEMAPHORE_TYPE* pSem,I32U timeout)
{
EXTERN BenOSTimeDly
PUSH {R1,R2,R3,LR}
ADD R1, #1
Loop_W
TryToRead_W
LDREX R2, [R0]
CLZ R3,R2
CBZ R3,GetFailed_W
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}
NOP
} |
|