git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@121 35acf78f-673a-0410-8e92-d51de3d6d3f4

master
gdisirio 2007-11-30 09:00:50 +00:00
parent f6e46bac2e
commit c303a8a06e
4 changed files with 24 additions and 19 deletions

View File

@ -43,7 +43,10 @@ AVR-AT90CANx-GCC - Port on AVR AT90CAN128, not complete yet.
- Size optimization in the events code, now the chEvtWait() reuses the
chEvtWaitTimeout() code if it is enabled.
- Size optimization in the semaphores code, now the chSemWaitTimeout() just
invokes the chSemWaitTimeoutS() inside its system mutex zone.
invokes the chSemWaitTimeoutS() inside its system mutex zone. Same thing
done with chSemWait() and chSemWaitS().
- Size optimization in the queues code.
- Modified the return type of chSemWait() and chSemWaitS() from void to t_msg.
- Added a threads create/exit/wait benchmark to the test suite, the system
is capable of 81712 threads started/terminated per second on the reference
LPC2148 board. The figure is inclusive of two context switch operations
@ -54,6 +57,8 @@ AVR-AT90CANx-GCC - Port on AVR AT90CAN128, not complete yet.
- Fixed a chEvtWaitTimeout() documentation error.
- Added a new debug switch: CH_USE_TRACE, previously the trace functionality
was associated to the CH_USE_DEBUG switch.
- I am meditating to to make a 1.0.0 release from this version, I am out of
things to do on the kernel...
*** 0.4.2 ***
- Added a minimal ARM7-LPC demo, you can use this one as template in order to

View File

@ -91,11 +91,10 @@ t_msg chIQGet(Queue *qp) {
chSysLock();
chSemWaitS(&qp->q_sem);
if (currp->p_rdymsg < RDY_OK) {
if (chSemWaitS(&qp->q_sem) < RDY_OK) {
chSysUnlock();
return currp->p_rdymsg;
return Q_RESET;
}
b = *qp->q_rdptr++;
if (qp->q_rdptr >= qp->q_top)
@ -324,18 +323,17 @@ void chHDQInit(HalfDuplexQueue *qp, BYTE8 *buffer, t_size size,
* Reads a byte from the receive queue, if the queue is empty or is in
* transmission mode then the invoking thread is suspended.
* @param qp pointer to a \p HalfDuplexQueue structure
* @return the byte value
* @return the byte value or \p Q_RESET if the queue was reset
*/
t_msg chHDQGetReceive(HalfDuplexQueue *qp) {
BYTE8 b;
chSysLock();
chSemWaitS(&qp->hdq_isem);
if (currp->p_rdymsg < RDY_OK) {
if (chSemWaitS(&qp->hdq_isem) < RDY_OK) {
chSysUnlock();
return currp->p_rdymsg;
return Q_RESET;
}
/*
* NOTE: The semaphore can be signaled only if the queue is in

View File

@ -82,33 +82,35 @@ void chSemResetI(Semaphore *sp, t_cnt n) {
/**
* Performs a wait operation on a semaphore.
* @param sp pointer to a \p Semaphore structure
* @return the function can return \p RDY_OK or \p RDY_RESET.
*/
void chSemWait(Semaphore *sp) {
t_msg chSemWait(Semaphore *sp) {
t_msg msg;
chSysLock();
if (--sp->s_cnt < 0) {
fifo_insert(currp, &sp->s_queue);
currp->p_semp = sp;
chSchGoSleepS(PRWTSEM);
}
msg = chSemWaitS(sp);
chSysUnlock();
return msg;
}
/**
* Performs a wait operation on a semaphore.
* @param sp pointer to a \p Semaphore structure
* @return the function can return \p RDY_OK or \p RDY_RESET.
* @note This function must be called with interrupts disabled.
* @note This function cannot be called by an interrupt handler.
*/
void chSemWaitS(Semaphore *sp) {
t_msg chSemWaitS(Semaphore *sp) {
if (--sp->s_cnt < 0) {
fifo_insert(currp, &sp->s_queue);
currp->p_semp = sp;
chSchGoSleepS(PRWTSEM);
return currp->p_rdymsg;
}
return RDY_OK;
}
#ifdef CH_USE_SEMAPHORES_TIMEOUT
@ -126,7 +128,7 @@ static void wakeup(void *p) {
* Performs a wait operation on a semaphore with timeout specification.
* @param sp pointer to a \p Semaphore structure
* @param time the number of ticks before the operation fails
* @return the function can return \p RDY_OK. \p RDY_TIMEOUT or \p RDY_RESET.
* @return the function can return \p RDY_OK, \p RDY_TIMEOUT or \p RDY_RESET.
*/
t_msg chSemWaitTimeout(Semaphore *sp, t_time time) {
t_msg msg;
@ -143,7 +145,7 @@ t_msg chSemWaitTimeout(Semaphore *sp, t_time time) {
* Performs a wait operation on a semaphore with timeout specification.
* @param sp pointer to a \p Semaphore structure
* @param time the number of ticks before the operation fails
* @return the function can return \p RDY_OK. \p RDY_TIMEOUT or \p RDY_RESET.
* @return the function can return \p RDY_OK, \p RDY_TIMEOUT or \p RDY_RESET.
* @note This function must be called with interrupts disabled.
* @note This function cannot be called by an interrupt handler.
* @note The function is available only if the \p CH_USE_SEMAPHORES_TIMEOUT

View File

@ -43,8 +43,8 @@ extern "C" {
void chSemInit(Semaphore *sp, t_cnt n);
void chSemReset(Semaphore *sp, t_cnt n);
void chSemResetI(Semaphore *sp, t_cnt n);
void chSemWait(Semaphore *sp);
void chSemWaitS(Semaphore *sp);
t_msg chSemWait(Semaphore *sp);
t_msg chSemWaitS(Semaphore *sp);
#ifdef CH_USE_SEMAPHORES_TIMEOUT
t_msg chSemWaitTimeout(Semaphore *sp, t_time time);
t_msg chSemWaitTimeoutS(Semaphore *sp, t_time time);