• μC/OS-II---事件标志组管理1(os_flag.c)


    在这里插入图片描述

    事件标志组创建

    OS_FLAG_GRP  *OSFlagCreate (OS_FLAGS  flags,
    														INT8U    *perr)
    {
    	OS_FLAG_GRP *pgrp;
    #if OS_CRITICAL_METHOD == 3u                        /* Allocate storage for CPU status register        */
    	OS_CPU_SR    cpu_sr = 0u;
    #endif
    #ifdef OS_SAFETY_CRITICAL
    	
    	if (perr == (INT8U *)0)
    	{
    		OS_SAFETY_CRITICAL_EXCEPTION();
    		return ((OS_FLAG_GRP *)0);
    	}
    	
    #endif
    #ifdef OS_SAFETY_CRITICAL_IEC61508
    	
    	if (OSSafetyCriticalStartFlag == OS_TRUE)
    	{
    		OS_SAFETY_CRITICAL_EXCEPTION();
    		return ((OS_FLAG_GRP *)0);
    	}
    	
    #endif
    	
    	if (OSIntNesting > 0u)                          /* See if called from ISR ...                      */
    	{
    		*perr = OS_ERR_CREATE_ISR;                  /* ... can't CREATE from an ISR                    */
    		return ((OS_FLAG_GRP *)0);
    	}
    	
    	OS_ENTER_CRITICAL();
    	pgrp = OSFlagFreeList;                          /* Get next free event flag                        */
    	
    	if (pgrp != (OS_FLAG_GRP *)0)                   /* See if we have event flag groups available      */
    	{
    		/* Adjust free list                                */
    		OSFlagFreeList       = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
    		pgrp->OSFlagType     = OS_EVENT_TYPE_FLAG;  /* Set to event flag group type                    */
    		pgrp->OSFlagFlags    = flags;               /* Set to desired initial value                    */
    		pgrp->OSFlagWaitList = (void *)0;           /* Clear list of tasks waiting on flags            */
    #if OS_FLAG_NAME_EN > 0u
    		pgrp->OSFlagName     = (INT8U *) (void *)"?";
    #endif
    		OS_EXIT_CRITICAL();
    		*perr                = OS_ERR_NONE;
    	}
    	
    	else
    	{
    		OS_EXIT_CRITICAL();
    		*perr                = OS_ERR_FLAG_GRP_DEPLETED;
    	}
    	
    	return (pgrp);                                  /* Return pointer to event flag group              */
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    事件标志组删除

    #if OS_FLAG_DEL_EN > 0u
    OS_FLAG_GRP  *OSFlagDel (OS_FLAG_GRP  *pgrp,
    												 INT8U         opt,
    												 INT8U        *perr)
    {
    	BOOLEAN       tasks_waiting;
    	OS_FLAG_NODE *pnode;
    	OS_FLAG_GRP  *pgrp_return;
    #if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */
    	OS_CPU_SR     cpu_sr = 0u;
    #endif
    #ifdef OS_SAFETY_CRITICAL
    	
    	if (perr == (INT8U *)0)
    	{
    		OS_SAFETY_CRITICAL_EXCEPTION();
    		return ((OS_FLAG_GRP *)0);
    	}
    	
    #endif
    #if OS_ARG_CHK_EN > 0u
    	
    	if (pgrp == (OS_FLAG_GRP *)0)                          /* Validate 'pgrp'                          */
    	{
    		*perr = OS_ERR_FLAG_INVALID_PGRP;
    		return (pgrp);
    	}
    	
    #endif
    	
    	if (OSIntNesting > 0u)                                 /* See if called from ISR ...               */
    	{
    		*perr = OS_ERR_DEL_ISR;                            /* ... can't DELETE from an ISR             */
    		return (pgrp);
    	}
    	
    	if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG)            /* Validate event group type                */
    	{
    		*perr = OS_ERR_EVENT_TYPE;
    		return (pgrp);
    	}
    	
    	OS_ENTER_CRITICAL();
    	
    	if (pgrp->OSFlagWaitList != (void *)0)                 /* See if any tasks waiting on event flags  */
    	{
    		tasks_waiting = OS_TRUE;                           /* Yes                                      */
    	}
    	
    	else
    	{
    		tasks_waiting = OS_FALSE;                          /* No                                       */
    	}
    	
    	switch (opt)
    	{
    		case OS_DEL_NO_PEND:                               /* Delete group if no task waiting          */
    			if (tasks_waiting == OS_FALSE)
    			{
    #if OS_FLAG_NAME_EN > 0u
    				pgrp->OSFlagName     = (INT8U *) (void *)"?";
    #endif
    				pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
    				pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list           */
    				pgrp->OSFlagFlags    = (OS_FLAGS)0;
    				OSFlagFreeList       = pgrp;
    				OS_EXIT_CRITICAL();
    				*perr                = OS_ERR_NONE;
    				pgrp_return          = (OS_FLAG_GRP *)0;  /* Event Flag Group has been deleted        */
    			}
    			
    			else
    			{
    				OS_EXIT_CRITICAL();
    				*perr                = OS_ERR_TASK_WAITING;
    				pgrp_return          = pgrp;
    			}
    			
    			break;
    			
    		case OS_DEL_ALWAYS:                                /* Always delete the event flag group       */
    			pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
    			
    			while (pnode != (OS_FLAG_NODE *)0)            /* Ready ALL tasks waiting for flags        */
    			{
    				(void)OS_FlagTaskRdy (pnode, (OS_FLAGS)0, OS_STAT_PEND_ABORT);
    				pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
    			}
    			
    #if OS_FLAG_NAME_EN > 0u
    			pgrp->OSFlagName     = (INT8U *) (void *)"?";
    #endif
    			pgrp->OSFlagType     = OS_EVENT_TYPE_UNUSED;
    			pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list                */
    			pgrp->OSFlagFlags    = (OS_FLAGS)0;
    			OSFlagFreeList       = pgrp;
    			OS_EXIT_CRITICAL();
    			
    			if (tasks_waiting == OS_TRUE)                 /* Reschedule only if task(s) were waiting  */
    			{
    				OS_Sched();                               /* Find highest priority task ready to run  */
    			}
    			
    			*perr = OS_ERR_NONE;
    			pgrp_return          = (OS_FLAG_GRP *)0;      /* Event Flag Group has been deleted        */
    			break;
    			
    		default:
    			OS_EXIT_CRITICAL();
    			*perr                = OS_ERR_INVALID_OPT;
    			pgrp_return          = pgrp;
    			break;
    	}
    	
    	return (pgrp_return);
    }
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117

    事件标志组获取/等待

    OS_FLAGS  OSFlagPend (OS_FLAG_GRP  *pgrp,
    											OS_FLAGS      flags,
    											INT8U         wait_type,
    											INT32U        timeout,
    											INT8U        *perr)
    {
    	OS_FLAG_NODE  node;
    	OS_FLAGS      flags_rdy;
    	INT8U         result;
    	INT8U         pend_stat;
    	BOOLEAN       consume;
    #if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */
    	OS_CPU_SR     cpu_sr = 0u;
    #endif
    #ifdef OS_SAFETY_CRITICAL
    	
    	if (perr == (INT8U *)0)
    	{
    		OS_SAFETY_CRITICAL_EXCEPTION();
    		return ((OS_FLAGS)0);
    	}
    	
    #endif
    #if OS_ARG_CHK_EN > 0u
    	
    	if (pgrp == (OS_FLAG_GRP *)0)                          /* Validate 'pgrp'                          */
    	{
    		*perr = OS_ERR_FLAG_INVALID_PGRP;
    		return ((OS_FLAGS)0);
    	}
    	
    #endif
    	
    	if (OSIntNesting > 0u)                                 /* See if called from ISR ...               */
    	{
    		*perr = OS_ERR_PEND_ISR;                           /* ... can't PEND from an ISR               */
    		return ((OS_FLAGS)0);
    	}
    	
    	if (OSLockNesting > 0u)                                /* See if called with scheduler locked ...  */
    	{
    		*perr = OS_ERR_PEND_LOCKED;                        /* ... can't PEND when locked               */
    		return ((OS_FLAGS)0);
    	}
    	
    	if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG)            /* Validate event block type                */
    	{
    		*perr = OS_ERR_EVENT_TYPE;
    		return ((OS_FLAGS)0);
    	}
    	
    	result = (INT8U) (wait_type & OS_FLAG_CONSUME);
    	
    	if (result != (INT8U)0)                                /* See if we need to consume the flags      */
    	{
    		wait_type &= (INT8U)~ (INT8U)OS_FLAG_CONSUME;
    		consume    = OS_TRUE;
    	}
    	
    	else
    	{
    		consume    = OS_FALSE;
    	}
    	
    	/*$PAGE*/
    	OS_ENTER_CRITICAL();
    	
    	switch (wait_type)
    	{
    		case OS_FLAG_WAIT_SET_ALL:                         /* See if all required flags are set        */
    			flags_rdy = (OS_FLAGS) (pgrp->OSFlagFlags & flags);  /* Extract only the bits we want     */
    			
    			if (flags_rdy == flags)                       /* Must match ALL the bits that we want     */
    			{
    				if (consume == OS_TRUE)                   /* See if we need to consume the flags      */
    				{
    					pgrp->OSFlagFlags &= (OS_FLAGS)~flags_rdy;   /* Clear ONLY the flags we wanted    */
    				}
    				
    				OSTCBCur->OSTCBFlagsRdy = flags_rdy;      /* Save flags that were ready               */
    				OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
    				*perr                   = OS_ERR_NONE;
    				return (flags_rdy);
    			}
    			
    			else                                          /* Block task until events occur or timeout */
    			{
    				OS_FlagBlock (pgrp, &node, flags, wait_type, timeout);
    				OS_EXIT_CRITICAL();
    			}
    			
    			break;
    			
    		case OS_FLAG_WAIT_SET_ANY:
    			flags_rdy = (OS_FLAGS) (pgrp->OSFlagFlags & flags);   /* Extract only the bits we want    */
    			
    			if (flags_rdy != (OS_FLAGS)0)                 /* See if any flag set                      */
    			{
    				if (consume == OS_TRUE)                   /* See if we need to consume the flags      */
    				{
    					pgrp->OSFlagFlags &= (OS_FLAGS)~flags_rdy;    /* Clear ONLY the flags that we got */
    				}
    				
    				OSTCBCur->OSTCBFlagsRdy = flags_rdy;      /* Save flags that were ready               */
    				OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
    				*perr                   = OS_ERR_NONE;
    				return (flags_rdy);
    			}
    			
    			else                                          /* Block task until events occur or timeout */
    			{
    				OS_FlagBlock (pgrp, &node, flags, wait_type, timeout);
    				OS_EXIT_CRITICAL();
    			}
    			
    			break;
    #if OS_FLAG_WAIT_CLR_EN > 0u
    			
    		case OS_FLAG_WAIT_CLR_ALL:                         /* See if all required flags are cleared    */
    			flags_rdy = (OS_FLAGS)~pgrp->OSFlagFlags & flags;    /* Extract only the bits we want     */
    			
    			if (flags_rdy == flags)                       /* Must match ALL the bits that we want     */
    			{
    				if (consume == OS_TRUE)                   /* See if we need to consume the flags      */
    				{
    					pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we wanted        */
    				}
    				
    				OSTCBCur->OSTCBFlagsRdy = flags_rdy;      /* Save flags that were ready               */
    				OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
    				*perr                   = OS_ERR_NONE;
    				return (flags_rdy);
    			}
    			
    			else                                          /* Block task until events occur or timeout */
    			{
    				OS_FlagBlock (pgrp, &node, flags, wait_type, timeout);
    				OS_EXIT_CRITICAL();
    			}
    			
    			break;
    			
    		case OS_FLAG_WAIT_CLR_ANY:
    			flags_rdy = (OS_FLAGS)~pgrp->OSFlagFlags & flags;   /* Extract only the bits we want      */
    			
    			if (flags_rdy != (OS_FLAGS)0)                 /* See if any flag cleared                  */
    			{
    				if (consume == OS_TRUE)                   /* See if we need to consume the flags      */
    				{
    					pgrp->OSFlagFlags |= flags_rdy;       /* Set ONLY the flags that we got           */
    				}
    				
    				OSTCBCur->OSTCBFlagsRdy = flags_rdy;      /* Save flags that were ready               */
    				OS_EXIT_CRITICAL();                       /* Yes, condition met, return to caller     */
    				*perr                   = OS_ERR_NONE;
    				return (flags_rdy);
    			}
    			
    			else                                          /* Block task until events occur or timeout */
    			{
    				OS_FlagBlock (pgrp, &node, flags, wait_type, timeout);
    				OS_EXIT_CRITICAL();
    			}
    			
    			break;
    #endif
    			
    		default:
    			OS_EXIT_CRITICAL();
    			flags_rdy = (OS_FLAGS)0;
    			*perr      = OS_ERR_FLAG_WAIT_TYPE;
    			return (flags_rdy);
    	}
    	
    	/*$PAGE*/
    	OS_Sched();                                            /* Find next HPT ready to run               */
    	OS_ENTER_CRITICAL();
    	
    	if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK)        /* Have we timed-out or aborted?            */
    	{
    		pend_stat                = OSTCBCur->OSTCBStatPend;
    		OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
    		OS_FlagUnlink (&node);
    		OSTCBCur->OSTCBStat      = OS_STAT_RDY;            /* Yes, make task ready-to-run              */
    		OS_EXIT_CRITICAL();
    		flags_rdy                = (OS_FLAGS)0;
    		
    		switch (pend_stat)
    		{
    			case OS_STAT_PEND_ABORT:
    				*perr = OS_ERR_PEND_ABORT;                /* Indicate that we aborted   waiting       */
    				break;
    				
    			case OS_STAT_PEND_TO:
    			default:
    				*perr = OS_ERR_TIMEOUT;                   /* Indicate that we timed-out waiting       */
    				break;
    		}
    		
    		return (flags_rdy);
    	}
    	
    	flags_rdy = OSTCBCur->OSTCBFlagsRdy;
    	
    	if (consume == OS_TRUE)                                /* See if we need to consume the flags      */
    	{
    		switch (wait_type)
    		{
    			case OS_FLAG_WAIT_SET_ALL:
    			case OS_FLAG_WAIT_SET_ANY:                     /* Clear ONLY the flags we got              */
    				pgrp->OSFlagFlags &= (OS_FLAGS)~flags_rdy;
    				break;
    #if OS_FLAG_WAIT_CLR_EN > 0u
    				
    			case OS_FLAG_WAIT_CLR_ALL:
    			case OS_FLAG_WAIT_CLR_ANY:                     /* Set   ONLY the flags we got              */
    				pgrp->OSFlagFlags |=  flags_rdy;
    				break;
    #endif
    				
    			default:
    				OS_EXIT_CRITICAL();
    				*perr = OS_ERR_FLAG_WAIT_TYPE;
    				return ((OS_FLAGS)0);
    		}
    	}
    	
    	OS_EXIT_CRITICAL();
    	*perr = OS_ERR_NONE;                                   /* Event(s) must have occurred              */
    	return (flags_rdy);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
  • 相关阅读:
    unity2D自制游戏如何写设置按钮的代码
    前端培训丁鹿学堂:前端js中Object常用知识点总结
    六、04【Java 多线程】之并发编程
    CleanMyMac4.11.1中文完整语言版本
    Mybatis 一级缓存和二级缓存原理区别 (图文详解)
    【Acwing并查集】238. 银河英雄传说
    计算机毕业设计选题推荐-掌心办公微信小程序/安卓APP-项目实战
    Ubuntu虚拟机镜像下载及创建
    One class learning(SVDD)
    MC9S12DP512VPVE、MC9S12DT512CPVE HCS12系列 微控制器 16位 闪存 112LQFP
  • 原文地址:https://blog.csdn.net/weixin_45880844/article/details/134405855