更新时间:2021-07-08 GMT+08:00
编程实例
实例描述
本实例实现如下流程。
- 任务Example_TaskEntry初始化自旋锁,创建两个任务Example_SpinTask1、Example_SpinTask2,分别运行于两个核。
- Example_SpinTask1、Example_SpinTask2中均执行申请自旋锁的操作,同时为了模拟实际操作,在持有自旋锁后进行延迟操作,最后释放自旋锁。
- 300Tick后任务Example_TaskEntry被调度运行,删除任务Example_SpinTask1和Example_SpinTask2。
多核的运行时序不是固定的,因此也存在任务执行顺序不同的情况。
编程示例
前提条件:在menuconfig中,将LOSCFG_KERNEL_SMP配置项打开,并设置多核core数量。
代码实现如下:
#include "los_spinlock.h" #include "los_task.h" /* 自旋锁句柄id */ SPIN_LOCK_S g_testSpinlock; /* 任务ID */ UINT32 g_testTaskId01; UINT32 g_testTaskId02; VOID Example_SpinTask1(VOID) { UINT32 i; UINTPTR intSave; /* 申请自旋锁 */ dprintf("task1 try to get spinlock\n"); LOS_SpinLockSave(&g_testSpinlock, &intSave); dprintf("task1 got spinlock\n"); for(i = 0; i < 5000; i++) { asm volatile("nop"); } /* 释放自旋锁 */ dprintf("task1 release spinlock\n"); LOS_SpinUnlockRestore(&g_testSpinlock, intSave); return; } VOID Example_SpinTask2(VOID) { UINT32 i; UINTPTR intSave; /* 申请自旋锁 */ dprintf("task2 try to get spinlock\n"); LOS_SpinLockSave(&g_testSpinlock, &intSave); dprintf("task2 got spinlock\n"); for(i = 0; i < 5000; i++) { asm volatile("nop"); } /* 释放自旋锁 */ dprintf("task2 release spinlock\n"); LOS_SpinUnlockRestore(&g_testSpinlock, intSave); return; } UINT32 Example_TaskEntry(VOID) { UINT32 ret; TSK_INIT_PARAM_S stTask1; TSK_INIT_PARAM_S stTask2; /* 初始化自旋锁 */ LOS_SpinInit(&g_testSpinlock); /* 创建任务1 */ memset(&stTask1, 0, sizeof(TSK_INIT_PARAM_S)); stTask1.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_SpinTask1; stTask1.pcName = "SpinTsk1"; stTask1.uwStackSize = LOSCFG_TASK_MIN_STACK_SIZE; stTask1.usTaskPrio = 5; #ifdef LOSCFG_KERNEL_SMP /* 绑定任务到CPU0运行 */ stTask1.usCpuAffiMask = CPUID_TO_AFFI_MASK(0); #endif ret = LOS_TaskCreate(&g_testTaskId01, &stTask1); if(ret != LOS_OK) { dprintf("task1 create failed .\n"); return LOS_NOK; } /* 创建任务2 */ memset(&stTask2, 0, sizeof(TSK_INIT_PARAM_S)); stTask2.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_SpinTask2; stTask2.pcName = "SpinTsk2"; stTask2.uwStackSize = LOSCFG_TASK_MIN_STACK_SIZE; stTask2.usTaskPrio = 5; #ifdef LOSCFG_KERNEL_SMP /* 绑定任务到CPU1运行 */ stTask1.usCpuAffiMask = CPUID_TO_AFFI_MASK(1); #endif ret = LOS_TaskCreate(&g_testTaskId02, &stTask2); if(ret != LOS_OK) { dprintf("task2 create failed .\n"); return LOS_NOK; } /* 任务休眠300Ticks */ LOS_TaskDelay(300); /* 删除任务1 */ ret = LOS_TaskDelete(g_testTaskId01); if(ret != LOS_OK) { dprintf("task1 delete failed .\n"); return LOS_NOK; } /* 删除任务2 */ ret = LOS_TaskDelete(g_testTaskId02); if(ret != LOS_OK) { dprintf("task2 delete failed .\n"); return LOS_NOK; } return LOS_OK; }
结果验证
编译运行得到的结果为:
task2 try to get spinlock task2 got spinlock task1 try to get spinlock task2 release spinlock task1 got spinlock task1 release spinlock
完整实例代码
父主题: 自旋锁