|
QP/C
|
00001 /***************************************************************************** 00002 * Product: QF/C 00003 * Last Updated for Version: 4.4.00 00004 * Date of the Last Update: Jan 14, 2012 00005 * 00006 * Q u a n t u m L e a P s 00007 * --------------------------- 00008 * innovating embedded systems 00009 * 00010 * Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved. 00011 * 00012 * This software may be distributed and modified under the terms of the GNU 00013 * General Public License version 2 (GPL) as published by the Free Software 00014 * Foundation and appearing in the file GPL.TXT included in the packaging of 00015 * this file. Please note that GPL Section 2[b] requires that all works based 00016 * on this software must also be made publicly available under the terms of 00017 * the GPL ("Copyleft"). 00018 * 00019 * Alternatively, this software may be distributed and modified under the 00020 * terms of Quantum Leaps commercial licenses, which expressly supersede 00021 * the GPL and are specifically designed for licensees interested in 00022 * retaining the proprietary status of their code. 00023 * 00024 * Contact information: 00025 * Quantum Leaps Web site: http://www.quantum-leaps.com 00026 * e-mail: info@quantum-leaps.com 00027 *****************************************************************************/ 00028 #include "qf_pkg.h" 00029 #include "qassert.h" 00030 00031 Q_DEFINE_THIS_MODULE("qa_get_") 00032 00033 00042 /*..........................................................................*/ 00043 QEvent const *QActive_get_(QActive *me) { 00044 QEvent const *e; 00045 QF_CRIT_STAT_ 00046 QF_CRIT_ENTRY_(); 00047 00048 QACTIVE_EQUEUE_WAIT_(me); /* wait for event to arrive directly */ 00049 00050 e = me->eQueue.frontEvt; 00051 00052 if (me->eQueue.nFree != me->eQueue.end) { /* any events in the buffer? */ 00053 /* remove event from the tail */ 00054 me->eQueue.frontEvt = QF_PTR_AT_(me->eQueue.ring, me->eQueue.tail); 00055 if (me->eQueue.tail == (QEQueueCtr)0) { /* need to wrap the tail? */ 00056 me->eQueue.tail = me->eQueue.end; /* wrap around */ 00057 } 00058 --me->eQueue.tail; 00059 00060 ++me->eQueue.nFree; /* one more free event in the ring buffer */ 00061 00062 QS_BEGIN_NOCRIT_(QS_QF_ACTIVE_GET, QS_aoObj_, me) 00063 QS_TIME_(); /* timestamp */ 00064 QS_SIG_(e->sig); /* the signal of this event */ 00065 QS_OBJ_(me); /* this active object */ 00066 QS_U8_(QF_EVT_POOL_ID_(e)); /* the pool Id of the event */ 00067 QS_U8_(QF_EVT_REF_CTR_(e)); /* the ref count of the event */ 00068 QS_EQC_(me->eQueue.nFree); /* number of free entries */ 00069 QS_END_NOCRIT_() 00070 } 00071 else { 00072 me->eQueue.frontEvt = (QEvent *)0; /* queue becomes empty */ 00073 QACTIVE_EQUEUE_ONEMPTY_(me); 00074 00075 QS_BEGIN_NOCRIT_(QS_QF_ACTIVE_GET_LAST, QS_aoObj_, me) 00076 QS_TIME_(); /* timestamp */ 00077 QS_SIG_(e->sig); /* the signal of this event */ 00078 QS_OBJ_(me); /* this active object */ 00079 QS_U8_(QF_EVT_POOL_ID_(e)); /* the pool Id of the event */ 00080 QS_U8_(QF_EVT_REF_CTR_(e)); /* the ref count of the event */ 00081 QS_END_NOCRIT_() 00082 } 00083 QF_CRIT_EXIT_(); 00084 return e; 00085 } 00086 /*..........................................................................*/ 00087 uint32_t QF_getQueueMargin(uint8_t prio) { 00088 uint32_t margin; 00089 QF_CRIT_STAT_ 00090 00091 Q_REQUIRE((prio <= (uint8_t)QF_MAX_ACTIVE) 00092 && (QF_active_[prio] != (QActive *)0)); 00093 00094 QF_CRIT_ENTRY_(); 00095 margin = (uint32_t)QF_active_[prio]->eQueue.nMin; 00096 QF_CRIT_EXIT_(); 00097 00098 return margin; 00099 }
1.7.6.1