git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@152 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
c69790a0f3
commit
b4f7d8edfe
|
@ -50,6 +50,9 @@ AVR-AT90CANx-GCC - Port on AVR AT90CAN128, not complete yet.
|
||||||
various mechanisms and the correct use cases.
|
various mechanisms and the correct use cases.
|
||||||
- RT Semaphores subsystem removed, the Mutexes implements a better solution
|
- RT Semaphores subsystem removed, the Mutexes implements a better solution
|
||||||
for the same problem.
|
for the same problem.
|
||||||
|
- More performance improvements to the scheduler see the remarks into the
|
||||||
|
chSchWakeupS() function source. The benchmark suite reports a 6% increase
|
||||||
|
in the context switch performance.
|
||||||
- Added mutexes test cases to the test suite.
|
- Added mutexes test cases to the test suite.
|
||||||
- Modified the test suite in order to have each test case to have the same
|
- Modified the test suite in order to have each test case to have the same
|
||||||
alignment enforced on functions. This is done to reduce MAM/Cache alignment
|
alignment enforced on functions. This is done to reduce MAM/Cache alignment
|
||||||
|
|
11
src/chmtx.c
11
src/chmtx.c
|
@ -189,8 +189,15 @@ void chMtxUnlockS(void) {
|
||||||
newprio = mp->m_queue.p_next->p_prio;
|
newprio = mp->m_queue.p_next->p_prio;
|
||||||
mp = mp->m_next;
|
mp = mp->m_next;
|
||||||
}
|
}
|
||||||
currp->p_prio = newprio;
|
if (currp->p_prio == newprio)
|
||||||
chSchWakeupS(tp, RDY_OK);
|
chSchWakeupS(tp, RDY_OK);
|
||||||
|
else {
|
||||||
|
/* Note, changing priority and use chSchWakeupS() is wrong because the
|
||||||
|
internal optimization, see the chSchWakeupS() notes.*/
|
||||||
|
currp->p_prio = newprio;
|
||||||
|
chSchReadyI(tp, RDY_OK);
|
||||||
|
chSchRescheduleS();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
12
src/chschd.c
12
src/chschd.c
|
@ -104,6 +104,8 @@ void chSchGoSleepS(t_tstate newstate) {
|
||||||
* @note The function is not meant to be used in the user code directly.
|
* @note The function is not meant to be used in the user code directly.
|
||||||
* @note It is equivalent to a \p chSchReadyI() followed by a
|
* @note It is equivalent to a \p chSchReadyI() followed by a
|
||||||
* \p chSchRescheduleS() but much more efficient.
|
* \p chSchRescheduleS() but much more efficient.
|
||||||
|
* @note The function assumes that the invoking thread is the highest priority
|
||||||
|
* thread, so you can't use it to change priority and reschedule.
|
||||||
*/
|
*/
|
||||||
void chSchWakeupS(Thread *ntp, t_msg msg) {
|
void chSchWakeupS(Thread *ntp, t_msg msg) {
|
||||||
|
|
||||||
|
@ -111,7 +113,15 @@ void chSchWakeupS(Thread *ntp, t_msg msg) {
|
||||||
chSchReadyI(ntp, msg);
|
chSchReadyI(ntp, msg);
|
||||||
else {
|
else {
|
||||||
Thread *otp = currp;
|
Thread *otp = currp;
|
||||||
chSchReadyI(otp, RDY_OK);
|
/* Optimization, assumes that the invoking thread has the highest priority
|
||||||
|
which is always true unless the priority was willingly changed.
|
||||||
|
This assumption allows us to place the thread always on top of the
|
||||||
|
ready list without have to scan it, free lunch.*/
|
||||||
|
/* chSchReadyI(otp, RDY_OK);*/
|
||||||
|
otp->p_state = PRREADY;
|
||||||
|
otp->p_rdymsg = RDY_OK;
|
||||||
|
otp->p_next = (otp->p_prev = (Thread *)&rlist.r_queue)->p_next;
|
||||||
|
otp->p_next->p_prev = rlist.r_queue.p_next = otp;
|
||||||
(currp = ntp)->p_state = PRCURR;
|
(currp = ntp)->p_state = PRCURR;
|
||||||
ntp->p_rdymsg = msg;
|
ntp->p_rdymsg = msg;
|
||||||
rlist.r_preempt = CH_TIME_QUANTUM;
|
rlist.r_preempt = CH_TIME_QUANTUM;
|
||||||
|
|
Loading…
Reference in New Issue