Description
Deletes a semaphore. This function should be used with care as multiple tasks may rely on the presence of the semaphore. Generally speaking, before deleting a semaphore, first delete all the tasks that access the semaphore. As a rule, it is highly recommended to not delete kernel objects at run time.
Deleting the semaphore will not de-allocate the object. In other words, storage for the variable will still remain at the same location unless the semaphore is allocated dynamically from the heap. The dynamic allocation of objects has its own set of problems. Specifically, it is not recommended for embedded systems to allocate (and de-allocate) objects from the heap given the high likelihood of fragmentation.
Files
os.h/os_sem.c
Prototype
Code Block |
---|
OS_OBJ_QTY OSSemDel (OS_SEM *p_sem,
OS_OPT opt,
OS_ERR *p_err) |
Arguments
p_sem
is a pointer to the semaphore.
...
If OS_CFG_CALLED_FROM_ISR_CHK_EN
set to 1
in DEF_ENABLED
in os_cfg.h
: if attempting to delete the semaphore from an ISR.
OS_ERR_ILLEGAL_DEL_RUN_TIME
If OS_SAFETY_CRITICAL_IEC61508
is defined: you called this after calling OSStart()
and thus you are no longer allowed to delete kernel objects.
OS_ERR_OBJ_PTR_NULL
If OS_CFG_ARG_CHK_EN
is set to 1
in DEF_ENABLED
in os_cfg.h
: if p_sem
is a NULL
pointer.
...
If OS_CFG_OBJ_TYPE_CHK_EN
is set to 1
in DEF_ENABLED
in os_cfg.h
: if p_sem
is not pointing to a semaphore.
...
If OS_CFG_ARG_CHK_EN
is set to 1
in DEF_ENABLED
in os_cfg.h
: if one of the two options mentioned in the opt
argument is not specified.
OS_ERR_OS_NOT_RUNNING
If OS_CFG_INVALID_OS_CALLS_CHK_EN
is set to DEF_ENABLED
in os_cfg.h
: if µC/OS-III is not running yet.
OS_ERR_TASK_WAITING
If one or more tasks are waiting on the semaphore.
Returned Value
NoneThe number of tasks made ready-to-run by this function. Zero either indicates an error or that no tasks were pending on the semaphore.
Required Configuration
OS_CFG_SEM_EN
AND and OS_CFG_SEM_DEL_EN
must be enabled in os_cfg.h
. Refer to uCµC-OS-III Configuration Manual.
Callers
Application.
Notes/Warnings
- Use this call with care because other tasks might expect the presence of the semaphore.
Example Usage
Code Block | ||
---|---|---|
| ||
OS_SEM SwSem;
void Task (void *p_arg)
{
OS_ERR err;
OS_OBJ_QTY qty;
(void)&p_arg;
while (DEF_ON) {
:
:
qty = OSSemDel(&SwSem,
OS_OPT_DEL_ALWAYS,
&err);
/* Check "err" */
:
:
}
} |