《xx.h》
typedef int (*P_GetMutex)(int, int);
typedef int (*P_FreeMutex)(int, int);
typedef struct _MUTEX_S
{
int Mutex; // 0/1 且 不支持嵌套
int Owner; //因为是在非EmbOS 中使用,这里的Owner代指调用Mutex的函数。
P_GetMutex GetMutex;
P_FreeMutex FreeMutex;
} MUTEX_S;
void InitMutex(MUTEX_S *pMutex);
void ClrMutex(MUTEX_S *pMutex);
int DoGetMutex(int Owner, int Self);
int DoFreeMutex(int Owner, int Self);
《xx.c》
//初始化Mutex
void InitMutex(MUTEX_S *pMutex)
{
pMutex->Owner = NULL;
pMutex->Mutex = 0;
pMutex->GetMutex = DoGetMutex;
pMutex->FreeMutex = DoFreeMutex;
}
//清空 Mutex
void ClrMutex(MUTEX_S *pMutex)
{
pMutex->Owner = NULL;
pMutex->Mutex = 0;
pMutex->GetMutex = NULL;
pMutex->FreeMutex = NULL;
}
// 尝试获取Mutex 即加锁
int DoGetMutex(int Owner, int Self)
{
MUTEX_S *pMutex = NULL;
int IsFree = 0;
__disable_irq();
if (Owner != 0 && Self != 0)
{
pMutex = (MUTEX_S *)Self;
if (!pMutex->Mutex)
{
pMutex->Mutex = 1;
pMutex->Owner = Owner;
IsFree = 1;
}
}
__enable_irq();
return IsFree;
}
// 尝试释放Mutex 即解锁
int DoFreeMutex(int Owner, int Self)
{
int SetFree = 0;
MUTEX_S *pMutex = NULL;
__disable_irq();
if (Owner != 0 && Self != 0)
{
pMutex = (MUTEX_S *)Self;
if (pMutex->Owner == Owner)
{
pMutex->Mutex = 0;
pMutex->Owner = NULL;
SetFree = 1;
}
}
__enable_irq();
return SetFree;
}
<<main.c>>
MUTEX_S MutexA;
int main(void)
{
while (1)
{
U8 u8DdiSts = 0;
if (MutexA.GetMutex((int)main, (int)&MutexA))
{
vm_printf("\n\nFKNormalWork SP[u8DdiSts] =0x%x\n", &u8DdiSts);
MutexA.FreeMutex((int)main, (int)&MutexA);
}
delay(1000);
}
}
<<IRQ.c>>
extern MUTEX_S MutexA;
void I2C_END_IRQ_Handler(void)
{
if (MutexA.GetMutex((int)I2CStart_IRQHandler, (int)&MutexA))
{
vm_printf("IIC SP[u8TxData] = 0x%x\n", &u8TxData);
MutexA.FreeMutex((int)I2CStart_IRQHandler, (int)&MutexA);
}
}