This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git


The following commit(s) were added to refs/heads/master by this push:
     new ee1e84a26 examples/nxscope: add a new option to wake up the samples 
thread with timer.
ee1e84a26 is described below

commit ee1e84a261eb1820aa183f571d2a14d04796921e
Author: raiden00pl <[email protected]>
AuthorDate: Tue Feb 7 14:13:36 2023 +0100

    examples/nxscope: add a new option to wake up the samples thread with timer.
    
    Now we can add samples with at a higher frequency than with usleep().
---
 examples/nxscope/Kconfig        |  20 ++++++
 examples/nxscope/nxscope_main.c | 133 +++++++++++++++++++++++++++++++++++++++-
 2 files changed, 150 insertions(+), 3 deletions(-)

diff --git a/examples/nxscope/Kconfig b/examples/nxscope/Kconfig
index 17f3b5a92..3634bf999 100644
--- a/examples/nxscope/Kconfig
+++ b/examples/nxscope/Kconfig
@@ -62,4 +62,24 @@ config EXAMPLES_NXSCOPE_RX_PADDING
        int "nxscope RX padding"
        default 0
 
+config EXAMPLES_NXSCOPE_TIMER
+       bool "nxscope use timer to wake up samples thread"
+       default n
+
+if EXAMPLES_NXSCOPE_TIMER
+
+config EXAMPLES_NXSCOPE_TIMER_PATH
+       string "nxscope timer path"
+       default "/dev/timer0"
+
+config EXAMPLES_NXSCOPE_TIMER_SIGNO
+       int "nxscope notification signal number"
+       default 17
+
+config EXAMPLES_NXSCOPE_TIMER_INTERVAL
+       int "nxscope timer interval (microseconds)"
+       default 100
+
+endif # EXAMPLES_NXSCOPE_TIMER
+
 endif
diff --git a/examples/nxscope/nxscope_main.c b/examples/nxscope/nxscope_main.c
index b7eab4a55..6a63e2c69 100644
--- a/examples/nxscope/nxscope_main.c
+++ b/examples/nxscope/nxscope_main.c
@@ -31,6 +31,14 @@
 #include <stdio.h>
 #include <unistd.h>
 
+#ifdef CONFIG_EXAMPLES_NXSCOPE_TIMER
+#  include <sys/ioctl.h>
+#  include <fcntl.h>
+#  include <stdlib.h>
+#  include <signal.h>
+#  include <nuttx/timers/timer.h>
+#endif
+
 #include "logging/nxscope/nxscope.h"
 
 /****************************************************************************
@@ -72,21 +80,123 @@ int nxscope_cb_start(FAR void *priv, bool start)
   return OK;
 }
 
+#ifdef CONFIG_EXAMPLES_NXSCOPE_TIMER
+/****************************************************************************
+ * Name: nxscope_timer_init
+ ****************************************************************************/
+
+static int nxscope_timer_init(void)
+{
+  int                   fd = 0;
+  int                   ret = 0;
+  struct timer_notify_s notify;
+
+  /* Open the timer driver */
+
+  fd = open(CONFIG_EXAMPLES_NXSCOPE_TIMER_PATH, O_RDONLY);
+  if (fd < 0)
+    {
+      printf("ERROR: Failed to open %s: %d\n",
+             CONFIG_EXAMPLES_NXSCOPE_TIMER_PATH, errno);
+      goto errout;
+    }
+
+  /* Set the timer interval */
+
+  ret = ioctl(fd, TCIOC_SETTIMEOUT,
+              CONFIG_EXAMPLES_NXSCOPE_TIMER_INTERVAL);
+  if (ret < 0)
+    {
+      printf("ERROR: Failed to set the timer interval: %d\n", errno);
+      goto errout;
+    }
+
+  /* Configure the timer notifier */
+
+  notify.pid      = getpid();
+  notify.periodic = true;
+
+  notify.event.sigev_notify = SIGEV_SIGNAL;
+  notify.event.sigev_signo  = CONFIG_EXAMPLES_NXSCOPE_TIMER_SIGNO;
+  notify.event.sigev_value.sival_ptr = NULL;
+
+  ret = ioctl(fd, TCIOC_NOTIFICATION,
+              (unsigned long)((uintptr_t)&notify));
+  if (ret < 0)
+    {
+      printf("ERROR: Failed to set the timer handler: %d\n", errno);
+      goto errout;
+    }
+
+  /* Start the timer */
+
+  ret = ioctl(fd, TCIOC_START, 0);
+  if (ret < 0)
+    {
+      printf("ERROR: Failed to start the timer: %d\n", errno);
+      goto errout;
+    }
+
+errout:
+  return fd;
+}
+
+/****************************************************************************
+ * Name: nxscope_timer_deinit
+ ****************************************************************************/
+
+static void nxscope_timer_deinit(int fd)
+{
+  int ret = 0;
+
+  /* Stop the timer */
+
+  ret = ioctl(fd, TCIOC_STOP, 0);
+  if (ret < 0)
+    {
+      printf("ERROR: Failed to stop the timer: %d\n", errno);
+    }
+
+  close(fd);
+}
+#endif
+
 /****************************************************************************
  * Name: nxscope_samples_thr
  ****************************************************************************/
 
 static FAR void *nxscope_samples_thr(FAR void *arg)
 {
-  FAR struct nxscope_thr_env_s *envp = arg;
-  FAR uint8_t                  *ptr  = NULL;
-  uint32_t                      i    = 0;
+  FAR struct nxscope_thr_env_s *envp     = arg;
+  FAR uint8_t                  *ptr      = NULL;
+  uint32_t                      i        = 0;
   float                         v[3];
+#ifdef CONFIG_EXAMPLES_NXSCOPE_TIMER
+  int                           fd_timer = 0;
+  int                           ret      = OK;
+  sigset_t                      set;
+#endif
 
   DEBUGASSERT(envp);
 
   printf("nxscope_samples_thr\n");
 
+#ifdef CONFIG_EXAMPLES_NXSCOPE_TIMER
+  /* Initialize timer for periodic signal. */
+
+  ret = nxscope_timer_init();
+  if (ret < 0)
+    {
+      printf("ERROR: nxscope_timer_init() failed: %d\n", errno);
+      goto errout;
+    }
+
+  /* Configure the signal set for this thread */
+
+  sigemptyset(&set);
+  sigaddset(&set, CONFIG_EXAMPLES_NXSCOPE_TIMER_SIGNO);
+#endif
+
   /* Initialize float vector */
 
   v[0] = -1.0f;
@@ -176,9 +286,26 @@ static FAR void *nxscope_samples_thr(FAR void *arg)
 
       i += 1;
 
+#ifdef CONFIG_EXAMPLES_NXSCOPE_TIMER
+      ret = sigwaitinfo(&set, NULL);
+      if (ret < 0)
+        {
+          printf("ERROR: sigwaitinfo() failed: %d\n", errno);
+          goto errout;
+        }
+#else
       usleep(100);
+#endif
     }
 
+#ifdef CONFIG_EXAMPLES_NXSCOPE_TIMER
+errout:
+
+  /* Deinit timer */
+
+  nxscope_timer_deinit(fd_timer);
+#endif
+
   return NULL;
 }
 

Reply via email to