/** * Destroys a mailbox. * * @param mbox is the mailbox to be destroyed. */ void sys_mbox_free(sys_mbox_t *mbox) { /* There should not be any messages waiting (if there are it is a bug). If any are waiting, increment the mailbox error count. */ #if RTOS_FREERTOS if(uxQueueMessagesWaiting(mbox->queue) != 0) { #endif /* RTOS_FREERTOS */ #if SYS_STATS STATS_INC(sys.mbox.err); #endif /* SYS_STATS */ } /* Find a semaphore that would be freed. */ u32_t i; for(i = 0; i < SYS_MBOX_MAX; i++) { if(mboxes[i].queue == mbox->queue) { mboxes[i].queue = SYS_MBOX_NULL; vSemaphoreDelete(mbox->queue); mbox->queue = 0; return; } } /* Clear the queue handle. */ mbox->queue = 0; /* Update the mailbox statistics. */ #if SYS_STATS STATS_DEC(sys.mbox.used); #endif /* SYS_STATS */ }
/** * Destroys a mailbox. * * @param mbox is the mailbox to be destroyed. */ void sys_mbox_free(sys_mbox_t mbox) { unsigned portBASE_TYPE count; /* There should not be any messages waiting (if there are it is a bug). If any are waiting, increment the mailbox error count. */ #if RTOS_SAFERTOS if((xQueueMessagesWaiting(mbox->queue, &count) != pdPASS) || (count != 0)) { #elif RTOS_FREERTOS if(uxQueueMessagesWaiting(mbox->queue) != 0) { #endif /* RTOS_SAFERTOS */ #if SYS_STATS STATS_INC(sys.mbox.err); #endif /* SYS_STATS */ } /* Clear the queue handle. */ mbox->queue = 0; /* Update the mailbox statistics. */ #if SYS_STATS STATS_DEC(sys.mbox.used); #endif /* SYS_STATS */ } /** * The routine for a thread. This handles some housekeeping around the * applications's thread routine. * * @param arg is the index into the thread structure for this thread */ static void sys_arch_thread(void *arg) { u32_t i; /* Get this threads index. */ i = (u32_t)arg; /* Call the application's thread routine. */ threads[i].thread(threads[i].arg); /* Free the memory used by this thread's stack. */ mem_free(threads[i].stackstart); /* Clear the stack from the thread structure. */ threads[i].stackstart = NULL; threads[i].stackend = NULL; /* Delete this task. */ #if RTOS_SAFERTOS xTaskDelete(NULL); #elif RTOS_FREERTOS vTaskDelete(NULL); #endif }
/** * Destroys a semaphore. * * @param sem is the semaphore to be destroyed. */ void sys_sem_free(sys_sem_t sem) { /* Clear the queue handle. */ sem->queue = 0; /* Update the semaphore statistics. */ #if SYS_STATS STATS_DEC(sys.sem.used); #endif /* SYS_STATS */ }
/** * Destroys a mailbox. * * @param mbox is the mailbox to be destroyed. */ void sys_mbox_free(sys_mbox_t mbox) { unsigned portBASE_TYPE count; /* There should not be any messages waiting (if there are it is a bug). If any are waiting, increment the mailbox error count. */ if((xQueueMessagesWaiting(mbox->queue, &count) != pdPASS) || (count != 0)) { #if SYS_STATS STATS_INC(sys.mbox.err); #endif /* SYS_STATS */ } /* Clear the queue handle. */ mbox->queue = 0; /* Update the mailbox statistics. */ #if SYS_STATS STATS_DEC(sys.mbox.used); #endif /* SYS_STATS */ }
/** * Destroys a mailbox. * * @param mbox is the mailbox to be destroyed. */ void sys_mbox_free(sys_mbox_t *mbox) { /* There should not be any messages waiting (if there are it is a bug). If any are waiting, increment the mailbox error count. */ #if RTOS_FREERTOS if(uxQueueMessagesWaiting(mbox->queue) != 0) { #endif /* RTOS_FREERTOS */ #if SYS_STATS STATS_INC(sys.mbox.err); #endif /* SYS_STATS */ } /* Clear the queue handle. */ mbox->queue = 0; /* Update the mailbox statistics. */ #if SYS_STATS STATS_DEC(sys.mbox.used); #endif /* SYS_STATS */ }
/** * Destroys a semaphore. * * @param sem is the semaphore to be destroyed. */ void sys_sem_free(sys_sem_t *sem) { /* Find a semaphore that would be freed. */ u32_t i; for(i = 0; i < SYS_SEM_MAX; i++) { if(sems[i].queue == sem->queue) { sems[i].queue = SYS_SEM_NULL; vSemaphoreDelete(sem->queue); sem->queue = 0; return; } } /* Clear the queue handle. */ sem->queue = 0; /* Update the semaphore statistics. */ #if SYS_STATS STATS_DEC(sys.sem.used); #endif /* SYS_STATS */ }