Fix issues with starting a timer that has already been set. Assert if that 
happens


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/165affba
Tree: 
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/165affba
Diff: 
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/165affba

Branch: refs/heads/master
Commit: 165affbad1018bd553372d31d69d5cbb9a2ae54a
Parents: bf65252
Author: wes3 <w...@micosa.io>
Authored: Thu Dec 3 15:19:13 2015 -0800
Committer: wes3 <w...@micosa.io>
Committed: Thu Dec 3 15:35:50 2015 -0800

----------------------------------------------------------------------
 hw/mcu/nordic/nrf52xxx/src/hal_cputime.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/165affba/hw/mcu/nordic/nrf52xxx/src/hal_cputime.c
----------------------------------------------------------------------
diff --git a/hw/mcu/nordic/nrf52xxx/src/hal_cputime.c 
b/hw/mcu/nordic/nrf52xxx/src/hal_cputime.c
index fa56939..6f43740 100644
--- a/hw/mcu/nordic/nrf52xxx/src/hal_cputime.c
+++ b/hw/mcu/nordic/nrf52xxx/src/hal_cputime.c
@@ -110,6 +110,7 @@ cputime_chk_expiration(void)
     while ((timer = TAILQ_FIRST(&g_cputimer_q)) != NULL) {
         if ((int32_t)(cputime_get32() - timer->cputime) >= 0) {
             TAILQ_REMOVE(&g_cputimer_q, timer, link);
+            timer->link.tqe_prev = NULL;
             timer->cb(timer->arg);
         } else {
             break;
@@ -474,6 +475,7 @@ cputime_timer_init(struct cpu_timer *timer, cputimer_func 
fp, void *arg)
  *  
  * Start a cputimer that will expire at 'cputime'. If cputime has already 
  * passed, the timer callback will still be called (at interrupt context). 
+ * Cannot be called when the timer has already started. 
  * 
  * @param timer     Pointer to timer to start. Cannot be NULL.
  * @param cputime   The cputime at which the timer should expire.
@@ -485,6 +487,7 @@ cputime_timer_start(struct cpu_timer *timer, uint32_t 
cputime)
     uint32_t ctx;
 
     assert(timer != NULL);
+    assert(timer->link.tqe_prev == NULL);
 
     /* XXX: should this use a mutex? not sure... */
     __HAL_DISABLE_INTERRUPTS(ctx);
@@ -537,7 +540,7 @@ cputime_timer_relative(struct cpu_timer *timer, uint32_t 
usecs)
  *  
  * Stops a cputimer from running. The timer is removed from the timer queue 
  * and interrupts are disabled if no timers are left on the queue. Can be 
- * called even if timer is running. 
+ * called even if timer is not running. 
  * 
  * @param timer Pointer to cputimer to stop. Cannot be NULL.
  */
@@ -552,14 +555,15 @@ cputime_timer_stop(struct cpu_timer *timer)
 
     __HAL_DISABLE_INTERRUPTS(ctx);
 
-    /* If first on queue, we will need to reset OCMP */
     if (timer->link.tqe_prev != NULL) {
         reset_ocmp = 0;
         if (timer == TAILQ_FIRST(&g_cputimer_q)) {
+            /* If first on queue, we will need to reset OCMP */
             entry = TAILQ_NEXT(timer, link);
             reset_ocmp = 1;
         }
         TAILQ_REMOVE(&g_cputimer_q, timer, link);
+        timer->link.tqe_prev = NULL;
         if (reset_ocmp) {
             if (entry) {
                 cputime_set_ocmp(entry);

Reply via email to