更新时间:2021-07-08 GMT+08:00
编程实例
实例描述
本实例实现如下流程。
- 任务Example_TaskEntry创建一个互斥锁,锁任务调度,创建两个任务Example_MutexTask1、Example_MutexTask2。Example_MutexTask2优先级高于Example_MutexTask1,解锁任务调度,然后Example_TaskEntry任务休眠300Tick。
- Example_MutexTask2被调度,以永久阻塞模式申请互斥锁,并成功获取到该互斥锁,然后任务休眠100Tick,Example_MutexTask2挂起,Example_MutexTask1被唤醒。
- Example_MutexTask1以定时阻塞模式申请互斥锁,等待时间为10Tick,因互斥锁仍被Example_MutexTask2持有,Example_MutexTask1挂起。10Tick超时时间到达后,Example_MutexTask1被唤醒,以永久阻塞模式申请互斥锁,因互斥锁仍被Example_MutexTask2持有,Example_MutexTask1挂起。
- 100Tick休眠时间到达后,Example_MutexTask2被唤醒, 释放互斥锁,唤醒Example_MutexTask1。Example_MutexTask1成功获取到互斥锁后,释放锁。
- 300Tick休眠时间到达后,任务Example_TaskEntry被调度运行,删除互斥锁,删除两个任务。
编程示例
前提条件:通过make menuconfig完成互斥锁的配置。
代码实现如下:
/* 互斥锁句柄id */ UINT32 g_testMux; /* 任务ID */ UINT32 g_testTaskId01; UINT32 g_testTaskId02; VOID Example_MutexTask1(VOID) { UINT32 ret; printf("task1 try to get mutex, wait 10 ticks.\n"); /* 申请互斥锁 */ ret = LOS_MuxPend(g_testMux, 10); if (ret == LOS_OK) { printf("task1 get mutex g_testMux.\n"); /* 释放互斥锁 */ LOS_MuxPost(g_testMux); return; } else if (ret == LOS_ERRNO_MUX_TIMEOUT ) { printf("task1 timeout and try to get mutex, wait forever.\n"); /* 申请互斥锁 */ ret = LOS_MuxPend(g_testMux, LOS_WAIT_FOREVER); if (ret == LOS_OK) { printf("task1 wait forever, get mutex g_testMux.\n"); /* 释放互斥锁 */ LOS_MuxPost(g_testMux); return; } } return; } VOID Example_MutexTask2(VOID) { printf("task2 try to get mutex, wait forever.\n"); /* 申请互斥锁 */ (VOID)LOS_MuxPend(g_testMux, LOS_WAIT_FOREVER); printf("task2 get mutex g_testMux and suspend 100 ticks.\n"); /* 任务休眠100Ticks */ LOS_TaskDelay(100); printf("task2 resumed and post the g_testMux\n"); /* 释放互斥锁 */ LOS_MuxPost(g_testMux); return; } UINT32 Example_TaskEntry(VOID) { UINT32 ret; TSK_INIT_PARAM_S task1; TSK_INIT_PARAM_S task2; /* 创建互斥锁 */ LOS_MuxCreate(&g_testMux); /* 锁任务调度 */ LOS_TaskLock(); /* 创建任务1 */ memset(&task1, 0, sizeof(TSK_INIT_PARAM_S)); task1.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_MutexTask1; task1.pcName = "MutexTsk1"; task1.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; task1.usTaskPrio = 5; ret = LOS_TaskCreate(&g_testTaskId01, &task1); if (ret != LOS_OK) { printf("task1 create failed.\n"); return LOS_NOK; } /* 创建任务2 */ memset(&task2, 0, sizeof(TSK_INIT_PARAM_S)); task2.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_MutexTask2; task2.pcName = "MutexTsk2"; task2.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; task2.usTaskPrio = 4; ret = LOS_TaskCreate(&g_testTaskId02, &task2); if (ret != LOS_OK) { printf("task2 create failed.\n"); return LOS_NOK; } /* 解锁任务调度 */ LOS_TaskUnlock(); /* 休眠300Ticks */ LOS_TaskDelay(300); /* 删除互斥锁 */ LOS_MuxDelete(g_testMux); /* 删除任务1 */ ret = LOS_TaskDelete(g_testTaskId01); if (ret != LOS_OK) { printf("task1 delete failed .\n"); return LOS_NOK; } /* 删除任务2 */ ret = LOS_TaskDelete(g_testTaskId02); if (ret != LOS_OK) { printf("task2 delete failed .\n"); return LOS_NOK; } return LOS_OK; }
结果验证
编译运行得到的结果为:
task2 try to get mutex, wait forever. task2 get mutex g_testMux and suspend 100 ticks. task1 try to get mutex, wait 10 ticks. task1 timeout and try to get mutex, wait forever. task2 resumed and post the g_testMux task1 wait forever,get mutex g_testMux.
完整实例代码
父主题: 互斥锁