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

commit afade4f5c921942cd6dd0e3b18601fe18991ffa5
Author: ouyangxiangzhen <ouyangxiangz...@xiaomi.com>
AuthorDate: Thu Nov 21 16:19:40 2024 +0800

    testing/ostest: add periodic wdog testing.
    
    This commit added periodic wdog testing.
    
    Signed-off-by: ouyangxiangzhen <ouyangxiangz...@xiaomi.com>
---
 testing/ostest/wdog.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 84 insertions(+), 6 deletions(-)

diff --git a/testing/ostest/wdog.c b/testing/ostest/wdog.c
index 8c1c35a82..d0e7f3f56 100644
--- a/testing/ostest/wdog.c
+++ b/testing/ostest/wdog.c
@@ -221,7 +221,7 @@ static void wdtest_recursive(FAR struct wdog_s *wdog,
   clock_t  wdset_tick;
   irqstate_t flags;
 
-  wdtest_printf("wdtest_recursive %lldus\n", (long long)delay_ns);
+  wdtest_printf("wdtest_recursive %lldns\n", (long long)delay_ns);
 
   cnt = param->callback_cnt;
 
@@ -249,17 +249,59 @@ static void wdtest_recursive(FAR struct wdog_s *wdog,
                 (long long)(param->triggered_tick - wdset_tick));
 }
 
+static void wdtest_periodic(FAR wdtest_param_t *param,
+                            sclock_t period_ns)
+{
+  clock_t   wdset_tick;
+  clock_t   period_tick  = (clock_t)NSEC2TICK((clock_t)period_ns);
+  uint64_t  callback_cnt = param->callback_cnt;
+
+  struct wdog_period_s period_wdog =
+    {
+     0
+    };
+
+  wdtest_printf("wdtest_periodic %lldns ~ %llutick\n",
+                (long long)period_ns, (unsigned long long)period_tick);
+
+  wdset_tick = clock_systime_ticks();
+
+  wd_start_period(&period_wdog, period_tick, period_tick,
+                  wdtest_callback, (wdparm_t)param);
+
+  while (param->callback_cnt - callback_cnt <= WDOGTEST_RAND_ITER)
+    {
+      wdtest_delay(period_ns);
+    }
+
+  wd_cancel_period(&period_wdog);
+
+  callback_cnt = param->callback_cnt - callback_cnt;
+  wdset_tick   = param->triggered_tick - wdset_tick;
+
+  wdtest_printf("wdtest_periodic cancel...");
+  wdtest_printf("wdtest_periodic triggered %llu times, "
+                "elapsed ticks %lld, error ticks %lld\n",
+                (unsigned long long)callback_cnt, (long long)wdset_tick,
+                (long long)(wdset_tick - callback_cnt * period_tick));
+}
+
 static void wdog_test_run(FAR wdtest_param_t *param)
 {
-  uint64_t      cnt;
-  sclock_t      rest;
-  sclock_t      delay;
-  struct wdog_s test_wdog =
+  uint64_t             cnt;
+  sclock_t             rest;
+  sclock_t             delay;
+  struct wdog_s        test_wdog =
   {
     0
   };
 
-  /* Wrong arguments, all 7 combinations */
+  struct wdog_period_s test_wdog_period =
+  {
+    0
+  };
+
+  /* Wrong arguments of the wd_start */
 
   wdtest_assert(wd_start(NULL, 0, NULL, (wdparm_t)NULL) != OK);
   wdtest_assert(wd_start(NULL, 0, wdtest_callback, (wdparm_t)NULL) != OK);
@@ -270,6 +312,34 @@ static void wdog_test_run(FAR wdtest_param_t *param)
   wdtest_assert(wd_start(&test_wdog, -1, wdtest_callback, (wdparm_t)NULL)
                 != OK);
 
+  wdtest_assert(wd_start_period(NULL, 0, 0,
+                                NULL, (wdparm_t)NULL) != OK);
+
+  wdtest_assert(wd_start_period(NULL, 0, 0,
+                                wdtest_callback, (wdparm_t)NULL) != OK);
+
+  wdtest_assert(wd_start_period(NULL, 0, 12345,
+                                NULL, (wdparm_t)NULL) != OK);
+
+  wdtest_assert(wd_start_period(NULL, 0, 12345,
+                                wdtest_callback, (wdparm_t)NULL) != OK);
+
+  wdtest_assert(wd_start_period(&test_wdog_period, 0, 0,
+                                NULL, (wdparm_t)NULL) != OK);
+
+  wdtest_assert(wd_start_period(&test_wdog_period, 0, 12345,
+                                NULL, (wdparm_t)NULL) != OK);
+
+  wdtest_assert(wd_start_period(&test_wdog_period, 0, 0,
+                                wdtest_callback, (wdparm_t)NULL) != OK);
+
+  /* Wrong arguments of the wd_cancel */
+
+  wdtest_assert(wd_cancel(NULL) != OK);
+  wdtest_assert(wd_cancel(&test_wdog) != OK);
+  wdtest_assert(wd_cancel_period(NULL) != OK);
+  wdtest_assert(wd_cancel_period(&test_wdog_period) != OK);
+
   /* Delay = 0 */
 
   wdtest_once(&test_wdog, param, 0);
@@ -331,9 +401,17 @@ static void wdog_test_run(FAR wdtest_param_t *param)
   wdtest_recursive(&test_wdog, param, 1000000, 100);
   wdtest_recursive(&test_wdog, param, 10000000, 10);
 
+  /* Periodic wdog period with 1000us */
+
+  wdtest_periodic(param, 100000);
+
   /* Random delay ~12us */
 
   wdtest_rand(&test_wdog, param, 12345);
+
+  /* Finally, cancel the wdog. */
+
+  wd_cancel(&test_wdog);
 }
 
 /* Multi threaded */

Reply via email to