Mutex 的简单实现(在单机非EmbOS背景下的简单使用)

21 篇文章 0 订阅
8 篇文章 2 订阅

《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);
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值