WS63 SDK 文档 7021f4f@fbb_ws63
ws63 和 ws63e 解决方案的 SDK 文档
载入中...
搜索中...
未找到
los_spinlock.h
浏览该文件的文档.
1/*----------------------------------------------------------------------------
2 * Copyright (c) Huawei Technologies Co., Ltd. 2018-2019. All rights reserved.
3 * Description: Spinlock
4 * Author: Huawei LiteOS Team
5 * Create: 2018-07-11
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
8 * 1. Redistributions of source code must retain the above copyright notice, this list of
9 * conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
11 * of conditions and the following disclaimer in the documentation and/or other materials
12 * provided with the distribution.
13 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
14 * to endorse or promote products derived from this software without specific prior written
15 * permission.
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
20 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *---------------------------------------------------------------------------*/
28
34#ifndef _LOS_SPINLOCK_H
35#define _LOS_SPINLOCK_H
36#include "los_typedef.h"
37#include "los_config.h"
38#include "los_hwi.h"
39#include "los_task.h"
40#include "los_lockdep.h"
41#include "arch/spinlock.h"
42
43#ifdef __cplusplus
44extern "C" {
45#endif /* __cplusplus */
46
47#ifdef LOSCFG_KERNEL_SPINDEP
48#define OS_SPINLOCK_FROM_SPINLOCK_CHECK(ptr) LOS_DL_LIST_ENTRY(ptr, SPIN_LOCK_S, lockCheck)
49#define SPIN_LOCK_INITIALIZER(lockName) \
50{0U, {LOCK_SPIN, 0, #lockName, 0xFFFFFFFF, NULL}}
51#else
52#define SPIN_LOCK_INITIALIZER(lockName) \
53{ \
54 .rawLock = 0U, \
55}
56#endif
57
72#define SPIN_LOCK_INIT(lock) SPIN_LOCK_S lock = SPIN_LOCK_INITIALIZER(lock)
73
78struct Spinlock {
79 size_t rawLock;
80#ifdef LOSCFG_KERNEL_SPINDEP
81 LosLockCheck lockCheck;
82#endif
83};
84typedef struct Spinlock SPIN_LOCK_S;
85#ifdef LOSCFG_KERNEL_SMP
114{
115 /*
116 * disable the scheduler, so it won't do schedule until
117 * scheduler is reenabled. The LOS_TaskUnlock should not
118 * be directly called along this critic area.
119 */
120 LOS_TaskLock();
121
122 LOCKDEP_CHECK_IN(lock);
123 ArchSpinLock(&lock->rawLock);
124 LOCKDEP_RECORD(lock);
125}
126
154{
155 LOS_TaskLock();
156
157 LOCKDEP_CHECK_IN(lock);
158 INT32 ret = ArchSpinTrylock(&lock->rawLock);
159 if (ret == LOS_OK) {
160 LOCKDEP_RECORD(lock);
161 }
162
163 return ret;
164}
165
188{
189 LOCKDEP_CHECK_OUT(lock);
190 ArchSpinUnlock(&lock->rawLock);
191
192 /* Restore the scheduler flag. May cause task schedule. */
194}
195
221LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinUnlockNoSched(SPIN_LOCK_S *lock)
222{
223 LOCKDEP_CHECK_OUT(lock);
224 ArchSpinUnlock(&lock->rawLock);
225
226 /* Restore the scheduler flag only. */
228}
229
258LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinLockSave(SPIN_LOCK_S *lock, UINT32 *intSave)
259{
260 *intSave = LOS_IntLock();
261 LOS_SpinLock(lock);
262}
263
288LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinUnlockRestore(SPIN_LOCK_S *lock, UINT32 intSave)
289{
290 LOS_SpinUnlock(lock);
291 LOS_IntRestore(intSave);
292}
293
315LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_SpinHeld(const SPIN_LOCK_S *lock)
316{
317 return (lock->rawLock != 0);
318}
319
345{
346 lock->rawLock = 0;
347 LOCKDEP_CHECK_INIT(lock);
348}
349
350#else
351
352/*
353 * For Non-SMP system, these apis does not handle with spinlocks,
354 * but for unifying the code of drivers, vendors and etc.
355 */
357{
358 (VOID)lock;
359}
360
362{
363 (VOID)lock;
364 return LOS_OK;
365}
366
368{
369 (VOID)lock;
370}
371
372LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinUnlockNoSched(SPIN_LOCK_S *lock)
373{
374 (VOID)lock;
375}
376
377LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinLockSave(SPIN_LOCK_S *lock, UINT32 *intSave)
378{
379 (VOID)lock;
380 *intSave = LOS_IntLock();
381}
382
383LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_SpinUnlockRestore(SPIN_LOCK_S *lock, UINT32 intSave)
384{
385 (VOID)lock;
386 LOS_IntRestore(intSave);
387}
388
389LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_SpinHeld(const SPIN_LOCK_S *lock)
390{
391 (VOID)lock;
392 return TRUE;
393}
394
396{
397 (VOID)lock;
398}
399
400#endif
401
402#ifdef __cplusplus
403}
404#endif /* __cplusplus */
405
406#endif
#define STATIC
Definition common_def.h:57
#define INLINE
Definition common_def.h:65
void LOS_TaskUnlockNoSched(void)
Unlock the task scheduling and no scheduling is generated.
void LOS_TaskUnlock(void)
Unlock the task scheduling.
void LOS_TaskLock(void)
Lock the task scheduling.
#define LITE_OS_SEC_ALW_INLINE
Definition los_builddef.h:46
#define LOCKDEP_CHECK_INIT(lock)
Definition los_lockdep.h:129
#define LOCKDEP_CHECK_IN(lock)
Definition los_lockdep.h:130
#define LOCKDEP_CHECK_OUT(lock)
Definition los_lockdep.h:132
#define LOCKDEP_RECORD(lock)
Definition los_lockdep.h:131
signed int INT32
Definition los_typedef.h:55
#define VOID
Definition los_typedef.h:88
#define LOS_OK
Definition los_typedef.h:122
#define TRUE
Definition los_typedef.h:98
unsigned int UINT32
Definition los_typedef.h:52
size_t BOOL
Definition los_typedef.h:83
Definition los_lockdep.h:62
Definition los_spinlock.h:78
size_t rawLock
Definition los_spinlock.h:79