华为LiteOS互斥锁-实现互斥锁功能-osal_mutex_demo

本文详细阐述了互斥锁在多任务环境下如何保护共享资源的独占访问,包括其工作原理、使用场景及Huawei LiteOS中互斥锁的特性。通过实例演示了如何在标准应用中创建、申请和释放互斥锁,以及OSAL API的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目标
互斥锁的概念:通过互斥锁的概念,对互斥锁有整体的认识。
运作原理:掌握互斥锁运作的原理、深入领悟互斥锁的作用。
使用场景:了解互斥锁的使用场景,增加互斥锁的实用性。
开发流程:互斥锁开发流程,实现互斥锁功能。
内容1:互斥锁简介
互斥锁的概念:
互斥锁的概念:
1、互斥锁又称互斥型信号量,是一种特殊的二值性信号量,用于实现对共享资源的独占式处理。
2、任意时刻互斥锁的状态只有两种:开锁或闭锁
3、当有任务持有时,互斥锁处于闭锁状态,这个任务获得该互斥锁的所有权。
4、当该任务释放时,该互斥锁被开锁,任务失去该互斥锁的所有权。
5、当一个任务持有互斥锁时,其他任务将不能再对该互斥锁进行开锁或持有。
6、**多任务环境下往往存在多个任务竞争同一共享资源的应用场景,互斥锁可被用干对共享资源的保护从而实现独占式访问。**另外,互斥锁可以解决信号量存在的优先级翻转问题。
Huawei LiteOS提供的互斥锁具有如下特点:通过优先级继承算法,解决优先级翻转问题。
运作原理
多任务环境下会存在多个任务访问同一公共资源的场景,而有些公共资源是非共享的,需要任务进行独占式处理。互斥锁怎样来避免这种冲突呢?
用互斥锁处理非共享资源的同步访问时,如果有任务访问该资源,则互斥锁为加锁状态。此时其他任务如果想访问这个公共资源则会被阻塞,直到互斥锁被持有该锁的任务释放后,其他任务才能重新访问该公共资源,此时互斥锁再次上锁,如此确保同一时刻只有一个任务正在访问这个公共资源,保证了公共资源操作的完整性。
使用场景:
1.互斥锁可以提供任务之间的互斥机制,用来防止两个任务再同一时刻访问相同的共享资源。
2.除此之外,互斥锁还可以被用于防止多任务同步造成的优先级反转的问题。
互斥锁典型场景的开发流程。
1.创建互斥锁
2.申请互斥锁
3.释放互斥锁
4.删除互斥锁
OSAL的API的互斥锁接口简介:
osal_muttex_create 创建互斥锁
osal_muttex_del 删除互斥锁
osal_muttex_lock 获取互斥锁
osal_muttex_unlock 释放互斥锁

#include <osal.h>
#define USER_TASK1_PRI 12 //低优先级
#define USER_TASK2_PRI 11 //高优先级
uint32_t public_value = 0;
osal_mutex_t public_value_mutex;
//任务1:
static int user_task1_entry()
{
    while(1)
    {
        if(true == osal_mutex_lock(public_value_mutex))
        {
            printf("\r\n task1 : lock a mutex.\r\n");
            public_value+=10;
            printf("task1:public_value = %ld.\r\n",public_value);
            printf("task1:unlock a mutex.\r\n\r\n");
            osal_mutex_unlock(public_value_mutex);
            if(public_value>100)
            break;
        }
    }
    return 0;
}
//任务2:
static int user_task2_entry()
{
    while(1)
    {
        if(true == osal_mutex_lock(public_value_mutex))
        {
            printf("\r\n task2 : lock a mutex.\r\n");
            public_value+=5;
            printf("task2:public_value = %ld.\r\n",public_value);
            printf("task2:unlock a mutex.\r\n\r\n");
            osal_mutex_unlock(public_value_mutex);
            if(public_value>90)
                break;
            osal_task_sleep(10);
        }
    }
    return 0;
}
//创建互斥锁
int standard_app_demo_main()
{
    /*创建互斥锁public_value_mutex*/
    osal_mutex_create(&public_value_mutex);
    /*创建任务task1*/
    osal_task_create("user1_task",user_task1_entry,NULL,0x400,NULL,USER_TASK1_PRI);
    osal_task_create("user2_task",user_task2_entry,NULL,0x400,NULL,USER_TASK2_PRI);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值