git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@3946 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
6894617b8e
commit
18b8b49524
|
@ -69,7 +69,9 @@ void buzzInit(void) {
|
||||||
static void stop(void *p) {
|
static void stop(void *p) {
|
||||||
|
|
||||||
StopCounter((TC *)p);
|
StopCounter((TC *)p);
|
||||||
|
chSysLockFromIsr();
|
||||||
chEvtBroadcastI(&BuzzerSilentEventSource);
|
chEvtBroadcastI(&BuzzerSilentEventSource);
|
||||||
|
chSysUnlockFromIsr();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -89,6 +89,7 @@ bool_t sdc_lld_is_write_protected(SDCDriver *sdcp) {
|
||||||
static void tmrfunc(void *p) {
|
static void tmrfunc(void *p) {
|
||||||
SDCDriver *sdcp = p;
|
SDCDriver *sdcp = p;
|
||||||
|
|
||||||
|
chSysLockFromIsr();
|
||||||
if (cnt > 0) {
|
if (cnt > 0) {
|
||||||
if (sdcIsCardInserted(sdcp)) {
|
if (sdcIsCardInserted(sdcp)) {
|
||||||
if (--cnt == 0) {
|
if (--cnt == 0) {
|
||||||
|
@ -105,6 +106,7 @@ static void tmrfunc(void *p) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
chVTSetI(&tmr, MS2ST(SDC_POLLING_DELAY), tmrfunc, sdcp);
|
chVTSetI(&tmr, MS2ST(SDC_POLLING_DELAY), tmrfunc, sdcp);
|
||||||
|
chSysUnlockFromIsr();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -5,8 +5,8 @@ Settings: SYSCLK=80
|
||||||
|
|
||||||
*** ChibiOS/RT test suite
|
*** ChibiOS/RT test suite
|
||||||
***
|
***
|
||||||
*** Kernel: 2.4.0
|
*** Kernel: 2.5.0
|
||||||
*** Compiled: Jan 17 2012 - 14:35:40
|
*** Compiled: Feb 8 2012 - 10:21:46
|
||||||
*** Compiler: GCC 4.4.1
|
*** Compiler: GCC 4.4.1
|
||||||
*** Architecture: Power Architecture
|
*** Architecture: Power Architecture
|
||||||
*** Core Variant: e200z3
|
*** Core Variant: e200z3
|
||||||
|
@ -100,35 +100,35 @@ Settings: SYSCLK=80
|
||||||
--- Result: SUCCESS
|
--- Result: SUCCESS
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
--- Test Case 11.1 (Benchmark, messages #1)
|
--- Test Case 11.1 (Benchmark, messages #1)
|
||||||
--- Score : 283160 msgs/S, 566320 ctxswc/S
|
--- Score : 278226 msgs/S, 556452 ctxswc/S
|
||||||
--- Result: SUCCESS
|
--- Result: SUCCESS
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
--- Test Case 11.2 (Benchmark, messages #2)
|
--- Test Case 11.2 (Benchmark, messages #2)
|
||||||
--- Score : 226208 msgs/S, 452416 ctxswc/S
|
--- Score : 224935 msgs/S, 449870 ctxswc/S
|
||||||
--- Result: SUCCESS
|
--- Result: SUCCESS
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
--- Test Case 11.3 (Benchmark, messages #3)
|
--- Test Case 11.3 (Benchmark, messages #3)
|
||||||
--- Score : 226208 msgs/S, 452416 ctxswc/S
|
--- Score : 224935 msgs/S, 449870 ctxswc/S
|
||||||
--- Result: SUCCESS
|
--- Result: SUCCESS
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
--- Test Case 11.4 (Benchmark, context switch)
|
--- Test Case 11.4 (Benchmark, context switch)
|
||||||
--- Score : 897232 ctxswc/S
|
--- Score : 890960 ctxswc/S
|
||||||
--- Result: SUCCESS
|
--- Result: SUCCESS
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
--- Test Case 11.5 (Benchmark, threads, full cycle)
|
--- Test Case 11.5 (Benchmark, threads, full cycle)
|
||||||
--- Score : 180251 threads/S
|
--- Score : 178638 threads/S
|
||||||
--- Result: SUCCESS
|
--- Result: SUCCESS
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
--- Test Case 11.6 (Benchmark, threads, create only)
|
--- Test Case 11.6 (Benchmark, threads, create only)
|
||||||
--- Score : 261812 threads/S
|
--- Score : 255935 threads/S
|
||||||
--- Result: SUCCESS
|
--- Result: SUCCESS
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
--- Test Case 11.7 (Benchmark, mass reschedule, 5 threads)
|
--- Test Case 11.7 (Benchmark, mass reschedule, 5 threads)
|
||||||
--- Score : 73862 reschedules/S, 443172 ctxswc/S
|
--- Score : 73319 reschedules/S, 439914 ctxswc/S
|
||||||
--- Result: SUCCESS
|
--- Result: SUCCESS
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
--- Test Case 11.8 (Benchmark, round robin context switching)
|
--- Test Case 11.8 (Benchmark, round robin context switching)
|
||||||
--- Score : 614140 ctxswc/S
|
--- Score : 609448 ctxswc/S
|
||||||
--- Result: SUCCESS
|
--- Result: SUCCESS
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
--- Test Case 11.9 (Benchmark, I/O Queues throughput)
|
--- Test Case 11.9 (Benchmark, I/O Queues throughput)
|
||||||
|
@ -136,7 +136,7 @@ Settings: SYSCLK=80
|
||||||
--- Result: SUCCESS
|
--- Result: SUCCESS
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
--- Test Case 11.10 (Benchmark, virtual timers set/reset)
|
--- Test Case 11.10 (Benchmark, virtual timers set/reset)
|
||||||
--- Score : 1093664 timers/S
|
--- Score : 1094200 timers/S
|
||||||
--- Result: SUCCESS
|
--- Result: SUCCESS
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
--- Test Case 11.11 (Benchmark, semaphores wait/signal)
|
--- Test Case 11.11 (Benchmark, semaphores wait/signal)
|
||||||
|
@ -144,11 +144,11 @@ Settings: SYSCLK=80
|
||||||
--- Result: SUCCESS
|
--- Result: SUCCESS
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
--- Test Case 11.12 (Benchmark, mutexes lock/unlock)
|
--- Test Case 11.12 (Benchmark, mutexes lock/unlock)
|
||||||
--- Score : 841236 lock+unlock/S
|
--- Score : 841232 lock+unlock/S
|
||||||
--- Result: SUCCESS
|
--- Result: SUCCESS
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
--- Test Case 11.13 (Benchmark, RAM footprint)
|
--- Test Case 11.13 (Benchmark, RAM footprint)
|
||||||
--- System: 768 bytes
|
--- System: 764 bytes
|
||||||
--- Thread: 72 bytes
|
--- Thread: 72 bytes
|
||||||
--- Timer : 20 bytes
|
--- Timer : 20 bytes
|
||||||
--- Semaph: 12 bytes
|
--- Semaph: 12 bytes
|
||||||
|
|
|
@ -167,8 +167,10 @@ static void i2c_lld_safety_timeout(void *p) {
|
||||||
|
|
||||||
if (i2cp->thread) {
|
if (i2cp->thread) {
|
||||||
i2c_lld_abort_operation(i2cp);
|
i2c_lld_abort_operation(i2cp);
|
||||||
|
chSysLockFromIsr();
|
||||||
i2cp->thread->p_u.rdymsg = RDY_TIMEOUT;
|
i2cp->thread->p_u.rdymsg = RDY_TIMEOUT;
|
||||||
chSchReadyI(i2cp->thread);
|
chSchReadyI(i2cp->thread);
|
||||||
|
chSysUnlockFromIsr();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -105,6 +105,7 @@ static uint8_t crc7(uint8_t crc, const uint8_t *buffer, size_t len) {
|
||||||
static void tmrfunc(void *p) {
|
static void tmrfunc(void *p) {
|
||||||
MMCDriver *mmcp = p;
|
MMCDriver *mmcp = p;
|
||||||
|
|
||||||
|
chSysLockFromIsr();
|
||||||
if (mmcp->cnt > 0) {
|
if (mmcp->cnt > 0) {
|
||||||
if (mmcp->is_inserted()) {
|
if (mmcp->is_inserted()) {
|
||||||
if (--mmcp->cnt == 0) {
|
if (--mmcp->cnt == 0) {
|
||||||
|
@ -123,6 +124,7 @@ static void tmrfunc(void *p) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
chVTSetI(&mmcp->vt, MS2ST(MMC_POLLING_DELAY), tmrfunc, mmcp);
|
chVTSetI(&mmcp->vt, MS2ST(MMC_POLLING_DELAY), tmrfunc, mmcp);
|
||||||
|
chSysUnlockFromIsr();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -55,7 +55,8 @@
|
||||||
*
|
*
|
||||||
* @api
|
* @api
|
||||||
*/
|
*/
|
||||||
#define MS2ST(msec) ((systime_t)(((((msec) - 1L) * CH_FREQUENCY) / 1000L) + 1L))
|
#define MS2ST(msec) ((systime_t)(((((msec) - 1L) * CH_FREQUENCY) / \
|
||||||
|
1000L) + 1L))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Microseconds to system ticks.
|
* @brief Microseconds to system ticks.
|
||||||
|
@ -67,7 +68,8 @@
|
||||||
*
|
*
|
||||||
* @api
|
* @api
|
||||||
*/
|
*/
|
||||||
#define US2ST(usec) ((systime_t)(((((usec) - 1L) * CH_FREQUENCY) / 1000000L) + 1L))
|
#define US2ST(usec) ((systime_t)(((((usec) - 1L) * CH_FREQUENCY) / \
|
||||||
|
1000000L) + 1L))
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -112,14 +114,16 @@ typedef struct {
|
||||||
volatile systime_t vt_systime; /**< @brief System Time counter. */
|
volatile systime_t vt_systime; /**< @brief System Time counter. */
|
||||||
} VTList;
|
} VTList;
|
||||||
|
|
||||||
extern VTList vtlist;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Macro Functions
|
* @name Macro Functions
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
/**
|
/**
|
||||||
* @brief Virtual timers ticker.
|
* @brief Virtual timers ticker.
|
||||||
|
* @note The system lock is released before entering the callback and
|
||||||
|
* re-acquired immediately after. It is callback's responsibility
|
||||||
|
* to acquire the lock if needed. This is done in order to reduce
|
||||||
|
* interrupts jitter when many timers are in use.
|
||||||
*
|
*
|
||||||
* @iclass
|
* @iclass
|
||||||
*/
|
*/
|
||||||
|
@ -134,18 +138,60 @@ extern VTList vtlist;
|
||||||
vtp->vt_func = (vtfunc_t)NULL; \
|
vtp->vt_func = (vtfunc_t)NULL; \
|
||||||
vtp->vt_next->vt_prev = (void *)&vtlist; \
|
vtp->vt_next->vt_prev = (void *)&vtlist; \
|
||||||
(&vtlist)->vt_next = vtp->vt_next; \
|
(&vtlist)->vt_next = vtp->vt_next; \
|
||||||
|
chSysUnlockFromIsr(); \
|
||||||
fn(vtp->vt_par); \
|
fn(vtp->vt_par); \
|
||||||
|
chSysLockFromIsr(); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Returns TRUE if the speciified timer is armed.
|
* @brief Returns @p TRUE if the specified timer is armed.
|
||||||
*
|
*
|
||||||
* @iclass
|
* @iclass
|
||||||
*/
|
*/
|
||||||
#define chVTIsArmedI(vtp) ((vtp)->vt_func != NULL)
|
#define chVTIsArmedI(vtp) ((vtp)->vt_func != NULL)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables a virtual timer.
|
||||||
|
* @note The associated function is invoked from interrupt context.
|
||||||
|
*
|
||||||
|
* @param[out] vtp the @p VirtualTimer structure pointer
|
||||||
|
* @param[in] time the number of ticks before the operation timeouts, the
|
||||||
|
* special values are handled as follow:
|
||||||
|
* - @a TIME_INFINITE is allowed but interpreted as a
|
||||||
|
* normal time specification.
|
||||||
|
* - @a TIME_IMMEDIATE this value is not allowed.
|
||||||
|
* .
|
||||||
|
* @param[in] vtfunc the timer callback function. After invoking the
|
||||||
|
* callback the timer is disabled and the structure can
|
||||||
|
* be disposed or reused.
|
||||||
|
* @param[in] par a parameter that will be passed to the callback
|
||||||
|
* function
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
#define chVTSet(vtp, time, vtfunc, par) { \
|
||||||
|
chSysLock(); \
|
||||||
|
chVTSetI(vtp, time, vtfunc, par); \
|
||||||
|
chSysUnlock(); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disables a Virtual Timer.
|
||||||
|
* @note The timer is first checked and disabled only if armed.
|
||||||
|
*
|
||||||
|
* @param[in] vtp the @p VirtualTimer structure pointer
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
#define chVTReset(vtp) { \
|
||||||
|
chSysLock(); \
|
||||||
|
if (chVTIsArmedI(vtp)) \
|
||||||
|
chVTResetI(vtp); \
|
||||||
|
chSysUnlock(); \
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Current system time.
|
* @brief Current system time.
|
||||||
* @details Returns the number of system ticks since the @p chSysInit()
|
* @details Returns the number of system ticks since the @p chSysInit()
|
||||||
|
@ -153,13 +199,15 @@ extern VTList vtlist;
|
||||||
* @note The counter can reach its maximum and then restart from zero.
|
* @note The counter can reach its maximum and then restart from zero.
|
||||||
* @note This function is designed to work with the @p chThdSleepUntil().
|
* @note This function is designed to work with the @p chThdSleepUntil().
|
||||||
*
|
*
|
||||||
* @return The system time in ticks.r
|
* @return The system time in ticks.
|
||||||
*
|
*
|
||||||
* @api
|
* @api
|
||||||
*/
|
*/
|
||||||
#define chTimeNow() (vtlist.vt_systime)
|
#define chTimeNow() (vtlist.vt_systime)
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
|
extern VTList vtlist;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Virtual Timers APIs.
|
* Virtual Timers APIs.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -127,10 +127,12 @@ void chSchGoSleepS(tstate_t newstate) {
|
||||||
static void wakeup(void *p) {
|
static void wakeup(void *p) {
|
||||||
Thread *tp = (Thread *)p;
|
Thread *tp = (Thread *)p;
|
||||||
|
|
||||||
|
chSysLockFromIsr();
|
||||||
switch (tp->p_state) {
|
switch (tp->p_state) {
|
||||||
case THD_STATE_READY:
|
case THD_STATE_READY:
|
||||||
/* Handling the special case where the thread has been made ready by
|
/* Handling the special case where the thread has been made ready by
|
||||||
another thread with higher priority.*/
|
another thread with higher priority.*/
|
||||||
|
chSysUnlockFromIsr();
|
||||||
return;
|
return;
|
||||||
#if CH_USE_SEMAPHORES || CH_USE_QUEUES || \
|
#if CH_USE_SEMAPHORES || CH_USE_QUEUES || \
|
||||||
(CH_USE_CONDVARS && CH_USE_CONDVARS_TIMEOUT)
|
(CH_USE_CONDVARS && CH_USE_CONDVARS_TIMEOUT)
|
||||||
|
@ -151,6 +153,7 @@ static void wakeup(void *p) {
|
||||||
}
|
}
|
||||||
tp->p_u.rdymsg = RDY_TIMEOUT;
|
tp->p_u.rdymsg = RDY_TIMEOUT;
|
||||||
chSchReadyI(tp);
|
chSchReadyI(tp);
|
||||||
|
chSysUnlockFromIsr();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -49,8 +49,7 @@ void _vt_init(void) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Enables a virtual timer.
|
* @brief Enables a virtual timer.
|
||||||
* @note The associated function is invoked by an interrupt handler within
|
* @note The associated function is invoked from interrupt context.
|
||||||
* the I-Locked state, see @ref system_states.
|
|
||||||
*
|
*
|
||||||
* @param[out] vtp the @p VirtualTimer structure pointer
|
* @param[out] vtp the @p VirtualTimer structure pointer
|
||||||
* @param[in] time the number of ticks before the operation timeouts, the
|
* @param[in] time the number of ticks before the operation timeouts, the
|
||||||
|
|
|
@ -32,8 +32,10 @@
|
||||||
static void tmrcb(void *p) {
|
static void tmrcb(void *p) {
|
||||||
EvTimer *etp = p;
|
EvTimer *etp = p;
|
||||||
|
|
||||||
|
chSysLockFromIsr();
|
||||||
chEvtBroadcastI(&etp->et_es);
|
chEvtBroadcastI(&etp->et_es);
|
||||||
chVTSetI(&etp->et_vt, etp->et_interval, tmrcb, etp);
|
chVTSetI(&etp->et_vt, etp->et_interval, tmrcb, etp);
|
||||||
|
chSysUnlockFromIsr();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -60,12 +62,7 @@ void evtStart(EvTimer *etp) {
|
||||||
*/
|
*/
|
||||||
void evtStop(EvTimer *etp) {
|
void evtStop(EvTimer *etp) {
|
||||||
|
|
||||||
chSysLock();
|
chVTReset(&etp->et_vt);
|
||||||
|
|
||||||
if (chVTIsArmedI(&etp->et_vt))
|
|
||||||
chVTResetI(&etp->et_vt);
|
|
||||||
|
|
||||||
chSysUnlock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
|
@ -93,6 +93,9 @@
|
||||||
- NEW: Revision of the round-robin scheduling, now threads do not lose their
|
- NEW: Revision of the round-robin scheduling, now threads do not lose their
|
||||||
time slice when preempted. Each thread has its own time slices counter.
|
time slice when preempted. Each thread has its own time slices counter.
|
||||||
TODO: Seek optimizations.
|
TODO: Seek optimizations.
|
||||||
|
- NEW: Modified the Virtual Timers management, now the callback is invoked
|
||||||
|
not in lock mode. This change reduces the interrupt jitter caused by
|
||||||
|
multiple timers used at same time.
|
||||||
|
|
||||||
*** 2.3.5 ***
|
*** 2.3.5 ***
|
||||||
- FIX: Fixed RTC compile problem on STM32F103 (bug 3468445).
|
- FIX: Fixed RTC compile problem on STM32F103 (bug 3468445).
|
||||||
|
|
|
@ -278,9 +278,7 @@ void test_start_timer(unsigned ms) {
|
||||||
|
|
||||||
systime_t duration = MS2ST(ms);
|
systime_t duration = MS2ST(ms);
|
||||||
test_timer_done = FALSE;
|
test_timer_done = FALSE;
|
||||||
chSysLock();
|
chVTSet(&vt, duration, tmr, NULL);
|
||||||
chVTSetI(&vt, duration, tmr, NULL);
|
|
||||||
chSysUnlock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -26,7 +26,10 @@ static VirtualTimer vt1, vt2;
|
||||||
static void restart(void *p) {
|
static void restart(void *p) {
|
||||||
|
|
||||||
(void)p;
|
(void)p;
|
||||||
|
|
||||||
|
chSysLockFromIsr();
|
||||||
uartStartSendI(&UARTD2, 14, "Hello World!\r\n");
|
uartStartSendI(&UARTD2, 14, "Hello World!\r\n");
|
||||||
|
chSysUnlockFromIsr();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ledoff(void *p) {
|
static void ledoff(void *p) {
|
||||||
|
|
|
@ -26,7 +26,10 @@ static VirtualTimer vt1, vt2;
|
||||||
static void restart(void *p) {
|
static void restart(void *p) {
|
||||||
|
|
||||||
(void)p;
|
(void)p;
|
||||||
|
|
||||||
|
chSysLockFromIsr();
|
||||||
uartStartSendI(&UARTD2, 14, "Hello World!\r\n");
|
uartStartSendI(&UARTD2, 14, "Hello World!\r\n");
|
||||||
|
chSysUnlockFromIsr();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ledoff(void *p) {
|
static void ledoff(void *p) {
|
||||||
|
|
|
@ -26,7 +26,10 @@ static VirtualTimer vt1, vt2;
|
||||||
static void restart(void *p) {
|
static void restart(void *p) {
|
||||||
|
|
||||||
(void)p;
|
(void)p;
|
||||||
|
|
||||||
|
chSysLockFromIsr();
|
||||||
uartStartSendI(&UARTD1, 14, "Hello World!\r\n");
|
uartStartSendI(&UARTD1, 14, "Hello World!\r\n");
|
||||||
|
chSysUnlockFromIsr();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ledoff(void *p) {
|
static void ledoff(void *p) {
|
||||||
|
|
4
todo.txt
4
todo.txt
|
@ -13,8 +13,8 @@ X SDC driver port to STM32F2 and STM32F4.
|
||||||
|
|
||||||
Within 2.5.x:
|
Within 2.5.x:
|
||||||
* Revision of scheduling strategy for threads at equal priority.
|
* Revision of scheduling strategy for threads at equal priority.
|
||||||
- Handling of Virtual Timer callbacks out of critical zone.
|
* Handling of Virtual Timer callbacks out of critical zone.
|
||||||
- Add normal API (not iclass) variants of the VT functions.
|
* Add normal API (not iclass) variants of the VT functions.
|
||||||
- Add the RTC service inside the kernel and port, remove from HAL.
|
- Add the RTC service inside the kernel and port, remove from HAL.
|
||||||
- Add option to use the RTC counter instead of the systick counter into the
|
- Add option to use the RTC counter instead of the systick counter into the
|
||||||
trace buffer.
|
trace buffer.
|
||||||
|
|
Loading…
Reference in New Issue