Update for chopstx_join/_exit/_cancel
authorNIIBE Yutaka <gniibe@fsij.org>
Wed, 29 May 2013 06:12:06 +0000 (15:12 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Wed, 29 May 2013 06:12:06 +0000 (15:12 +0900)
chopstx
src/adc_stm32f103.c
src/main.c
src/random.c

diff --git a/chopstx b/chopstx
index 866461d..23d3155 160000 (submodule)
--- a/chopstx
+++ b/chopstx
@@ -1 +1 @@
-Subproject commit 866461d13ed16354867e0cec1dd4c288ae559c99
+Subproject commit 23d3155f955344252295f99a8cce9ceb19acf6cf
index 3e677b4..97c5191 100644 (file)
@@ -165,10 +165,10 @@ adc_intr_thread (void *arg)
   return NULL;
 }
 
+static chopstx_t adc_thd;
 
 void adc_start (void)
 {
-  chopstx_t thd;
   chopstx_attr_t attr;
 
   /* Use DMA channel 1.  */
@@ -205,7 +205,7 @@ void adc_start (void)
   chopstx_attr_init (&attr);
   chopstx_attr_setschedparam (&attr, PRIO_ADC);
   chopstx_attr_setstack (&attr, __stackaddr_adc, __stacksize_adc);
-  chopstx_create (&thd, &attr, adc_intr_thread, NULL);
+  chopstx_create (&adc_thd, &attr, adc_intr_thread, NULL);
 }
 
 static int adc_mode;
@@ -281,6 +281,9 @@ void adc_stop (void)
   /* XXX: here to disable the associated IRQ vector; stop intr thread.  */
   RCC->AHBENR &= ~RCC_AHBENR_DMA1EN;
   RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN | RCC_APB2ENR_ADC2EN);
+
+  chopstx_cancel (adc_thd);
+  chopstx_join (adc_thd, NULL);
 }
 
 
index 89dd5dd..1be0b4e 100644 (file)
@@ -263,16 +263,10 @@ usb_cb_ctrl_write_finish (uint8_t req, uint8_t req_no, uint16_t value,
        }
       else if (req_no == USB_NEUG_EXIT)
        {
-#if 0
-         chSysLockFromIsr ();
-         if (main_thread->p_state == THD_STATE_SUSPENDED
-             || main_thread->p_state == THD_STATE_SLEEPING)
-           {
-             main_thread->p_u.rdymsg = RDY_OK;
-             chSchReadyI (main_thread);
-           }
-         chSysUnlockFromIsr ();
-#endif
+         /* Force exit from the main loop.  */
+         chopstx_mutex_lock (&usb_mtx);
+         chopstx_cond_signal (&cnd_usb_buffer_ready);
+         chopstx_mutex_unlock (&usb_mtx);
        }
     }
 }
@@ -779,7 +773,7 @@ int
 main (int argc, char **argv)
 {
   uint32_t entry;
-  chopstx_t led_thread, thd;
+  chopstx_t led_thread, usb_thd;
   chopstx_attr_t attr;
 
   (void)argc;
@@ -802,7 +796,7 @@ main (int argc, char **argv)
 
   chopstx_attr_setschedparam (&attr, PRIO_USB);
   chopstx_attr_setstack (&attr, __stackaddr_usb, __stacksize_usb);
-  chopstx_create (&thd, &attr, usb_intr, NULL);
+  chopstx_create (&usb_thd, &attr, usb_intr, NULL);
 
   neug_init (random_word, RANDOM_BYTES_LENGTH/sizeof (uint32_t));
 
@@ -894,9 +888,7 @@ main (int argc, char **argv)
     }
 
   event_flag_signal (&led_event, LED_ONESHOT_SHORT);
-#if 0
   chopstx_join (led_thread, NULL);
-#endif
 
   /*
    * We come here, because of FSIJ_DEVICE_NEUG_EXIT_REQUESTED.
@@ -911,10 +903,11 @@ main (int argc, char **argv)
   flash_unlock ();             /* Flash unlock should be done here */
   set_led (1);
   usb_lld_shutdown ();
-#if 0
-  /* Finish kernel: stop scheduler, timer.  */
-  chx_fini ();
-#endif
+
+  /* Finish application.  */
+  chopstx_cancel (usb_thd);
+  chopstx_join (usb_thd, NULL);
+
   /* Set vector */
   SCB->VTOR = (uint32_t)&_regnual_start;
   entry = calculate_regnual_entry_address (&_regnual_start);
index b816b3d..6ace837 100644 (file)
@@ -623,9 +623,7 @@ neug_fini (void)
 {
   rng_should_terminate = 1;
   neug_get (1);
-#if 0
   chopstx_join (rng_thread, NULL);
-#endif
 }
 
 void