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

sjanc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git

commit 259aa4d35834accecfa67bde6ed4038927716099
Author: Wiktor Kwiatkowski <[email protected]>
AuthorDate: Tue Jul 28 15:26:22 2026 +0200

    mtest: Add watchdog test
    
    This test adds two main test cases. The first case verifies whether
    periodically calling hal_watchdog_tickle prevents the watchdog from
    firing. The second case verifies that starving the watchdog correctly
    triggers a system reset.
---
 .../include/mtest_watchdog/mtest_watchdog.h        | 35 ++++++++++
 test/mtest/mtest_watchdog/pkg.yml                  | 32 +++++++++
 test/mtest/mtest_watchdog/src/main.c               | 64 ++++++++++++++++++
 .../mtest/mtest_watchdog/src/watchdog_test_cases.c | 77 ++++++++++++++++++++++
 test/mtest/mtest_watchdog/syscfg.yml               | 21 ++++++
 5 files changed, 229 insertions(+)

diff --git a/test/mtest/mtest_watchdog/include/mtest_watchdog/mtest_watchdog.h 
b/test/mtest/mtest_watchdog/include/mtest_watchdog/mtest_watchdog.h
new file mode 100644
index 000000000..17720eb5f
--- /dev/null
+++ b/test/mtest/mtest_watchdog/include/mtest_watchdog/mtest_watchdog.h
@@ -0,0 +1,35 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef MTEST_WATCHDOG_H
+#define MTEST_WATCHDOG_H
+#include "mtest/mtest.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+MTEST_CASE_DECL(watchdog_test_case_1);
+MTEST_CASE_DECL(watchdog_test_case_2);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/test/mtest/mtest_watchdog/pkg.yml 
b/test/mtest/mtest_watchdog/pkg.yml
new file mode 100644
index 000000000..80a3aa502
--- /dev/null
+++ b/test/mtest/mtest_watchdog/pkg.yml
@@ -0,0 +1,32 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+pkg.name: test/mtest/mtest_watchdog
+pkg.type: app
+pkg.description: "Tests watchdog"
+pkg.author: "Apache Mynewt <[email protected]>"
+pkg.homepage: "http://mynewt.apache.org/";
+pkg.keywords:
+
+pkg.deps:
+  - "@apache-mynewt-core/kernel/os"
+  - "@apache-mynewt-core/hw/hal"
+  - "@apache-mynewt-core/sys/console"
+  - "@apache-mynewt-core/sys/log"
+  - "@apache-mynewt-core/test/mtest/mtest"
diff --git a/test/mtest/mtest_watchdog/src/main.c 
b/test/mtest/mtest_watchdog/src/main.c
new file mode 100644
index 000000000..74e23526b
--- /dev/null
+++ b/test/mtest/mtest_watchdog/src/main.c
@@ -0,0 +1,64 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "sysinit/sysinit.h"
+#include "os/os_time.h"
+#include "mtest_watchdog/mtest_watchdog.h"
+
+#define FIRST_BOOT_DONE 0xC001B007
+volatile int reset_count __attribute__((section(".noinit")));
+volatile int boot_status __attribute__((section(".noinit")));
+
+MTEST_INIT(watchdog_test)
+{
+    if (boot_status != FIRST_BOOT_DONE) {
+        reset_count = 0;
+        boot_status = FIRST_BOOT_DONE;
+        /* Readback required by STM32H723ZG to ensure data reaches DTCM */
+        (void)boot_status;
+    }
+}
+
+MTEST_SUITE(watchdog_test)
+{
+    MTEST_RUN_INIT(watchdog_test);
+    switch (reset_count) {
+    case 0:
+        watchdog_test_case_1();
+        /* fallthrough */
+    case 1:
+        watchdog_test_case_2();
+        break;
+    default:
+        boot_status = 0;
+        reset_count = 0;
+    }
+}
+
+int
+mynewt_main(int argc, char **argv)
+{
+    sysinit();
+
+    watchdog_test();
+
+    while (1) {
+        os_time_delay(OS_TICKS_PER_SEC);
+    }
+}
diff --git a/test/mtest/mtest_watchdog/src/watchdog_test_cases.c 
b/test/mtest/mtest_watchdog/src/watchdog_test_cases.c
new file mode 100644
index 000000000..57426d77f
--- /dev/null
+++ b/test/mtest/mtest_watchdog/src/watchdog_test_cases.c
@@ -0,0 +1,77 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "mtest/mtest.h"
+#include "hal/hal_system.h"
+#include "hal/hal_watchdog.h"
+#include "mtest_watchdog/mtest_watchdog.h"
+#include "os/os_cputime.h"
+
+extern volatile int reset_count;
+
+MTEST_CASE(watchdog_test_case_1)
+{
+    uint32_t start;
+    uint32_t last_tickle;
+    uint32_t now;
+
+    enum hal_reset_reason reason = hal_reset_cause();
+    MTEST_CASE_ASSERT(reason != HAL_RESET_WATCHDOG, "WDOG tickle failed");
+
+    start = os_cputime_ticks_to_usecs(os_cputime_get32());
+    last_tickle = start;
+    while (1) {
+        now = os_cputime_ticks_to_usecs(os_cputime_get32());
+        if (now - last_tickle >= MYNEWT_VAL(WATCHDOG_INTERVAL) * 1000 / 4) {
+            hal_watchdog_tickle();
+            last_tickle = now;
+        }
+
+        if (now - start >= 2 * (MYNEWT_VAL(WATCHDOG_INTERVAL) * 1000)) {
+            break;
+        }
+    }
+}
+
+MTEST_CASE(watchdog_test_case_2)
+{
+    uint32_t start;
+    uint32_t now;
+    enum hal_reset_reason reason;
+
+    if (reset_count == 1) {
+        reason = hal_reset_cause();
+        MTEST_CASE_ASSERT(reason == HAL_RESET_WATCHDOG, "Expected WDOG reset");
+        return;
+    }
+
+    reset_count++;
+    /* Readback required by STM32H723ZG to ensure data reaches DTCM */
+    (void)reset_count;
+
+    printf("Starving WDOG...\n");
+    start = os_cputime_ticks_to_usecs(os_cputime_get32());
+    while (1) {
+        now = os_cputime_ticks_to_usecs(os_cputime_get32());
+
+        if (now - start > 2 * (MYNEWT_VAL(WATCHDOG_INTERVAL) * 1000)) {
+            MTEST_CASE_ASSERT(0, "WDOG failed to fire");
+        }
+    }
+}
diff --git a/test/mtest/mtest_watchdog/syscfg.yml 
b/test/mtest/mtest_watchdog/syscfg.yml
new file mode 100644
index 000000000..088f8de49
--- /dev/null
+++ b/test/mtest/mtest_watchdog/syscfg.yml
@@ -0,0 +1,21 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+syscfg.vals:
+    WATCHDOG_INTERVAL: 2000
+    SANITY_INTERVAL: 500

Reply via email to