Merge pull request #777 from atiselsts/msp430f5xxx_timing_fixes
Fix time accounting on msp430 Series 5 MCU based platforms
This commit is contained in:
commit
97037763ad
|
@ -41,12 +41,26 @@
|
||||||
|
|
||||||
#define MAX_TICKS (~((clock_time_t)0) / 2)
|
#define MAX_TICKS (~((clock_time_t)0) / 2)
|
||||||
|
|
||||||
|
#define CLOCK_LT(a, b) ((int16_t)((a)-(b)) < 0)
|
||||||
|
|
||||||
static volatile unsigned long seconds;
|
static volatile unsigned long seconds;
|
||||||
|
|
||||||
static volatile clock_time_t count = 0;
|
static volatile clock_time_t count = 0;
|
||||||
/* last_tar is used for calculating clock_fine, last_ccr might be better? */
|
/* last_tar is used for calculating clock_fine, last_ccr might be better? */
|
||||||
static volatile uint16_t last_tar = 0;
|
static volatile uint16_t last_tar = 0;
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static inline uint16_t
|
||||||
|
read_tar(void)
|
||||||
|
{
|
||||||
|
/* Same as clock_counter(), but can be inlined */
|
||||||
|
uint16_t t1, t2;
|
||||||
|
do {
|
||||||
|
t1 = TA1R;
|
||||||
|
t2 = TA1R;
|
||||||
|
} while(t1 != t2);
|
||||||
|
return t1;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
ISR(TIMER1_A1, timera1)
|
ISR(TIMER1_A1, timera1)
|
||||||
{
|
{
|
||||||
ENERGEST_ON(ENERGEST_TYPE_IRQ);
|
ENERGEST_ON(ENERGEST_TYPE_IRQ);
|
||||||
|
@ -59,8 +73,9 @@ ISR(TIMER1_A1, timera1)
|
||||||
* Occurs when timer state is toggled between STOP and CONT. */
|
* Occurs when timer state is toggled between STOP and CONT. */
|
||||||
while(TA1CTL & MC1 && TA1CCR1 - TA1R == 1);
|
while(TA1CTL & MC1 && TA1CCR1 - TA1R == 1);
|
||||||
|
|
||||||
|
last_tar = read_tar();
|
||||||
/* Make sure interrupt time is future */
|
/* Make sure interrupt time is future */
|
||||||
do {
|
while(!CLOCK_LT(last_tar, TA1CCR1)) {
|
||||||
TA1CCR1 += INTERVAL;
|
TA1CCR1 += INTERVAL;
|
||||||
++count;
|
++count;
|
||||||
|
|
||||||
|
@ -76,9 +91,8 @@ ISR(TIMER1_A1, timera1)
|
||||||
++seconds;
|
++seconds;
|
||||||
energest_flush();
|
energest_flush();
|
||||||
}
|
}
|
||||||
} while((TA1CCR1 - TA1R) > INTERVAL);
|
last_tar = read_tar();
|
||||||
|
}
|
||||||
last_tar = TA1R;
|
|
||||||
|
|
||||||
if(etimer_pending() &&
|
if(etimer_pending() &&
|
||||||
(etimer_next_expiration_time() - count - 1) > MAX_TICKS) {
|
(etimer_next_expiration_time() - count - 1) > MAX_TICKS) {
|
||||||
|
|
|
@ -43,12 +43,26 @@
|
||||||
|
|
||||||
#define MAX_TICKS (~((clock_time_t)0) / 2)
|
#define MAX_TICKS (~((clock_time_t)0) / 2)
|
||||||
|
|
||||||
|
#define CLOCK_LT(a, b) ((int16_t)((a)-(b)) < 0)
|
||||||
|
|
||||||
static volatile unsigned long seconds;
|
static volatile unsigned long seconds;
|
||||||
|
|
||||||
static volatile clock_time_t count = 0;
|
static volatile clock_time_t count = 0;
|
||||||
/* last_tar is used for calculating clock_fine, last_ccr might be better? */
|
/* last_tar is used for calculating clock_fine, last_ccr might be better? */
|
||||||
static unsigned short last_tar = 0;
|
static unsigned short last_tar = 0;
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static inline uint16_t
|
||||||
|
read_tar(void)
|
||||||
|
{
|
||||||
|
/* Same as clock_counter(), but can be inlined */
|
||||||
|
uint16_t t1, t2;
|
||||||
|
do {
|
||||||
|
t1 = TA1R;
|
||||||
|
t2 = TA1R;
|
||||||
|
} while(t1 != t2);
|
||||||
|
return t1;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
ISR(TIMER1_A1, timera1)
|
ISR(TIMER1_A1, timera1)
|
||||||
{
|
{
|
||||||
ENERGEST_ON(ENERGEST_TYPE_IRQ);
|
ENERGEST_ON(ENERGEST_TYPE_IRQ);
|
||||||
|
@ -59,8 +73,9 @@ ISR(TIMER1_A1, timera1)
|
||||||
* Occurrs when timer state is toggled between STOP and CONT. */
|
* Occurrs when timer state is toggled between STOP and CONT. */
|
||||||
while(TA1CTL & MC1 && TA1CCR1 - TA1R == 1);
|
while(TA1CTL & MC1 && TA1CCR1 - TA1R == 1);
|
||||||
|
|
||||||
|
last_tar = read_tar();
|
||||||
/* Make sure interrupt time is future */
|
/* Make sure interrupt time is future */
|
||||||
do {
|
while(!CLOCK_LT(last_tar, TA1CCR1)) {
|
||||||
/* TACTL &= ~MC1;*/
|
/* TACTL &= ~MC1;*/
|
||||||
TA1CCR1 += INTERVAL;
|
TA1CCR1 += INTERVAL;
|
||||||
/* TACTL |= MC1;*/
|
/* TACTL |= MC1;*/
|
||||||
|
@ -78,9 +93,8 @@ ISR(TIMER1_A1, timera1)
|
||||||
++seconds;
|
++seconds;
|
||||||
energest_flush();
|
energest_flush();
|
||||||
}
|
}
|
||||||
} while((TA1CCR1 - TA1R) > INTERVAL);
|
last_tar = read_tar();
|
||||||
|
}
|
||||||
last_tar = TA1R;
|
|
||||||
|
|
||||||
if(etimer_pending() &&
|
if(etimer_pending() &&
|
||||||
(etimer_next_expiration_time() - count - 1) > MAX_TICKS) {
|
(etimer_next_expiration_time() - count - 1) > MAX_TICKS) {
|
||||||
|
|
Loading…
Reference in a new issue