From fa64f08fc1ad45d0984828695697f6abde7e8ffd Mon Sep 17 00:00:00 2001 From: gdisirio Date: Tue, 23 Jul 2013 13:51:02 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@6024 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/ARMCM4-STM32F303-DISCOVERY/chconf.h | 8 +++--- demos/ARMCM4-STM32F303-DISCOVERY/main.c | 31 ++++++++++++++++++++++- os/hal/platforms/STM32F30x/hal_lld.c | 6 +++++ os/kernel/include/chvt.h | 15 ++++++++--- os/ports/GCC/ARMCMx/STM32F3xx/chtimer.c | 2 +- os/ports/GCC/ARMCMx/chcore_v7m.c | 2 ++ 6 files changed, 54 insertions(+), 10 deletions(-) diff --git a/demos/ARMCM4-STM32F303-DISCOVERY/chconf.h b/demos/ARMCM4-STM32F303-DISCOVERY/chconf.h index 087f18295..a2fa7a697 100644 --- a/demos/ARMCM4-STM32F303-DISCOVERY/chconf.h +++ b/demos/ARMCM4-STM32F303-DISCOVERY/chconf.h @@ -414,12 +414,12 @@ * @details If enabled then a field is added to the @p thread_t structure that * counts the system ticks occurred while executing the thread. * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. + * @note The default is @p FALSE. + * @note This debug option is not currently compatible with the + * tickless mode. */ #if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE +#define CH_DBG_THREADS_PROFILING FALSE #endif /** @} */ diff --git a/demos/ARMCM4-STM32F303-DISCOVERY/main.c b/demos/ARMCM4-STM32F303-DISCOVERY/main.c index a72c1a72c..ed10165af 100644 --- a/demos/ARMCM4-STM32F303-DISCOVERY/main.c +++ b/demos/ARMCM4-STM32F303-DISCOVERY/main.c @@ -18,6 +18,7 @@ #include "hal.h" #include "test.h" +#if 0 /* * This is a periodic thread that does absolutely nothing except flashing LEDs. */ @@ -53,6 +54,33 @@ static msg_t Thread1(void *arg) { palClearPad(GPIOE, GPIOE_LED4_BLUE); } } +#endif + +static WORKING_AREA(waThread1, 128); +static msg_t Thread1(void *arg) { + + (void)arg; + chRegSetThreadName("blinker1"); + while (TRUE) { + palSetPad(GPIOE, GPIOE_LED3_RED); + chThdSleepMilliseconds(250); + palClearPad(GPIOE, GPIOE_LED3_RED); + chThdSleepMilliseconds(250); + } +} + +static WORKING_AREA(waThread2, 128); +static msg_t Thread2(void *arg) { + + (void)arg; + chRegSetThreadName("blinker2"); + while (TRUE) { + palSetPad(GPIOE, GPIOE_LED4_BLUE); + chThdSleepMilliseconds(500); + palClearPad(GPIOE, GPIOE_LED4_BLUE); + chThdSleepMilliseconds(500); + } +} /* * Application entry point. @@ -80,7 +108,8 @@ int main(void) { /* * Creates the example thread. */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); + chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO+1, Thread1, NULL); + chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO+2, Thread2, NULL); /* * Normal main() thread activity, in this demo it does nothing except diff --git a/os/hal/platforms/STM32F30x/hal_lld.c b/os/hal/platforms/STM32F30x/hal_lld.c index 64b691ade..fcfbd4d10 100644 --- a/os/hal/platforms/STM32F30x/hal_lld.c +++ b/os/hal/platforms/STM32F30x/hal_lld.c @@ -103,12 +103,18 @@ void hal_lld_init(void) { rccResetAPB1(0xFFFFFFFF); rccResetAPB2(0xFFFFFFFF); +#if CH_CFG_TIMEDELTA == 0 /* SysTick initialization using the system clock.*/ SysTick->LOAD = STM32_HCLK / CH_CFG_FREQUENCY - 1; SysTick->VAL = 0; SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk; +#else + rccEnableAPB1(RCC_APB1ENR_TIM2EN, TRUE); + nvicEnableVector(28, CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_SYSTICK)); + TIM2->PSC = STM32_TIMCLK2 / CH_CFG_FREQUENCY - 1; +#endif /* DWT cycle counter enable.*/ SCS_DEMCR |= SCS_DEMCR_TRCENA; diff --git a/os/kernel/include/chvt.h b/os/kernel/include/chvt.h index 2c4b489d5..d1659d286 100644 --- a/os/kernel/include/chvt.h +++ b/os/kernel/include/chvt.h @@ -41,6 +41,14 @@ /* Derived constants and error checks. */ /*===========================================================================*/ +#if CH_CFG_FREQUENCY <= 0 +#error "invalid CH_CFG_FREQUENCY specified" +#endif + +#if (CH_CFG_TIMEDELTA < 0) || (CH_CFG_TIMEDELTA == 1) +#error "invalid NIL_CFG_TIMEDELTA specified" +#endif + /*===========================================================================*/ /* Module data structures and types. */ /*===========================================================================*/ @@ -387,6 +395,8 @@ static inline void chVTDoTickI(void) { systime_t delta = now - vtlist.vt_lasttime; while ((vtp = vtlist.vt_next)->vt_delta <= delta) { + delta -= vtp->vt_delta; + vtlist.vt_lasttime += vtp->vt_delta; vtfunc_t fn = vtp->vt_func; vtp->vt_func = (vtfunc_t)NULL; vtp->vt_next->vt_prev = (void *)&vtlist; @@ -401,10 +411,7 @@ static inline void chVTDoTickI(void) { port_timer_stop_alarm(); } else { - /* The delta is subtracted to the next list element, the current time - becomes the new delta list base time.*/ - vtp->vt_delta -= delta; - vtlist.vt_lasttime = now; + /* Updating the alarm to the next deadline.*/ port_timer_set_alarm(now + vtp->vt_delta); } #endif /* CH_CFG_TIMEDELTA > 0 */ diff --git a/os/ports/GCC/ARMCMx/STM32F3xx/chtimer.c b/os/ports/GCC/ARMCMx/STM32F3xx/chtimer.c index 5cb8d8c75..78d2aaf06 100644 --- a/os/ports/GCC/ARMCMx/STM32F3xx/chtimer.c +++ b/os/ports/GCC/ARMCMx/STM32F3xx/chtimer.c @@ -53,7 +53,7 @@ * * @isr */ -CH_IRQ_HANDLER(Vector7C) { +CH_IRQ_HANDLER(VectorB0) { CH_IRQ_PROLOGUE(); diff --git a/os/ports/GCC/ARMCMx/chcore_v7m.c b/os/ports/GCC/ARMCMx/chcore_v7m.c index dfe2e2d5a..23554935a 100644 --- a/os/ports/GCC/ARMCMx/chcore_v7m.c +++ b/os/ports/GCC/ARMCMx/chcore_v7m.c @@ -124,6 +124,8 @@ void _port_init(void) { #if CH_CFG_TIMEDELTA == 0 nvicSetSystemHandlerPriority(HANDLER_SYSTICK, CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_SYSTICK)); +#else + port_timer_init(); #endif }