1 /* 2 * Copyright (c) 2009-2022 Huawei Technologies Co., Ltd. All rights reserved. 3 * 4 * UniProton is licensed under Mulan PSL v2. 5 * You can use this software according to the terms and conditions of the Mulan PSL v2. 6 * You may obtain a copy of Mulan PSL v2 at: 7 * http://license.coscl.org.cn/MulanPSL2 8 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 9 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 10 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 11 * See the Mulan PSL v2 for more details. 12 * Create: 2009-12-22 13 * Description: 信号量模块内部头文件 14 */ 15 #ifndef PRT_SEM_EXTERNAL_H 16 #define PRT_SEM_EXTERNAL_H 17 18 #include "prt_sem.h" 19 #include "prt_task_external.h" 20 #if defined(OS_OPTION_POSIX) 21 #include "semaphore.h" 22 #include "prt_posix_internal.h" 23 #endif 24 25 #define OS_SEM_UNUSED 0 26 #define OS_SEM_USED 1 27 28 #define SEM_PROTOCOL_PRIO_INHERIT 1 29 #define SEM_TYPE_BIT_WIDTH 0x4U 30 #define SEM_PROTOCOL_BIT_WIDTH 0x8U 31 32 #define OS_SEM_WITH_LOCK_FLAG 1 33 #define OS_SEM_WITHOUT_LOCK_FLAG 0 34 35 #define GET_SEM_LIST(ptr) LIST_COMPONENT(ptr, struct TagSemCb, semList) 36 #define GET_SEM(semid) (((struct TagSemCb *)g_allSem) + (semid)) 37 #define GET_SEM_TSK(semid) (((SEM_TSK_S *)g_semTsk) + (semid)) 38 #define GET_TSK_SEM(tskid) (((TSK_SEM_S *)g_tskSem) + (tskid)) 39 #define GET_SEM_TYPE(semType) (U32)((semType) & ((1U << SEM_TYPE_BIT_WIDTH) - 1)) 40 #define GET_MUTEX_TYPE(semType) (U32)(((semType) >> SEM_TYPE_BIT_WIDTH) & ((1U << SEM_TYPE_BIT_WIDTH) - 1)) 41 #define GET_SEM_PROTOCOL(semType) (U32)((semType) >> SEM_PROTOCOL_BIT_WIDTH) 42 43 struct TagSemCb { 44 /* 是否使用 OS_SEM_UNUSED/OS_SEM_USED */ 45 U16 semStat; 46 /* 核内信号量索引号 */ 47 U16 semId; 48 #if defined(OS_OPTION_SEM_RECUR_PV) 49 /* 二进制互斥信号量递归P计数,计数型信号量和二进制同步模式信号量无效 */ 50 U32 recurCount; 51 #endif 52 /* 当该信号量已用时,其信号量计数 */ 53 U32 semCount; 54 /* 挂接阻塞于该信号量的任务 */ 55 struct TagListObject semList; 56 /* 挂接任务持有的互斥信号量,计数型信号量信号量无效 */ 57 struct TagListObject semBList; 58 59 /* Pend到该信号量的线程ID */ 60 U32 semOwner; 61 /* 信号量唤醒阻塞任务的方式 */ 62 enum SemMode semMode; 63 /* 信号量,计数型或二进制 */ 64 U32 semType; 65 #if defined(OS_OPTION_POSIX) 66 /* 信号量名称 */ 67 char name[MAX_POSIX_SEMAPHORE_NAME_LEN + 1]; // + \0 68 /* sem_open 句柄 */ 69 sem_t handle; 70 #endif 71 }; 72 73 /* 模块间全局变量声明 */ 74 extern U16 g_maxSem; 75 76 /* 指向核内信号量控制块 */ 77 extern struct TagSemCb *g_allSem; 78 79 extern U32 OsSemCreate(U32 count, U32 semType, enum SemMode semMode, SemHandle *semHandle, U32 cookie); 80 81 #endif /* PRT_SEM_EXTERNAL_H */ 82