Tentative fix for tickless mode.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7797 35acf78f-673a-0410-8e92-d51de3d6d3f4master
parent
ac82171cfe
commit
775ab02a91
|
@ -6,8 +6,8 @@ Settings: SYSCLK=168, ACR=0x705 (5 wait states)
|
|||
*** ChibiOS/RT test suite
|
||||
***
|
||||
*** Kernel: 3.0.0dev
|
||||
*** Compiled: Dec 11 2014 - 16:38:49
|
||||
*** Compiler: GCC 4.7.3 20130312 (release) [ARM/embedded-4_7-branch revision 196615]
|
||||
*** Compiled: Mar 23 2015 - 11:26:02
|
||||
*** Compiler: GCC 4.7.4 20140401 (release) [ARM/embedded-4_7-branch revision 209195]
|
||||
*** Architecture: ARMv7-ME
|
||||
*** Core Variant: Cortex-M4
|
||||
*** Port Info: Advanced kernel mode
|
||||
|
@ -130,7 +130,7 @@ Settings: SYSCLK=168, ACR=0x705 (5 wait states)
|
|||
--- Result: SUCCESS
|
||||
----------------------------------------------------------------------------
|
||||
--- Test Case 11.10 (Benchmark, virtual timers set/reset)
|
||||
--- Score : 1322832 timers/S
|
||||
--- Score : 1322828 timers/S
|
||||
--- Result: SUCCESS
|
||||
----------------------------------------------------------------------------
|
||||
--- Test Case 11.11 (Benchmark, semaphores wait/signal)
|
||||
|
@ -156,4 +156,3 @@ Settings: SYSCLK=168, ACR=0x705 (5 wait states)
|
|||
----------------------------------------------------------------------------
|
||||
|
||||
Final result: SUCCESS
|
||||
|
||||
|
|
|
@ -494,6 +494,15 @@ static inline void chVTDoTickI(void) {
|
|||
ch.vtlist.vt_next = vtp->vt_next;
|
||||
fn = vtp->vt_func;
|
||||
vtp->vt_func = NULL;
|
||||
|
||||
/* If the list is empty then the timer is stopped.*/
|
||||
if (&ch.vtlist == (virtual_timers_list_t *)ch.vtlist.vt_next) {
|
||||
port_timer_stop_alarm();
|
||||
}
|
||||
|
||||
/* Leaving the system critical zone in order to execute the callback
|
||||
and in order to give a preemption chance to higher priority
|
||||
interrupts.*/
|
||||
chSysUnlockFromISR();
|
||||
|
||||
/* The callback is invoked outside the kernel critical zone.*/
|
||||
|
@ -503,10 +512,11 @@ static inline void chVTDoTickI(void) {
|
|||
of the list.*/
|
||||
chSysLockFromISR();
|
||||
|
||||
/* Next element in the list, if the list is empty then ending the loop.*/
|
||||
/* If the list is empty then ending the loop, the list has to be
|
||||
re-checked because new timers could have been added from within
|
||||
the callback.*/
|
||||
vtp = ch.vtlist.vt_next;
|
||||
if (&ch.vtlist == (virtual_timers_list_t *)vtp) {
|
||||
port_timer_stop_alarm();
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue