From aba55831057dffd684bd59c13b8e9eb140c73af5 Mon Sep 17 00:00:00 2001 From: liqiaozhong Date: Wed, 26 Jun 2024 10:45:27 +0800 Subject: [PATCH 1/2] update --- .gitignore | 22 + LICENSE | 202 +++ README.en.md | 36 - README.md | 284 +++- app/peripheral/iopad/CMakeLists.txt | 10 + app/peripheral/iopad/makefile | 16 + app/peripheral/iopad/prj.conf | 24 + app/peripheral/iopad/src/main.c | 39 + app/peripheral/net/echo/.gdbinit | 61 + app/peripheral/net/echo/CMakeLists.txt | 12 + app/peripheral/net/echo/README.md | 78 + app/peripheral/net/echo/README.rst | 84 ++ .../net/echo/figs/README/1713412848289.png | Bin 0 -> 12081 bytes .../net/echo/figs/README/1713417340810.png | Bin 0 -> 5866 bytes app/peripheral/net/echo/makefile | 21 + app/peripheral/net/echo/prj.conf | 53 + app/peripheral/net/echo/sample.yaml | 19 + app/peripheral/net/echo/src/socket_echo.c | 102 ++ app/peripheral/net/telnet/CMakeLists.txt | 10 + app/peripheral/net/telnet/README.md | 83 ++ .../net/telnet/figs/README/1713424173372.png | Bin 0 -> 12995 bytes app/peripheral/net/telnet/makefile | 28 + app/peripheral/net/telnet/prj.conf | 69 + app/peripheral/net/telnet/sample.yaml | 9 + app/peripheral/net/telnet/src/telnet.c | 149 ++ app/peripheral/pcie/pcie_ecam_test/.gdbinit | 48 + .../pcie/pcie_ecam_test/CMakeLists.txt | 15 + app/peripheral/pcie/pcie_ecam_test/README.md | 68 + .../pcie/pcie_ecam_test/app.overlay | 11 + .../figs/README/pcie_bar_region.jpg | Bin 0 -> 115857 bytes .../figs/README/pcie_enum_result.jpg | Bin 0 -> 34323 bytes .../figs/README/pcie_ls_result.jpg | Bin 0 -> 37299 bytes app/peripheral/pcie/pcie_ecam_test/makefile | 21 + app/peripheral/pcie/pcie_ecam_test/prj.conf | 20 + .../pcie/pcie_ecam_test/sample.yaml | 13 + app/peripheral/pcie/pcie_ecam_test/src/main.c | 27 + app/peripheral/sdio/tf_test/.gdbinit | 48 + app/peripheral/sdio/tf_test/CMakeLists.txt | 10 + app/peripheral/sdio/tf_test/README.docx | Bin 0 -> 55768 bytes app/peripheral/sdio/tf_test/README.md | 70 + .../tf_test/figs/README/1713411631705.png | Bin 0 -> 32610 bytes app/peripheral/sdio/tf_test/makefile | 28 + app/peripheral/sdio/tf_test/prj.conf | 32 + app/peripheral/sdio/tf_test/sample.yaml | 13 + app/peripheral/sdio/tf_test/src/main.c | 156 ++ app/system/interrupt/.gdbinit | 48 + app/system/interrupt/CMakeLists.txt | 27 + app/system/interrupt/README.md | 158 ++ .../interrupt/figs/README/1713410482686.png | Bin 0 -> 12113 bytes .../interrupt/figs/README/1713410509524.png | Bin 0 -> 138857 bytes .../interrupt/figs/README/1713410560510.png | Bin 0 -> 15891 bytes .../interrupt/figs/README/1713410586639.png | Bin 0 -> 15869 bytes .../interrupt/figs/README/1713410631027.png | Bin 0 -> 55616 bytes app/system/interrupt/makefile | 27 + app/system/interrupt/prj.conf | 26 + app/system/interrupt/src/dynamic_isr.c | 65 + app/system/interrupt/src/dynamic_shared_irq.c | 292 ++++ app/system/interrupt/src/interrupt_util.h | 43 + app/system/interrupt/src/main.c | 74 + app/system/interrupt/src/nested_irq.c | 141 ++ app/system/interrupt/src/prevent_irq.c | 73 + app/system/interrupt/src/static_shared_irq.c | 126 ++ app/system/interrupt/src/test_interrupt.h | 23 + app/system/interrupt/src/test_shared_irq.h | 69 + app/system/kernel_feature/schedule/.gdbinit | 59 + .../kernel_feature/schedule/CMakeLists.txt | 10 + app/system/kernel_feature/schedule/README.md | 165 +++ .../schedule/figs/README/1713405703335.png | Bin 0 -> 43992 bytes .../schedule/figs/README/1713405732059.png | Bin 0 -> 17533 bytes .../schedule/figs/README/1713405767652.png | Bin 0 -> 13074 bytes .../schedule/figs/README/1713405796614.png | Bin 0 -> 38032 bytes .../schedule/figs/README/1713405833265.png | Bin 0 -> 65393 bytes .../schedule/figs/README/1713405866527.png | Bin 0 -> 39581 bytes app/system/kernel_feature/schedule/makefile | 18 + app/system/kernel_feature/schedule/prj.conf | 21 + app/system/kernel_feature/schedule/src/main.c | 102 ++ .../schedule/src/test_priority_scheduling.c | 115 ++ .../kernel_feature/schedule/src/test_sched.h | 59 + .../src/test_sched_is_preempt_thread.c | 124 ++ .../schedule/src/test_sched_priority.c | 197 +++ .../src/test_sched_timeslice_and_lock.c | 573 ++++++++ .../schedule/src/test_sched_timeslice_reset.c | 197 +++ .../schedule/src/test_slice_scheduling.c | 227 +++ app/system/smp/smp_test/.gdbinit | 48 + app/system/smp/smp_test/CMakeLists.txt | 13 + app/system/smp/smp_test/Kconfig | 11 + app/system/smp/smp_test/README.md | 98 ++ .../smp_test/figs/README/1713407267028.png | Bin 0 -> 127185 bytes app/system/smp/smp_test/makefile | 15 + app/system/smp/smp_test/prj.conf | 28 + app/system/smp/smp_test/src/main.c | 9 + app/system/smp/smp_test/src/smp_test.c | 1298 +++++++++++++++++ app/system/smp/smp_test/testcase.yaml | 16 + doc/ChangeLog.md | 59 + figs/readme/1712020444273.png | Bin 0 -> 27752 bytes figs/readme/1712058336378.png | Bin 0 -> 6656 bytes figs/readme/1712107861173.png | Bin 0 -> 15371 bytes figs/readme/zephy_sdk_install.png | Bin 0 -> 28990 bytes ...3\346\236\266\346\236\204\345\233\276.png" | Bin 0 -> 28063 bytes modules/hal/phytium/CMakeLists.txt | 5 + modules/hal/phytium/LICENSE | 202 +++ modules/hal/phytium/hal/CMakeLists.txt | 80 + .../phytium/hal/fdrivers_port/fdrivers_port.c | 92 ++ .../phytium/hal/fdrivers_port/fdrivers_port.h | 136 ++ .../hal/phytium/hal/fdrivers_port/sdkconfig.h | 14 + modules/hal/phytium/zephyr/module.yml | 4 + tools/env_test.py | 60 + tools/kitware-archive.sh | 99 ++ tools/pull_zephyr_os.py | 15 + tools/pull_zephyr_os.sh | 11 + tools/update.py | 0 111 files changed, 7303 insertions(+), 60 deletions(-) create mode 100644 .gitignore create mode 100644 LICENSE delete mode 100644 README.en.md create mode 100644 app/peripheral/iopad/CMakeLists.txt create mode 100644 app/peripheral/iopad/makefile create mode 100644 app/peripheral/iopad/prj.conf create mode 100644 app/peripheral/iopad/src/main.c create mode 100644 app/peripheral/net/echo/.gdbinit create mode 100644 app/peripheral/net/echo/CMakeLists.txt create mode 100644 app/peripheral/net/echo/README.md create mode 100644 app/peripheral/net/echo/README.rst create mode 100644 app/peripheral/net/echo/figs/README/1713412848289.png create mode 100644 app/peripheral/net/echo/figs/README/1713417340810.png create mode 100644 app/peripheral/net/echo/makefile create mode 100644 app/peripheral/net/echo/prj.conf create mode 100644 app/peripheral/net/echo/sample.yaml create mode 100644 app/peripheral/net/echo/src/socket_echo.c create mode 100644 app/peripheral/net/telnet/CMakeLists.txt create mode 100644 app/peripheral/net/telnet/README.md create mode 100644 app/peripheral/net/telnet/figs/README/1713424173372.png create mode 100644 app/peripheral/net/telnet/makefile create mode 100644 app/peripheral/net/telnet/prj.conf create mode 100644 app/peripheral/net/telnet/sample.yaml create mode 100644 app/peripheral/net/telnet/src/telnet.c create mode 100644 app/peripheral/pcie/pcie_ecam_test/.gdbinit create mode 100644 app/peripheral/pcie/pcie_ecam_test/CMakeLists.txt create mode 100644 app/peripheral/pcie/pcie_ecam_test/README.md create mode 100644 app/peripheral/pcie/pcie_ecam_test/app.overlay create mode 100644 app/peripheral/pcie/pcie_ecam_test/figs/README/pcie_bar_region.jpg create mode 100644 app/peripheral/pcie/pcie_ecam_test/figs/README/pcie_enum_result.jpg create mode 100644 app/peripheral/pcie/pcie_ecam_test/figs/README/pcie_ls_result.jpg create mode 100644 app/peripheral/pcie/pcie_ecam_test/makefile create mode 100644 app/peripheral/pcie/pcie_ecam_test/prj.conf create mode 100644 app/peripheral/pcie/pcie_ecam_test/sample.yaml create mode 100644 app/peripheral/pcie/pcie_ecam_test/src/main.c create mode 100644 app/peripheral/sdio/tf_test/.gdbinit create mode 100644 app/peripheral/sdio/tf_test/CMakeLists.txt create mode 100644 app/peripheral/sdio/tf_test/README.docx create mode 100644 app/peripheral/sdio/tf_test/README.md create mode 100644 app/peripheral/sdio/tf_test/figs/README/1713411631705.png create mode 100644 app/peripheral/sdio/tf_test/makefile create mode 100644 app/peripheral/sdio/tf_test/prj.conf create mode 100644 app/peripheral/sdio/tf_test/sample.yaml create mode 100644 app/peripheral/sdio/tf_test/src/main.c create mode 100644 app/system/interrupt/.gdbinit create mode 100644 app/system/interrupt/CMakeLists.txt create mode 100644 app/system/interrupt/README.md create mode 100644 app/system/interrupt/figs/README/1713410482686.png create mode 100644 app/system/interrupt/figs/README/1713410509524.png create mode 100644 app/system/interrupt/figs/README/1713410560510.png create mode 100644 app/system/interrupt/figs/README/1713410586639.png create mode 100644 app/system/interrupt/figs/README/1713410631027.png create mode 100644 app/system/interrupt/makefile create mode 100644 app/system/interrupt/prj.conf create mode 100644 app/system/interrupt/src/dynamic_isr.c create mode 100644 app/system/interrupt/src/dynamic_shared_irq.c create mode 100644 app/system/interrupt/src/interrupt_util.h create mode 100644 app/system/interrupt/src/main.c create mode 100644 app/system/interrupt/src/nested_irq.c create mode 100644 app/system/interrupt/src/prevent_irq.c create mode 100644 app/system/interrupt/src/static_shared_irq.c create mode 100644 app/system/interrupt/src/test_interrupt.h create mode 100644 app/system/interrupt/src/test_shared_irq.h create mode 100644 app/system/kernel_feature/schedule/.gdbinit create mode 100644 app/system/kernel_feature/schedule/CMakeLists.txt create mode 100644 app/system/kernel_feature/schedule/README.md create mode 100644 app/system/kernel_feature/schedule/figs/README/1713405703335.png create mode 100644 app/system/kernel_feature/schedule/figs/README/1713405732059.png create mode 100644 app/system/kernel_feature/schedule/figs/README/1713405767652.png create mode 100644 app/system/kernel_feature/schedule/figs/README/1713405796614.png create mode 100644 app/system/kernel_feature/schedule/figs/README/1713405833265.png create mode 100644 app/system/kernel_feature/schedule/figs/README/1713405866527.png create mode 100644 app/system/kernel_feature/schedule/makefile create mode 100644 app/system/kernel_feature/schedule/prj.conf create mode 100644 app/system/kernel_feature/schedule/src/main.c create mode 100644 app/system/kernel_feature/schedule/src/test_priority_scheduling.c create mode 100644 app/system/kernel_feature/schedule/src/test_sched.h create mode 100644 app/system/kernel_feature/schedule/src/test_sched_is_preempt_thread.c create mode 100644 app/system/kernel_feature/schedule/src/test_sched_priority.c create mode 100644 app/system/kernel_feature/schedule/src/test_sched_timeslice_and_lock.c create mode 100644 app/system/kernel_feature/schedule/src/test_sched_timeslice_reset.c create mode 100644 app/system/kernel_feature/schedule/src/test_slice_scheduling.c create mode 100644 app/system/smp/smp_test/.gdbinit create mode 100644 app/system/smp/smp_test/CMakeLists.txt create mode 100644 app/system/smp/smp_test/Kconfig create mode 100644 app/system/smp/smp_test/README.md create mode 100644 app/system/smp/smp_test/figs/README/1713407267028.png create mode 100644 app/system/smp/smp_test/makefile create mode 100644 app/system/smp/smp_test/prj.conf create mode 100644 app/system/smp/smp_test/src/main.c create mode 100644 app/system/smp/smp_test/src/smp_test.c create mode 100644 app/system/smp/smp_test/testcase.yaml create mode 100644 doc/ChangeLog.md create mode 100644 figs/readme/1712020444273.png create mode 100644 figs/readme/1712058336378.png create mode 100644 figs/readme/1712107861173.png create mode 100644 figs/readme/zephy_sdk_install.png create mode 100644 "figs/readme/\344\273\223\345\272\223\346\236\266\346\236\204\345\233\276.png" create mode 100644 modules/hal/phytium/CMakeLists.txt create mode 100644 modules/hal/phytium/LICENSE create mode 100644 modules/hal/phytium/hal/CMakeLists.txt create mode 100644 modules/hal/phytium/hal/fdrivers_port/fdrivers_port.c create mode 100644 modules/hal/phytium/hal/fdrivers_port/fdrivers_port.h create mode 100644 modules/hal/phytium/hal/fdrivers_port/sdkconfig.h create mode 100644 modules/hal/phytium/zephyr/module.yml create mode 100644 tools/env_test.py create mode 100644 tools/kitware-archive.sh create mode 100644 tools/pull_zephyr_os.py create mode 100644 tools/pull_zephyr_os.sh create mode 100644 tools/update.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..33edc16 --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +.venv +zephyr/ + +build/ +.vscode + +.west +bootloader/ +tools/edtt/ +tools/net-tools/ + +modules/bsim_hw_models/ +modules/crypto/ +modules/debug/ +modules/fs/ +modules/lib/ +modules/tee/ +modules/hal/* +!modules/hal/phytium/ +!modules/hal/phytium/hal +!modules/hal/phytium/zephyr +modules/hal/phytium/hal/phytium-standalone-sdk diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8f71f43 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed 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. + diff --git a/README.en.md b/README.en.md deleted file mode 100644 index ca35faf..0000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# Phytium-Zephyr-SDK - -#### Description -此项目是一个开源软件,专为物联网领域设计,基于Zephyr实时操作系统,针对Phytium系列CPU进行了专门的适配和应用开发。 - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md index 1b04b1f..ca537ac 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,273 @@ # Phytium-Zephyr-SDK -#### 介绍 -此项目是一个开源软件,专为物联网领域设计,基于Zephyr实时操作系统,针对Phytium系列CPU进行了专门的适配和应用开发。 +**v1.0.0** [ReleaseNote](./doc/ChangeLog.md) -#### 软件架构 -软件架构说明 +## 1. 仓库介绍 +## 1.1 本仓库特色 -#### 安装教程 +此项目是一个开源软件,专为物联网领域设计,基于Zephyr实时操作系统,针对Phytium系列CPU进行了专门的适配和应用开发。我们的目标是降低开发者的使用门槛,提供了部署文档和使用指南,旨在帮助开发者轻松在Zephyr平台上扩展Phytium系列CPU的功能。本项目适合所有希望在Zephyr实时操作系统上充分利用Phytium系列CPU能力的开发者。 -1. xxxx -2. xxxx -3. xxxx +## 1.2 Zephyr 简介 -#### 使用说明 +[Zephyr Project Documentation — Zephyr Project Documentation](https://docs.zephyrproject.org/latest/index.html) -1. xxxx -2. xxxx -3. xxxx +Zephyr是一个开源的实时操作系统(RTOS),主要面向在资源受限的嵌入式设备上运行。它由Linux Foundation托管,目的是提供一个轻量级、模块化的系统,以支持物联网(IoT)和边缘计算应用。Zephyr项目自2016年开始,迅速发展成为一个活跃的开源社区,汇集了来自全球的开发者和公司贡献代码和知识。下面是根据您提到的几个方面对Zephyr系统的介绍: -#### 参与贡献 +### 内核特点 -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request +1. **轻量级和高度模块化**:Zephyr设计为可配置且可扩展,允许开发者根据需要选择包含在最终固件中的组件,这有助于减少资源消耗。 +2. **实时性**:作为RTOS,Zephyr提供实时任务调度,确保关键任务能够及时准确地执行。 +3. **多平台支持**:支持多种不同架构的CPU芯片,包括ARM、Intel x86、RISC-V等,涵盖从低功耗微控制器到更复杂的系统级芯片(SoC)。 +4. **安全性**:提供了包括数据加密和安全启动在内的多种安全特性,以保护设备免受攻击。 +### 应用开发 -#### 特技 +1. **灵活的开发环境**:Zephyr可以通过其SDK和集成的开发环境(IDE)插件进行开发,支持多种编程语言,包括C和C++。 +2. **设备驱动和中间件支持**:提供丰富的设备驱动程序和中间件,支持网络、蓝牙、文件系统等多种通信协议和服务。 +3. **微内核和单片机(MCU)内核选项**:开发者可以根据应用需求,选择适合的内核配置,以最佳方式利用硬件资源。 -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +### 生态特色 + +1. **强大的社区支持**:作为一个活跃的开源项目,Zephyr拥有广泛的社区支持,提供了大量的文档、教程和案例,帮助开发者快速上手。 +2. **与主流技术兼容**:Zephyr可以与多种主流的开源技术栈整合,如MCUboot引导加载器、Mbed TLS安全库等,确保开发者能够构建安全、可靠的应用。 +3. **跨行业应用**:适用于多种应用场景,包括但不限于智能家居、可穿戴设备、工业控制和汽车电子。 + +## 1.3 适配框架 + +本开源项目由3个仓库(图1)组成,分别是Phytium-Zephyr-SDK、Zephyr OS、Standalone-For-Zephyr。以下是关于这三个开源仓库的介绍。 + +Phytium-Zephyr-SDK:此仓库作为整个开源项目的入口,提供了项目说明、部署手册、版本管理、测试例程等开发者在调试过程中会使用到的必要内容。开发者如果在部署开发过程中如果了问题,可以在此仓库下的issue下提交给我们。 + +Zephyr OS: 此仓库作为Zephyr 官方的镜像站使用,其中会包含Phytium 系列CPU 的设备树以及相应的驱动代码和配置文件。 + +Standalone-For-Zephyr:此仓库作为Zephyr项目依赖模块(modules)中的硬件抽象层,是由Phytium提供的Phytium-Standalone-SDK与驱动适配层构成,此仓库为Zephyr整个构建过程提供驱动部分的软件底座。 + +![1712020444273](figs/readme/1712020444273.png) + + 图1 项目整体架构图 + +## 2. 仓库使用说明 + +- 本例程目前仅应用于Ubuntu开发环境 +- 本模块主要分为3大内容:1. 开发环境搭建;2. 软件部署;3. 例程使用; + +### 2.1 开发环境搭建 + +1. 升级ubuntu环境,建议使用Ubuntu22.04版本 + +``` +sudo apt update +sudo apt upgrade +``` + +2. 如果使用的是早于22.04版本的Ubuntu,为了满足上述主要依赖项的最低版本要求,需要添加额外的软件仓库。在这种情况下,下载、检查并执行Kitware存档脚本,以将Kitware APT仓库添加到你的软件源列表中。关于kitware-archive.sh的详细解释可以在这里找到:kitware第三方apt仓库。 + +``` +sudo bash ./tools/kitware-archive.sh +``` + +3. 通过apt 安装必备软件 + +``` +sudo apt install --no-install-recommends git cmake ninja-build gperf \ + ccache dfu-util device-tree-compiler wget \ + python3-dev python3-pip python3-setuptools python3-tk python3-wheel xz-utils file \ + make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 +``` + +4. 检查必备的软件否成功 + +- 请确保当前安装版本符合要求,备注为最低版本要求 +``` +cmake --version (minimum required is "3.20") +python3 --version (minimum required is "3.8") +dtc --version (minimum required is "1.4.6") +``` + +5. 安装python3虚拟化环境 + +``` +sudo apt install python3-venv +``` + +6. 安装west 软件 + +``` +pip install west +``` + +7. 安装Zephyr SDK软件 + +- 可在[Zephyr SDK bundle](https://github.com/zephyrproject-rtos/sdk-ng/releases/tag/v0.16.5-1)中手动下载并放置在 ~/ 文件夹下,然后从第三步开始执行 + +![zephy_sdk_install](figs/readme/zephy_sdk_install.png) + +``` +cd ~ +wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.5-1/zephyr-sdk-0.16.5-1_linux-x86_64.tar.xz +wget -O - https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.5-1/sha256.sum | shasum --check --ignore-missing +tar xvf zephyr-sdk-0.16.5-1_linux-x86_64.tar.xz +cd zephyr-sdk-0.16.5-1 +./setup.sh +``` + +### 2.2 软件部署 + +1. 拉取本仓库代码到一个合适的目录,一般来说,代码目录名称为:phytium-zephyr-sdk + +2. 进入sdk目录,创建一个Python虚拟化环境 + +``` +cd phytium-zephyr-sdk +python3 -m venv ./.venv +``` + +3. 通过source 激活您的虚拟环境 + +``` +source ./.venv/bin/activate +``` + +4. 在当前目录下执行以下命令初始化Zephyr OS,后续Zephyr OS 将会保存在zephyr目录下 + +``` +./tools/pull_zephyr_os.sh +``` + +5. 更新Zephyr OS中的其他项目,这个过程可能会耗时较长,请耐心等待 +>如果出现某些项目更新中断或失败,可以尝试再次使用命令进行更新 + +``` +west update +``` + +6. 安装必备软件至python虚拟环境中,这个过程可能会耗时较长,请耐心等待 +>如果出现某些软件安装中断或失败,可以尝试再次使用命令进行安装 + +``` +pip install -r zephyr/scripts/requirements.txt +``` + +## 3. 如何部署一个软件 + +详细的实现方法请参考 [Application Development — Zephyr Project Documentation](https://docs.zephyrproject.org/latest/develop/application/index.html) + +- 部署软件最好的方法是从 Phytium-Zephyr-SDK 例子或者Zephyr 官方的例子出发进行部署与构建 。 + +Zephyr官方的例程路径为:zephyr/sample +Phytium-Zephyr-SDK 提供的例程路径为 : app/ + +## 3.1 应用程序概述 + +Zephyr 的构建系统基于 CMake。 + +该构建系统以应用程序为中心,要求基于 Zephyr 的应用程序启动构建 Zephyr 源代码。应用程序构建控制了应用程序本身和 Zephyr 的配置和构建过程,将它们编译成一个单独的二进制文件。 + +主要的 zephyr 仓库包含了 Zephyr 的源代码、配置文件和构建系统。您可能还安装了各种模块(外部项目)与 zephyr 仓库一起,这些模块提供了第三方源代码集成。 + +应用程序目录中的文件将 Zephyr 和任何模块与应用程序连接起来。该目录包含所有特定于应用程序的文件,如特定于应用程序的配置文件和源代码。 + +以下是一个简单的 Zephyr 应用程序中的文件: + +``` + + +├── CMakeLists.txt +├── app.overlay +├── prj.conf +├── VERSION +└── src + └── main.c +``` + +这些内容包括: + +CMakeLists.txt:这个文件告诉构建系统在哪里找到其他应用程序文件,并将应用程序目录与 Zephyr 的 CMake 构建系统链接起来。这种链接提供了 Zephyr 构建系统支持的功能,如特定于板子的配置文件,运行和调试在真实或模拟硬件上编译的二进制文件的能力等等。 + +app.overlay:这是一个设备树覆盖文件,指定应用于任何构建板的基础设备树的应用程序特定更改。设备树覆盖的目的通常是配置应用程序使用的硬件相关内容。 + +构建系统默认会查找 app.overlay,但您可以添加更多设备树覆盖,还会搜索其他默认文件。 + +prj.conf:这是一个 Kconfig 片段,用于指定一个或多个 Kconfig 选项的应用程序特定值。这些应用程序设置与其他设置合并,以产生最终配置。Kconfig 片段的目的通常是配置应用程序使用的软件功能。 + +构建系统默认会查找 prj.conf,但您可以添加更多 Kconfig 片段,还会搜索其他默认文件。 + +有关 Kconfig 配置的更多信息,请参阅下文的 Kconfig 配置部分。 + +VERSION:一个包含几个版本信息字段的文本文件。这些字段让您管理应用程序的生命周期,并在签名应用程序镜像时自动提供应用程序版本。 + +有关此文件及其使用方式的更多信息,请参阅应用程序版本管理。 + +main.c:一个源代码文件。应用程序通常包含用 C、C++ 或汇编语言编写的源文件。Zephyr 的惯例是将它们放在 `` 的一个名为 src 的子目录中。 + +一旦定义了应用程序,您将使用 CMake 生成一个构建目录,其中包含构建应用程序和 Zephyr 所需的文件,然后将它们链接成一个最终二进制文件,您可以在板子上运行。这样做的最简单方法是使用 west build,但您也可以直接使用 CMake。应用程序构建工件始终生成在一个单独的构建目录中:Zephyr 不支持“树内”构建。 + +## 3.2 构建与重建应用程序 + +Zephyr的构建系统将应用程序的所有组件编译和链接成一个单独的应用程序镜像,可以在模拟硬件或实际硬件上运行。 + +与任何其他基于CMake的系统一样,构建过程分为两个阶段。首先,使用cmake命令行工具生成构建文件(也称为构建系统),同时指定一个生成器。该生成器确定构建系统将在第二阶段使用的本地构建工具。第二阶段运行本地构建工具,实际构建源文件并生成一个镜像。要了解更多关于这些概念的信息,请参考官方CMake文档中的CMake简介。 + +尽管Zephyr的默认构建工具是west,Zephyr的元工具,它在后台调用cmake和底层构建工具(ninja或make),但您也可以选择直接调用cmake,如果您更喜欢的话。在Linux和macOS上,您可以在make和ninja生成器(即构建工具)之间进行选择,而在Windows上,您需要使用ninja,因为该平台不支持make。为简单起见,本指南将在整个过程中使用ninja,并且如果您选择使用west build构建应用程序,则需要知道它在幕后默认使用ninja。 + +- 在构建过程中,我们常用的构建方法为: + +``` +west build -b -DOVERLAY_CONFIG= +``` + +上面west 命令中 ,board_name 代表开发板的型号,project_path 代表需要编译例程的相对路径 ,prj.conf为Kconfig 片段 。 + +一个具体示例为: 在app/system/kernel_feature/schedule 路径下,使用 “west build -b e2000q_demo ./ -DOVERLAY_CONFIG=prj.conf” 命令,将会使用e2000q_demo 开发板,编译app/system/kernel_feature/schedule 下的源码例程,并且采用当前路径下的prj.conf 配置。 + +- 我们常用的清除指令为: + +``` +west build -t clean +``` + +clean 指令 ,主要为了清除 `/build`下的编译缓存信息,以这样的方式实现构建系统的重建 。 + +## 4. 硬件支持情况 + +| 硬件平台 | 支持的架构 | 备注 | +|-----------------|------------|----------------| +| E2000D/Q DEMO板 | aarch64 | 支持SMP模式 | +| E2000D/Q DEMO板 | aarch32 | | + + +## 5. 例程展示 + +### 5.1 内核测试 + +[schedule](./app/system/kernel_feature/schedule/README.md) +[interrupt](./app/system/interrupt/README.md) +[smp_test](./app/system/smp/smp_test/README.md) + +### 5.2 peripheral测试 + +[echo](./app/peripheral/net/echo/README.md) +[telnet](./app/peripheral/net/telnet/README.md) +[tf_test](./app/peripheral/sdio/tf_test/README.md) + + +## 例程介绍 + +# FIQ + +Q:在phytium-zephyr-sdk目录中使用```west update```命令时,出现某个仓库下载超时的情况,应该如何处理? + +A:zephyr依赖的大部分modules仓库部署在github上,请确保您的网络能够正常github + +Q:如果出现以下打印应该如何解决: + + ![1712058336378](figs/readme/1712058336378.png) + +A:在拉取Zephyr OS的时候,出现了错误,需要先将当前目录下的zephyr目录删除,然后再重复初始化Zephyr OS + +Q:当执行```pip install -r /zephyr/scripts/requirements.txt```命令时出现以下超时问题时,该怎么办: + + ![1712107861173](figs/readme/1712107861173.png) + +A:可以在```pip install -r /zephyr/scripts/requirements.txt```后面追加```-i https://pypi.tuna.tsinghua.edu.cn/simple```,将pip源设置为国内源 diff --git a/app/peripheral/iopad/CMakeLists.txt b/app/peripheral/iopad/CMakeLists.txt new file mode 100644 index 0000000..8acee3a --- /dev/null +++ b/app/peripheral/iopad/CMakeLists.txt @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) + +set(EXTRA_ZEPHYR_MODULES "$ENV{ZEPHYR_BASE}/../modules/hal/phytium") +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(schedule_test) + +FILE(GLOB app_sources src/*.c) +target_sources(app PRIVATE ${app_sources}) diff --git a/app/peripheral/iopad/makefile b/app/peripheral/iopad/makefile new file mode 100644 index 0000000..6ad7264 --- /dev/null +++ b/app/peripheral/iopad/makefile @@ -0,0 +1,16 @@ +boot: + west build -b e2000q_demo ./ -DOVERLAY_CONFIG=prj.conf + cp ./build/zephyr/zephyr.elf /mnt/d/tftboot/ + cp ./build/zephyr/zephyr.bin /mnt/d/tftboot/ + +boot_aarch32: + west build -b e2000q_a32_demo ./ -DOVERLAY_CONFIG=prj.conf + cp ./build/zephyr/zephyr.elf /mnt/d/tftboot/ + cp ./build/zephyr/zephyr.bin /mnt/d/tftboot/ + +clean: + west build -t clean + rm -rf build + +gdb: + gdb-multiarch -x .gdbinit \ No newline at end of file diff --git a/app/peripheral/iopad/prj.conf b/app/peripheral/iopad/prj.conf new file mode 100644 index 0000000..474c72e --- /dev/null +++ b/app/peripheral/iopad/prj.conf @@ -0,0 +1,24 @@ +# General config +CONFIG_MAIN_STACK_SIZE=8192 + +# schedule +CONFIG_TIMESLICE_PER_THREAD=y + +CONFIG_LOG=y +CONFIG_LOG_DEFAULT_LEVEL=1 +CONFIG_LOG_MODE_IMMEDIATE=y + +# SHELL 开关 +CONFIG_SHELL=y +CONFIG_SHELL_LOG_LEVEL_INF=y +CONFIG_SHELL_STACK_SIZE=8192 + +# pinctrl +CONFIG_PINCTRL=y +CONFIG_PINCTRL_PHYTIUM=y +# CONFIG_HAL_STANDALONE_SDK_DEBUG=y + +# CONFIG_NET_MGMT_EVENT_STACK_SIZE=4096 +# CONFIG_KERNEL_VM_BASE=0x10000000 +# 将 0 ~ 0x80000000 的地址空间作为虚拟内存使用 2G +# CONFIG_KERNEL_VM_SIZE=0x80000000 diff --git a/app/peripheral/iopad/src/main.c b/app/peripheral/iopad/src/main.c new file mode 100644 index 0000000..3fd45b0 --- /dev/null +++ b/app/peripheral/iopad/src/main.c @@ -0,0 +1,39 @@ + + +#include +#include +#include +#include +#include + +#define UART1 DT_NODELABEL(pinctrl) + +#define UART1_NODE DT_NODELABEL(uart1) + +PINCTRL_DT_DEFINE(UART1_NODE); + +void test_pinctrl_dt_define(void) +{ + // 获取配置结构体 + const struct pinctrl_dev_config *config = &Z_PINCTRL_DEV_CONFIG_NAME(UART1_NODE); + // 打印配置结构体的信息 + printf("Pinctrl Dev Config for UART1:\n"); + printf("Number of states: %d\n", config->state_cnt); + for (int i = 0; i < config->state_cnt; i++) { + printf("State %d:\n", i); + printf(" Pins: %d\n", config->states[i].pin_cnt); + for (int j = 0; j < config->states[i].pin_cnt; j++) { + printf(" Pin %d: reg_offset=0x%x, pin_func=%d\n", + j, config->states[i].pins[j].pin_reg_offset, config->states[i].pins[j].func_num); + } + } + pinctrl_apply_state(&(*config), PINCTRL_STATE_DEFAULT); +} + + +int main(void) +{ + test_pinctrl_dt_define(); + return 0 ; +} + diff --git a/app/peripheral/net/echo/.gdbinit b/app/peripheral/net/echo/.gdbinit new file mode 100644 index 0000000..62e67fa --- /dev/null +++ b/app/peripheral/net/echo/.gdbinit @@ -0,0 +1,61 @@ +# increase the default remote timeout in gdb because +# Windows libusb transactions could be slow +set remotetimeout 100000 + +# gdb connect to openocd in port 3333 +target extended-remote localhost:3333 + +# start openocd working queue, monitor followed with openocd command here +monitor init + +# force to use hardware breakpoint, otherwise use software breakpoint +# for e2000d/q, num of hardware breakpoints supposed to be 6 +monitor gdb_breakpoint_override hardware + +# load elf image +load ./build/zephyr/zephyr.elf + +# in case symbols skip load,load agin +file ./build/zephyr/zephyr.elf + +# we can break at the beginning of code by address or by symbol +#break _boot + +# add more breakpoints in application +#break JtagTouchRegisters +#break JtagTouchMemory +# break bubbleSort` +# break JtagPostSort +#break bubbleSortCXX + +# show all breakspoints we before running +# info breakpoints + +# show [-0x10 ~ +0x10 ] range of instructions when breaked +# display /10i $pc-16 + +# start running +# continue +layout src +# break eth_phytium_xmac_iface_init +# break eth_phytium_xmac_isr +# break init_app +# break bg_thread_main +break virt_region_init +break eth_phytium_xmac_dev_init +# break eth_phytium_xmac_setuphandler +# break eth_phytium_xmac_send +# break eth_phytium_xmac_send +# break eth_phytium_xmac_send +# break net_config_init_by_iface +# break check_interface +# break z_arm64_sync_exc +# break sdmmc_read_scr +# break sdmmc_write_blocks +# break z_arm64_prep_c +# break sdmmc_switch +# break sdmmc_read_csd +# break sdmmc_read_blocks +# break sd_idle +# break sd_send_interface_condition +# continue \ No newline at end of file diff --git a/app/peripheral/net/echo/CMakeLists.txt b/app/peripheral/net/echo/CMakeLists.txt new file mode 100644 index 0000000..da5489a --- /dev/null +++ b/app/peripheral/net/echo/CMakeLists.txt @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) + +set(EXTRA_ZEPHYR_MODULES "$ENV{ZEPHYR_BASE}/../modules/hal/phytium") +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(sockets_echo) + +FILE(GLOB app_sources src/*.c) +target_sources(app PRIVATE ${app_sources}) + +include(${ZEPHYR_BASE}/samples/net/common/common.cmake) diff --git a/app/peripheral/net/echo/README.md b/app/peripheral/net/echo/README.md new file mode 100644 index 0000000..321a61f --- /dev/null +++ b/app/peripheral/net/echo/README.md @@ -0,0 +1,78 @@ +# net/echo卡测试 + +## 1. 例程介绍 + +函数 `main` 实现了一个简单的单线程TCP echo服务器。服务器监听指定的端口(这里是4242端口),接收来自客户端的连接,然后回显(echo)客户端发送的所有数据。这个过程包含以下关键步骤: + +1. **创建套接字(socket)**:通过调用 `socket()` 函数创建一个TCP套接字,用于监听来自客户端的连接请求。 +2. **绑定地址和端口**:将套接字与本地地址和指定的端口号绑定。这里使用的是 `INADDR_ANY`,表示服务器将接受指向所有本地接口的连接。 +3. **监听端口**:通过调用 `listen()` 函数,使得服务器套接字进入监听状态,等待来自客户端的连接请求。 +4. **等待并接受连接**:服务器进入一个无限循环,使用 `accept()` 函数等待并接受来自客户端的连接请求。一旦接受到一个连接,就为该连接创建一个新的套接字。 +5. **处理客户端数据**:服务器通过新创建的套接字接收来自客户端的数据。接收到的数据将被回显给客户端,即服务器读取客户端发送的每一条消息,然后将相同的消息发送回客户端。 +6. **关闭客户端连接**:当客户端断开连接或发送数据出现错误时,服务器将关闭与该客户端的连接,并准备接受下一个连接请求。 + +特别注意的是,此代码既可以在普通的POSIX兼容操作系统上运行(如Linux),也可以在Zephyr RTOS上运行,这得益于条件编译指令(`#ifndef __ZEPHYR__`)用于区分不同的环境所需的头文件和API调用。 + +## 2. 如何使用例程 + +本例程需要以下硬件, + +- E2000D/Q Demo板 + +### 2.1 硬件配置方法 + +保障串口正常工作后,需要确认网络是否连接好 + +### 2.2 SDK配置方法 + +- 请根据自己的网络环境,修改prj.conf文件中的CONFIG_NET_CONFIG_MY_IPV4_ADDR 条目为您当前网络环境中分配给开发板的IP. +- 本例子已经提供好具体的编译指令,以下进行介绍: + +1. ``west build -b e2000q_demo ./ -DOVERLAY_CONFIG=prj.conf``,编译命令, 使用west工具构建当前目录下的Zephyr项目,指定目标板为e2000q_demo,并使用prj.conf配置文件覆盖默认配置 ,最终生成的执行文件将会保存在./build/zephyr/zephyr.elf +2. ``west build -t clean``, 清除缓存 ,使用west工具的clean目标清理Zephyr构建系统可能生成的任何其他临时文件或缓存 + +### 2.3 构建和下载 + +- 编译例程 + +``west build -b e2000q_demo ./ -DOVERLAY_CONFIG=prj.conf`` + +- 编译主机测侧设置重启tftp服务器 + +``` +sudo service tftpd-hpa restart +``` + +- 开发板侧使用bootelf命令跳转 + +``` +setenv ipaddr 192.168.4.20 +setenv serverip 192.168.4.50 +setenv gatewayip 192.168.4.1 +tftpboot 0x90100000 zephyr.elf +bootelf -p 0x90100000 +``` + +### 2.4 输出与实验现象 + +- 所有用例均提供一系列可变配置,可在例程全局变量中修改 + +#### 2.4.1 echo 例程使用 + +1. 将zephyr.elf 在开发板上加载起来之后会打印以下内容: + +![1713412848289](figs/README/1713412848289.png) + +2. 在PC主机上输入以下命令,则可以连接开发板echo服务器: + +``` +telnet 192.168.4.7 4242 +``` + +3. 当PC主机连接成功之后,开发板上会打印以下内容: + +![1713417340810](figs/README/1713417340810.png) + +## 3. 如何解决问题 + +## 4. 修改历史记录 diff --git a/app/peripheral/net/echo/README.rst b/app/peripheral/net/echo/README.rst new file mode 100644 index 0000000..005036c --- /dev/null +++ b/app/peripheral/net/echo/README.rst @@ -0,0 +1,84 @@ +.. zephyr:code-sample:: sockets-echo + :name: Echo server (simple) + :relevant-api: bsd_sockets + + Implements a simple IPv4 TCP echo server using BSD sockets. + +Overview +******** + +The sockets/echo sample application for Zephyr implements an IPv4 TCP echo +server using a BSD Sockets compatible API. The purpose of this sample is to +show how it's possible to develop a sockets application portable to both +POSIX and Zephyr. As such, it is kept minimal and supports only IPv4 and TCP. + +The source code for this sample application can be found at: +:zephyr_file:`samples/net/sockets/echo`. + +Requirements +************ + +- :ref:`networking_with_host` +- or, a board with hardware networking + +Building and Running +******************** + +Build the Zephyr version of the sockets/echo application like this: + +.. zephyr-app-commands:: + :zephyr-app: samples/net/sockets/echo + :board: + :goals: build + :compact: + +After the sample starts, it expects connections at 192.0.2.1, port 4242. +The easiest way to connect is: + +.. code-block:: console + + $ telnet 192.0.2.1 4242 + +After a connection is made, the application will echo back any line sent +to it. The application implements a single-threaded server using blocking +sockets, and thus can serve only one client connection at time. After the +current client disconnects, the next connection can proceed. + +Running application on POSIX Host +================================= + +The same application source code can be built for a POSIX system, e.g. +Linux. (Note: if you look at the source, you will see that the code is +the same except the header files are different for Zephyr vs POSIX.) + +To build for a host POSIX OS: + +.. code-block:: console + + $ make -f Makefile.posix + +To run: + +.. code-block:: console + + $ ./socket_echo + +To test: + +.. code-block:: console + + $ telnet 127.0.0.1 4242 + +As can be seen, the behavior of the application is the same as the Zephyr +version. + +Running on cc3220sf_launchxl +============================ + +See the note on Provisioning and Fast Connect in :ref:`cc3220sf_launchxl`. + +After having connected to an Access Point using the sample Wi-Fi shell, +the IP address will be printed to the console upon running this echo +application. + +Proceed to test as above. diff --git a/app/peripheral/net/echo/figs/README/1713412848289.png b/app/peripheral/net/echo/figs/README/1713412848289.png new file mode 100644 index 0000000000000000000000000000000000000000..7c13be920a0f0c9746c4ccc5194ca1cdd1ea747f GIT binary patch literal 12081 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π?JoFF-;)FpoEJ4Q9|+z zWg(uVYM1-PDdUGjds!E7*6HXWff}*+;b^GLG~+|WxIXxbWQXbDDCh#8$-B`pX&{0o zq=Hj`b`7jZcc*4TPUDf0a4WHR8@~I*zrD!W%-k~uuz~2AkS7({`zK}0$ex4I;gLrP zWA6naFejt$E48&e`12b`h6O=L86ZoiO^paOVF&@?XV^j~KpUW`U1E)IkzVKhc44Y9 zYynp~B1XMh7*goYU-D5h(6Py-4CQ#H9u+ao?_8kxb=O|#89^wn>);t$Y2N+g^sYG; zQ{Kfz_tN0&ky-QSKVQDi&TSplZ+*?XB))Gf5pQ>-NtlBr({KcqZA>hw9|zd-T`v=R z1{Co8V)^qof<%H!ZzsKubO4745^?l4@R1mGu(T#_KHNsY z0y$Lm$p$#dc9%=zN~!G2s>n+2cTa>)6X%zVsBX`r-PkS8&%|a1M7l)&W^+>`ERvls zzEJVf4iAg=Oqmjdaa3yj4gH++Jb-%-A=$*FL@ZhzYl>8D)aYhGKUE6Uj?}LYtcHgA z8rW5$SI7)%nO^79$XR@)uxM*fIpcPYM0O20-#dUDkgZz;rOf;A4L2)FJlE#2bYk6*d zrui5iv>X}d6WQ$>5TC>nu{K0+2mqZ?O2RQ=1;+h1Zs<>oZQNt}CeF=ZSW=n=*VjJM{{aXi9P(KW^FO!|uOfsB)!#z5b{e2B_Di9`9^5(CiPoXI zEz@>!Nf1gcN80NE0UM|okY+G#;Cd}~5-)f^-+#~cseYgk3c0>eQDdewdWlf`T#ZRU zuWCe_k$+oPPv>ZHiK6hWm#Hey#E*#>?>FXidtNDy;dQOp)s#A2M2F0vtNlVR0)y9O znDpOxn^LC}A|Yl%tms)Ir}$jPf|4r9fSMCK6Y>ZBAGho!6j&41bLzVz|HDm4Lj!GX z2dFz-E{5Jw_*vUTX?p|&?1Hr! zZ28V^Wt%3BT)c=sGdJJ^rWy2c+B#eBUqrX}djUU$>yi6w>{-D?@Y51fi%65p1x*`oLuDSIimn=>nt#AT7oJK>!_c;J`ph$?yImLGZKnE`MeZCN0~Cwl=t!_Tw){ z6okbPXv8J^KyJ^x3>vr79oYq$c8uP(K}O@~w_`}%YbPxWKgyBf6xbUq{FNZ{!Xl$Q@EH=|5~j8?Uj}xiD264fqrbirlRG? zDF7bK-lBV`qua8&yv2V=RW&S3C!-`~xxySdZKQKf7??Y82v@AB^V<$~P$HZ~x;)2L zhjCalzq2KR9s%3vhd*q`ST)`U$L+m z=kM8&8Bcf7XXm?CAFh|@e`#{fF0FiQPQ;vn_JU`x?)NaMap9&-yvEm=+AP==HtfuK z)c!-@#G`jv^q&p+{fh@A5E0TC7VaC;vEWBXTm7H|1PQ2?4>134x7{=TV%9ng&LDd9 z7flq@(1=27V@MGw$v`s{s3hsdcC=gH+)2(X|_JZvl%k_Fl9iLALT}Vn`La zcaBbm-ihB`q33l!AX2v7s9j2S=SN`V+r!^h*;PA8^7(Kw>-uP-wc{74Pk+X+-TeJu zV_5|^QKlM8LlAOKacqtW=iy`G*}b{@3`PlrcbFy(#T&Sph>Bg)=f5_vnb7o6ggtna zo)1B(P%_Wh-4J@=;1KmrXmWHCmrf+SoTh;7mm@hosGd#I9GuqRt%CG@$fhR7Wck`h zTni}Zv}*cxK>D(R(;znUFGj%~G`tk#<%uac)M~BhTp^$)uo)u0k~T$y-#<@Nsdufx z8uS;-5#W8`=|6z?Uut=M3TKbzU>T2(-$g4J`CPkL&cCWg zEDQXwbVY#$Fo_$NvCYD!@dE5mgH1q|Y(`9BXnd-GHTwBUX{Cx|rpTFJ|+6&}AgfVU^ z*)OkmbBum(XwEVg1(+YnLBa8fxh5$mv~^8wpT4 zqZ^!t30H1+h%&}1v~%}^zwWyI9>!_IZZ-5z|C$Z|a?c?6sYKqxtR}+uhdPOG$@cSc zen-`Q?;kMl4dIJIH@wS(kxVt+sQh1n{Qi}OR_rW$yMtg z1w|mIGY@gUK?fC3ccwkt1eY$7x%cIC<6u@>@4;-IDs+2E!ijy=r-8je>4nawS{lJ2 zGa6PJ0Rax1mXCA>Rw>}|h}=d`v`zY|Kacm()H&qxe-m1{s}|bOB0ho#TgmloKY{P* zfrJ=hv}!Zv1m1TNTfoChLTX(m1=U6c2m7dE%h3a;MuZ6vkK0{)>_r?C8F?QKGU3OJ zdlsEk+-N>J@CsB6ylI|#zvVy{uZGGk;d}~ux9Y(cbR3!K_ufTyUus!6GwnvjUIqV8 zcjT6doJaw>`bzPHA}dy>?YNW`Jsb3Ec)8dewT2SN8d+3QleAm+dzS*K#fdp7n$(HX z%V;RAx@BPLvUPPPa3i!^@AVo6Zzl$X92HM`?XIn5MF;B(gM%M%&DjN#Ks{fbv12rP z;ph{tE$<5tvj&rb^5-r7vdpi3)nEP<3rq%V2i;Cn$L+;)Hqgb}Vv$B1HN#hHQd=_u zkV2gHo(Se4f zHe%#trp_YBt)~14WZk)LuJ#WHhwzL;y{pSWzg@9a7ihkV_;yBEf!~0~>-F|JmBrae z3;%9&7Rz4gM`FoMPx=@_8I$FEvH$sWMj4Y-a13yn0>1B{KU)*}LUyq;kmqxP6Q=7I z$=)n>kOrt#Vu>L)#%?q|yi0G-ad$b*b zQXv%4%D5T7q2ZQ^gX?-iNrUIWB}41Ia)G})kM6EEoV(o?QP+J3F{wx_Ate!;bJ8$( zepefJQ@=6sp zs|^rQkrsBB?%W$>+Sf9@%AnyT_S@@$Zd4E$dNIGAENXnuZF%Yu zX|G$@=OOgFS!LXO@3uEcZwd=sYBzWnO}M)`KleVWUi!IOY<{$GGB8C*i@165PyMj_ z0imB83J7A3j0{5#c)5QmCI$;!`sDQHwwJLg-IuJTBTAuT>f~KExqvM|gvq_m@fk4$ zEqoAaupScTcptyl8KqF9kFC@%qF&RftXTf8mVyc2=N&-f6@0)>d-lJzZTAqOk!U(t zCg{>&=A%)!i&Ot1&|QII{}z+mdmyv^Xwq(G{I3dfp6YxPj|jT3!2Xp#J9xLxKSK^>_<;!R9XNZPiAm;LN%7a_4kjfg LFIpvR82G;cja%U= literal 0 HcmV?d00001 diff --git a/app/peripheral/net/echo/figs/README/1713417340810.png b/app/peripheral/net/echo/figs/README/1713417340810.png new file mode 100644 index 0000000000000000000000000000000000000000..8f4c0f3850b2a418a470dd91dd69cbae96a189e2 GIT binary patch literal 5866 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 AI{*Lx literal 0 HcmV?d00001 diff --git a/app/peripheral/net/echo/makefile b/app/peripheral/net/echo/makefile new file mode 100644 index 0000000..1ba5fae --- /dev/null +++ b/app/peripheral/net/echo/makefile @@ -0,0 +1,21 @@ + + +boot: + west build -b e2000q_demo ./ -DOVERLAY_CONFIG=prj.conf + cp ./build/zephyr/zephyr.elf /mnt/d/tftboot/ + cp ./build/zephyr/zephyr.bin /mnt/d/tftboot/ + +boot_aarch32: + + west build -b e2000q_a32_demo ./ -DOVERLAY_CONFIG=prj.conf + cp ./build/zephyr/zephyr.elf /mnt/d/tftboot/ + cp ./build/zephyr/zephyr.bin /mnt/d/tftboot/ + +clean: + west build -t clean + rm -rf build + +gdb: + gdb-multiarch -x .gdbinit + + diff --git a/app/peripheral/net/echo/prj.conf b/app/peripheral/net/echo/prj.conf new file mode 100644 index 0000000..237b93d --- /dev/null +++ b/app/peripheral/net/echo/prj.conf @@ -0,0 +1,53 @@ +# General config +# CONFIG_NEWLIB_LIBC=y +CONFIG_MAIN_STACK_SIZE=4096 + +# Networking config +CONFIG_NETWORKING=y +CONFIG_NET_IPV4=y +CONFIG_NET_IPV6=n +CONFIG_NET_TCP=y +CONFIG_NET_SOCKETS=y +CONFIG_NET_SOCKETS_POSIX_NAMES=y + +# Network driver config +CONFIG_TEST_RANDOM_GENERATOR=y + +# Network address config +CONFIG_NET_CONFIG_SETTINGS=y +CONFIG_NET_CONFIG_NEED_IPV4=y +CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.168.4.7" + +CONFIG_NET_L2_ETHERNET=y + +CONFIG_LOG=y +CONFIG_LOG_DEFAULT_LEVEL=1 +# CONFIG_LOG_MODE_IMMEDIATE=y +# CONFIG_HAL_STANDALONE_SDK_DEBUG=y + +CONFIG_NET_IF_LOG_LEVEL_DBG=y +CONFIG_NET_L2_ETHERNET_LOG_LEVEL_DBG=y + + +# Core IP options +CONFIG_NETWORKING=y +CONFIG_NET_SHELL=y +CONFIG_NET_SHELL_DYN_CMD_COMPLETION=y +CONFIG_NET_IP_ADDR_CHECK=y +CONFIG_NET_ICMPV4_ACCEPT_BROADCAST=y +CONFIG_NET_PROMISC_LOG_LEVEL_DBG=y +CONFIG_NET_PROMISCUOUS_MODE=y +CONFIG_NET_TEST=y +CONFIG_NET_TX_DEFAULT_PRIORITY=5 +CONFIG_NET_MAX_NEXTHOPS=20 +CONFIG_NET_MAX_ROUTES=5 + + +CONFIG_NET_ETHERNET_BRIDGE_SHELL=y +CONFIG_NET_STATISTICS_ETHERNET=y +CONFIG_NET_STATISTICS=y + +# SHELL 开关 +CONFIG_SHELL=y +CONFIG_SHELL_LOG_LEVEL_INF=y +CONFIG_SHELL_STACK_SIZE=8192 diff --git a/app/peripheral/net/echo/sample.yaml b/app/peripheral/net/echo/sample.yaml new file mode 100644 index 0000000..300c13a --- /dev/null +++ b/app/peripheral/net/echo/sample.yaml @@ -0,0 +1,19 @@ +sample: + description: BSD Sockets API TCP echo server sample + name: socket_echo +common: + harness: net + depends_on: netif + filter: TOOLCHAIN_HAS_NEWLIB == 1 +tests: + sample.net.sockets.echo: + tags: + - net + - socket + sample.net.sockets.echo.offload.simplelink: + platform_allow: cc3220sf_launchxl + tags: + - net + - socket + - offload + - simplelink diff --git a/app/peripheral/net/echo/src/socket_echo.c b/app/peripheral/net/echo/src/socket_echo.c new file mode 100644 index 0000000..cf4d05f --- /dev/null +++ b/app/peripheral/net/echo/src/socket_echo.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2017 Linaro Limited + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +#ifndef __ZEPHYR__ + +#include +#include +#include +#include + +#else + +#include +#include + +#endif + +#define BIND_PORT 4242 + +int main(void) +{ + int serv; + struct sockaddr_in bind_addr; + static int counter; + + serv = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + + if (serv < 0) { + printf("error: socket: %d\n", errno); + exit(1); + } + + bind_addr.sin_family = AF_INET; + bind_addr.sin_addr.s_addr = htonl(INADDR_ANY); + bind_addr.sin_port = htons(BIND_PORT); + + if (bind(serv, (struct sockaddr *)&bind_addr, sizeof(bind_addr)) < 0) { + printf("error: bind: %d\n", errno); + exit(1); + } + + if (listen(serv, 5) < 0) { + printf("error: listen: %d\n", errno); + exit(1); + } + + printf("Single-threaded TCP echo server waits for a connection on " + "port %d...\n", BIND_PORT); + + while (1) { + struct sockaddr_in client_addr; + socklen_t client_addr_len = sizeof(client_addr); + char addr_str[32]; + int client = accept(serv, (struct sockaddr *)&client_addr, + &client_addr_len); + + if (client < 0) { + printf("error: accept: %d\n", errno); + continue; + } + + inet_ntop(client_addr.sin_family, &client_addr.sin_addr, + addr_str, sizeof(addr_str)); + printf("Connection #%d from %s\n", counter++, addr_str); + + while (1) { + char buf[128], *p; + int len = recv(client, buf, sizeof(buf), 0); + int out_len; + + if (len <= 0) { + if (len < 0) { + printf("error: recv: %d\n", errno); + } + break; + } + + p = buf; + do { + out_len = send(client, p, len, 0); + if (out_len < 0) { + printf("error: send: %d\n", errno); + goto error; + } + p += out_len; + len -= out_len; + } while (len); + } + +error: + close(client); + printf("Connection from %s closed\n", addr_str); + } + return 0; +} diff --git a/app/peripheral/net/telnet/CMakeLists.txt b/app/peripheral/net/telnet/CMakeLists.txt new file mode 100644 index 0000000..0d8150f --- /dev/null +++ b/app/peripheral/net/telnet/CMakeLists.txt @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) + +set(EXTRA_ZEPHYR_MODULES "$ENV{ZEPHYR_BASE}/../modules/hal/phytium") +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(telnet) + +FILE(GLOB app_sources src/*.c) +target_sources(app PRIVATE ${app_sources}) diff --git a/app/peripheral/net/telnet/README.md b/app/peripheral/net/telnet/README.md new file mode 100644 index 0000000..b8f0ddb --- /dev/null +++ b/app/peripheral/net/telnet/README.md @@ -0,0 +1,83 @@ +# telnet测试 + +## 1. 例程介绍 + +本例程实现了网络接口的配置和初始化,支持多种网络配置方案,包括静态IPv4地址分配、DHCPv4客户端配置以及IPv6地址配置。这个函数是网络应用程序的入口点,目的是为了展示如何在网络设备上设置不同类型的网络地址。具体的操作步骤包括: + +1. **获取默认网络接口**:通过调用 `net_if_get_default()` 函数获取系统默认的网络接口。 + +2. **配置IPv4地址**(如果启用了CONFIG_NET_IPV4且未启用CONFIG_NET_DHCPV4): + - 如果定义了静态IPv4地址(`CONFIG_NET_CONFIG_MY_IPV4_ADDR`),则调用 `setup_ipv4()` 函数配置该地址到网络接口上。 + - 该函数将静态IPv4地址添加到网络接口,并打印该地址到日志。 + +3. **启动DHCPv4客户端**(如果启用了CONFIG_NET_DHCPV4): + - 调用 `setup_dhcpv4()` 函数启动DHCPv4客户端,以便自动从DHCP服务器获取IPv4地址。 + - 该函数还注册了一个网络管理事件回调,以处理IPv4地址添加事件。当获得DHCP分配的IPv4地址时,它会打印出地址、租约时间、子网掩码和默认网关。 + +4. **配置IPv6地址**(如果启用了CONFIG_NET_IPV6): + - 调用 `setup_ipv6()` 函数配置静态IPv6地址(`CONFIG_NET_CONFIG_MY_IPV6_ADDR`)到网络接口上,并尝试添加一个IPv6组播地址(`MCAST_IP6ADDR`)。 + - 该函数将静态IPv6地址添加到网络接口,并打印该地址到日志。同时,也尝试添加一个IPv6组播地址并进行相应的处理。 + + +## 2. 如何使用例程 + +本例程需要以下硬件, + +- E2000D/Q Demo板 + +### 2.1 硬件配置方法 + +保障串口正常工作后,需要确认网络是否连接好 + +### 2.2 SDK配置方法 + +- 请根据自己的网络环境,修改prj.conf文件中的CONFIG_NET_CONFIG_MY_IPV4_ADDR与CONFIG_NET_CONFIG_MY_IPV6_ADDR 条目为您当前网络环境中分配给开发板的IP. + +- 本例子已经提供好具体的编译指令,以下进行介绍: + +1. ``west build -b e2000q_demo ./ -DOVERLAY_CONFIG=prj.conf``,编译命令, 使用west工具构建当前目录下的Zephyr项目,指定目标板为e2000q_demo,并使用prj.conf配置文件覆盖默认配置 ,最终生成的执行文件将会保存在./build/zephyr/zephyr.elf +2. ``west build -t clean``, 清除缓存 ,使用west工具的clean目标清理Zephyr构建系统可能生成的任何其他临时文件或缓存 + +### 2.3 构建和下载 + +- 编译例程 + +``west build -b e2000q_demo ./ -DOVERLAY_CONFIG=prj.conf`` + +- 编译主机测侧设置重启tftp服务器 + +``` +sudo service tftpd-hpa restart +``` + +- 开发板侧使用bootelf命令跳转 + +``` +setenv ipaddr 192.168.4.20 +setenv serverip 192.168.4.50 +setenv gatewayip 192.168.4.1 +tftpboot 0x90100000 zephyr.elf +bootelf -p 0x90100000 +``` + +### 2.4 输出与实验现象 + +- 所有用例均提供一系列可变配置,可在例程全局变量中修改 + +#### 2.4.1 telnet 例程使用 + +1. 将zephyr.elf 在开发板上加载起来. + +2. 在PC主机上输入以下命令,则可以连接开发板echo服务器: + +``` +telnet 192.168.4.7 +``` + +3. 当PC主机连接成功之后,开发板上会打印以下内容: + +![1713424173372](figs/README/1713424173372.png) + +## 3. 如何解决问题 + +## 4. 修改历史记录 diff --git a/app/peripheral/net/telnet/figs/README/1713424173372.png b/app/peripheral/net/telnet/figs/README/1713424173372.png new file mode 100644 index 0000000000000000000000000000000000000000..383d9c26801ecbcb77b7d7cbd05fb83b7839f057 GIT binary patch literal 12995 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�$R?un^{Ok} zJXMm8_idCCytk-0xv4kis?T*^+R(c`-%Aco45TO7L^P04X1DY8&4>rKWu{y7hH0Q} zzoc8Oa3O>DFhuGg;Yu#-i*SzxVGRpvP2b*8s*TS~-evsFE%um4wM{V#Q^r^3qE$df(ykVgnm%eA?1bN*S>)mg{(bNTCcd;BaO z$D6gU-S~WUh}90?=a(z3S+@2hzadG>hlkg}%FLihZOBA%42E*jlW+M{^|l$&bnRj^ z2SGVMGmcNa#(y5pqNt0<+2A~@) z`^Titl=v^Aaz1S{X#hMOaejhf*W4jFgeDq4CRZ1LJcWPF?f)|**qyNweBM_bJ7LfN Qy8@u9sHIT$((1$i0?b>d-2eap literal 0 HcmV?d00001 diff --git a/app/peripheral/net/telnet/makefile b/app/peripheral/net/telnet/makefile new file mode 100644 index 0000000..7fb9ef2 --- /dev/null +++ b/app/peripheral/net/telnet/makefile @@ -0,0 +1,28 @@ + + +boot_smp: + west build -b e2000q_demo_smp ./ -DOVERLAY_CONFIG=prj.conf + cp ./build/zephyr/zephyr.elf /mnt/d/tftboot/ + cp ./build/zephyr/zephyr.bin /mnt/d/tftboot/ + + +boot: + west build -b e2000q_demo ./ -DOVERLAY_CONFIG=prj.conf + cp ./build/zephyr/zephyr.elf /mnt/d/tftboot/ + cp ./build/zephyr/zephyr.bin /mnt/d/tftboot/ + + +boot_aarch32: + + west build -b e2000q_a32_demo ./ -DOVERLAY_CONFIG=prj.conf + cp ./build/zephyr/zephyr.elf /mnt/d/tftboot/ + cp ./build/zephyr/zephyr.bin /mnt/d/tftboot/ + + +clean: + west build -t clean + rm -rf build + + +gdb: + gdb-multiarch -x .gdbinit \ No newline at end of file diff --git a/app/peripheral/net/telnet/prj.conf b/app/peripheral/net/telnet/prj.conf new file mode 100644 index 0000000..15f29b5 --- /dev/null +++ b/app/peripheral/net/telnet/prj.conf @@ -0,0 +1,69 @@ +CONFIG_PRINTK=y +CONFIG_MAIN_STACK_SIZE=4096 + +CONFIG_NETWORKING=y +CONFIG_NET_IPV6=y +CONFIG_NET_IPV4=y +CONFIG_NET_ARP=y +CONFIG_NET_UDP=y +CONFIG_NET_TCP=y + +CONFIG_NET_DHCPV4=n + +CONFIG_NET_IF_UNICAST_IPV6_ADDR_COUNT=3 +CONFIG_NET_IF_MCAST_IPV6_ADDR_COUNT=2 +CONFIG_NET_MAX_CONTEXTS=20 + +CONFIG_NET_PKT_RX_COUNT=64 +CONFIG_NET_PKT_TX_COUNT=64 +CONFIG_NET_BUF_RX_COUNT=64 +CONFIG_NET_BUF_TX_COUNT=64 +CONFIG_NET_BUF_DATA_SIZE=1500 + + +CONFIG_TEST_RANDOM_GENERATOR=y + +CONFIG_INIT_STACKS=y + + + +CONFIG_NET_CONFIG_SETTINGS=y +CONFIG_NET_CONFIG_MY_IPV6_ADDR="2001:db8::1" +CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.168.4.7" + +CONFIG_NET_SHELL=y +CONFIG_KERNEL_SHELL=y +CONFIG_SHELL_BACKEND_TELNET=y +CONFIG_SHELL_TELNET_SUPPORT_COMMAND=y + + +# SHELL 开关 +CONFIG_SHELL=y +CONFIG_SHELL_LOG_LEVEL_INF=y +CONFIG_SHELL_STACK_SIZE=8192 + + +# enable fragmenting +CONFIG_NET_IPV4_FRAGMENT=y +CONFIG_NET_IPV4_FRAGMENT_MAX_COUNT=16 +CONFIG_NET_IPV4_FRAGMENT_TIMEOUT=1 +CONFIG_NET_IPV4_FRAGMENT_MAX_PKT=64 + +CONFIG_NET_IPV6_FRAGMENT=y +CONFIG_NET_IPV6_FRAGMENT_MAX_COUNT=16 +CONFIG_NET_IPV6_FRAGMENT_TIMEOUT=15 +CONFIG_NET_IPV6_FRAGMENT_MAX_PKT=32 + +CONFIG_NET_TCP_WORKQ_STACK_SIZE=4096 +CONFIG_NET_RX_STACK_SIZE=4096 +CONFIG_NET_MGMT_EVENT_STACK_SIZE=4096 + +# 网络调试信息 +# CONFIG_NET_BUF_LOG=n +# CONFIG_NET_LOG=y +# CONFIG_NET_CONN_LOG_LEVEL_DBG=y +# CONFIG_NET_CONTEXT_LOG_LEVEL_DBG=y +# CONFIG_NET_TCP_LOG_LEVEL_DBG=y +# CONFIG_NET_IPV4_LOG_LEVEL_DBG=y +# CONFIG_NET_IPV6_LOG_LEVEL_DBG=y +# CONFIG_NET_CORE_LOG_LEVEL_DBG=y diff --git a/app/peripheral/net/telnet/sample.yaml b/app/peripheral/net/telnet/sample.yaml new file mode 100644 index 0000000..e5e737c --- /dev/null +++ b/app/peripheral/net/telnet/sample.yaml @@ -0,0 +1,9 @@ +sample: + name: Telnet Server +tests: + sample.net.telnet: + harness: net + depends_on: netif + tags: + - net + - telnet diff --git a/app/peripheral/net/telnet/src/telnet.c b/app/peripheral/net/telnet/src/telnet.c new file mode 100644 index 0000000..e1cc530 --- /dev/null +++ b/app/peripheral/net/telnet/src/telnet.c @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2017 Intel Corporation. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +LOG_MODULE_REGISTER(net_telnet_sample, LOG_LEVEL_DBG); + +#include +#include +#include +#include + +#include +#include +#include + +#if defined(CONFIG_NET_DHCPV4) +static struct net_mgmt_event_callback mgmt_cb; + +static void ipv4_addr_add_handler(struct net_mgmt_event_callback *cb, + uint32_t mgmt_event, + struct net_if *iface) +{ + char hr_addr[NET_IPV4_ADDR_LEN]; + int i = 0; + + if (mgmt_event != NET_EVENT_IPV4_ADDR_ADD) { + /* Spurious callback. */ + return; + } + + for (i = 0; i < NET_IF_MAX_IPV4_ADDR; i++) { + struct net_if_addr *if_addr = + &iface->config.ip.ipv4->unicast[i]; + + if (if_addr->addr_type != NET_ADDR_DHCP || !if_addr->is_used) { + continue; + } + + LOG_INF("IPv4 address: %s", + net_addr_ntop(AF_INET, + &if_addr->address.in_addr, + hr_addr, NET_IPV4_ADDR_LEN)); + LOG_INF("Lease time: %u seconds", + iface->config.dhcpv4.lease_time); + LOG_INF("Subnet: %s", + net_addr_ntop(AF_INET, + &iface->config.ip.ipv4->netmask, + hr_addr, NET_IPV4_ADDR_LEN)); + LOG_INF("Router: %s", + net_addr_ntop(AF_INET, + &iface->config.ip.ipv4->gw, + hr_addr, NET_IPV4_ADDR_LEN)); + break; + } +} + +static void setup_dhcpv4(struct net_if *iface) +{ + LOG_INF("Running dhcpv4 client..."); + + net_mgmt_init_event_callback(&mgmt_cb, ipv4_addr_add_handler, + NET_EVENT_IPV4_ADDR_ADD); + net_mgmt_add_event_callback(&mgmt_cb); + + net_dhcpv4_start(iface); +} + +#else +#define setup_dhcpv4(...) +#endif /* CONFIG_NET_DHCPV4 */ + +#if defined(CONFIG_NET_IPV4) && !defined(CONFIG_NET_DHCPV4) + +#if !defined(CONFIG_NET_CONFIG_MY_IPV4_ADDR) +#error "You need to define an IPv4 Address or enable DHCPv4!" +#endif + +static void setup_ipv4(struct net_if *iface) +{ + char hr_addr[NET_IPV4_ADDR_LEN]; + struct in_addr addr; + + if (net_addr_pton(AF_INET, CONFIG_NET_CONFIG_MY_IPV4_ADDR, &addr)) { + LOG_ERR("Invalid address: %s", CONFIG_NET_CONFIG_MY_IPV4_ADDR); + return; + } + + net_if_ipv4_addr_add(iface, &addr, NET_ADDR_MANUAL, 0); + + LOG_INF("IPv4 address: %s", + net_addr_ntop(AF_INET, &addr, hr_addr, + NET_IPV4_ADDR_LEN)); +} + +#else +#define setup_ipv4(...) +#endif /* CONFIG_NET_IPV4 && !CONFIG_NET_DHCPV4 */ + +#if defined(CONFIG_NET_IPV6) + +#define MCAST_IP6ADDR "ff84::2" + +#ifndef CONFIG_NET_CONFIG_MY_IPV6_ADDR +#error "You need to define an IPv6 Address!" +#endif + +static void setup_ipv6(struct net_if *iface) +{ + char hr_addr[NET_IPV6_ADDR_LEN]; + struct in6_addr addr; + + if (net_addr_pton(AF_INET6, CONFIG_NET_CONFIG_MY_IPV6_ADDR, &addr)) { + LOG_ERR("Invalid address: %s", CONFIG_NET_CONFIG_MY_IPV6_ADDR); + return; + } + + net_if_ipv6_addr_add(iface, &addr, NET_ADDR_MANUAL, 0); + + LOG_INF("IPv6 address: %s", + net_addr_ntop(AF_INET6, &addr, hr_addr, NET_IPV6_ADDR_LEN)); + + if (net_addr_pton(AF_INET6, MCAST_IP6ADDR, &addr)) { + LOG_ERR("Invalid address: %s", MCAST_IP6ADDR); + return; + } + + net_if_ipv6_maddr_add(iface, &addr); +} + +#else +#define setup_ipv6(...) +#endif /* CONFIG_NET_IPV6 */ + +int main(void) +{ + struct net_if *iface = net_if_get_default(); + + LOG_INF("Starting Telnet sample"); + + setup_ipv4(iface); + + setup_dhcpv4(iface); + + setup_ipv6(iface); + return 0; +} diff --git a/app/peripheral/pcie/pcie_ecam_test/.gdbinit b/app/peripheral/pcie/pcie_ecam_test/.gdbinit new file mode 100644 index 0000000..49db8cc --- /dev/null +++ b/app/peripheral/pcie/pcie_ecam_test/.gdbinit @@ -0,0 +1,48 @@ +# increase the default remote timeout in gdb because +# Windows libusb transactions could be slow +set remotetimeout 100000 + +# gdb connect to openocd in port 3333 +target extended-remote localhost:3333 + +# start openocd working queue, monitor followed with openocd command here +monitor init + +# force to use hardware breakpoint, otherwise use software breakpoint +# for e2000d/q, num of hardware breakpoints supposed to be 6 +monitor gdb_breakpoint_override hardware + +# load elf image +load ./build/zephyr/zephyr.elf + +# in case symbols skip load,load agin +file ./build/zephyr/zephyr.elf + +# we can break at the beginning of code by address or by symbol +#break _boot + +# add more breakpoints in application +#break JtagTouchRegisters +#break JtagTouchMemory +# break bubbleSort` +# break JtagPostSort +#break bubbleSortCXX + +# show all breakspoints we before running +# info breakpoints + +# show [-0x10 ~ +0x10 ] range of instructions when breaked +# display /10i $pc-16 + +# start running +# continue +layout src +break boot_banner +# break sdmmc_write_blocks +# break z_arm64_prep_c +# break sdmmc_switch +# break sdmmc_read_csd +# break sdmmc_read_blocks +# break sd_idle +# break sd_send_interface_condition +# continue \ No newline at end of file diff --git a/app/peripheral/pcie/pcie_ecam_test/CMakeLists.txt b/app/peripheral/pcie/pcie_ecam_test/CMakeLists.txt new file mode 100644 index 0000000..6a8231e --- /dev/null +++ b/app/peripheral/pcie/pcie_ecam_test/CMakeLists.txt @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) + +set(EXTRA_ZEPHYR_MODULES "$ENV{ZEPHYR_BASE}/../modules/hal/phytium") +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(pcie_ecam_test) + +FILE(GLOB app_sources src/*.c) +target_sources(app PRIVATE ${app_sources}) + +if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0") +endif() \ No newline at end of file diff --git a/app/peripheral/pcie/pcie_ecam_test/README.md b/app/peripheral/pcie/pcie_ecam_test/README.md new file mode 100644 index 0000000..2ba7239 --- /dev/null +++ b/app/peripheral/pcie/pcie_ecam_test/README.md @@ -0,0 +1,68 @@ +# PCIE ECAM测试 + +## 1. 例程介绍 + +本例程用于测试zephyr原生PCIE ECAM驱动,设备树中pcie相关配置后,驱动会自动进行枚举操作 + +## 2. 如何使用例程 + +本例程需要以下硬件, + +- E2000D/Q Demo板 +- pcie功能性设备或桥设备(转接卡) + +### 2.1 硬件配置方法 + +将pcie功能性设备或桥设备(转接卡)插入开发板对应插槽 + +### 2.2 SDK配置方法 + +- 本例程提供如下编译指令: + +1. ``make boot``,编译命令, 使用west工具构建当前目录下的Zephyr项目,默认指定的目标板为e2000q_demo,可以在makefile文件中修改(如有修改,sample.yaml文件中的相关配置也需要一并修改),并使用prj.conf配置文件覆盖默认配置 ,最终生成的执行文件将会保存在./build/zephyr/zephyr.elf +2. ``make clean``, 清除缓存 ,使用west工具的clean目标清理Zephyr构建系统可能生成的任何其他临时文件或缓存 + +### 2.3 构建和下载 + +- 编译例程 + +``make boot`` + +- 编译主机测侧设置重启tftp服务器 + +``` +sudo service tftpd-hpa restart +``` + +- 开发板侧使用bootelf命令跳转 + +``` +setenv ipaddr 192.168.4.20 +setenv serverip 192.168.4.50 +setenv gatewayip 192.168.4.1 +tftpboot 0x90100000 zephyr.elf +bootelf -p 0x90100000 +``` + +### 2.4 输出与实验现象 + +- 所有用例均提供一系列可变配置,可在例程全局变量中修改 + +### 2.4.1 PCIE ECAM枚举测试 + +进入系统后将出现如下打印,表示BAR空间的分配: + +![pcie_bar_region](figs/README/pcie_bar_region.jpg) + +输入```pcie```,将出现如下打印,表示枚举的结果: + +![pcie_enum_result](figs/README/pcie_enum_result.jpg) + +输入```pcie ls 4:0.0 dump```,将出现如下打印,表示单个pcie(BDF = 4:0.0)设备的配置空间与基本特性展示: + +![pcie_ls_result](figs/README/pcie_ls_result.jpg) + + +## 3. 如何解决问题 + +## 4. 修改历史记录 \ No newline at end of file diff --git a/app/peripheral/pcie/pcie_ecam_test/app.overlay b/app/peripheral/pcie/pcie_ecam_test/app.overlay new file mode 100644 index 0000000..ac8ef20 --- /dev/null +++ b/app/peripheral/pcie/pcie_ecam_test/app.overlay @@ -0,0 +1,11 @@ +&sdhc1 { + status = "disabled"; + sdmmc { + compatible = "zephyr,sdmmc-disk"; + status = "disabled"; + }; +}; + +&pinctrl { + status = "disabled"; +}; \ No newline at end of file diff --git a/app/peripheral/pcie/pcie_ecam_test/figs/README/pcie_bar_region.jpg b/app/peripheral/pcie/pcie_ecam_test/figs/README/pcie_bar_region.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1498878ac2946785664db8327dc5fe87d864cb76 GIT binary patch literal 115857 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�fA;x)?uo{(6y^srmUT96vhX!7}+7n?A#mEiA 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ⅆ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 q;;oiM(NklhRxS00@ZfeG!_wF%7{r$m8+Bmko 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 literal 0 HcmV?d00001 diff --git a/app/peripheral/pcie/pcie_ecam_test/figs/README/pcie_ls_result.jpg b/app/peripheral/pcie/pcie_ecam_test/figs/README/pcie_ls_result.jpg new file mode 100644 index 0000000000000000000000000000000000000000..134e49d7b1669b3950324cd4c4ad5f5d50355f83 GIT binary patch literal 37299 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

8e$uirMr~z{fE+E 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 literal 0 HcmV?d00001 diff --git a/app/peripheral/pcie/pcie_ecam_test/makefile b/app/peripheral/pcie/pcie_ecam_test/makefile new file mode 100644 index 0000000..6e0b985 --- /dev/null +++ b/app/peripheral/pcie/pcie_ecam_test/makefile @@ -0,0 +1,21 @@ +boot: + west build -b e2000q_demo ./ -DOVERLAY_CONFIG=prj.conf + cp ./build/zephyr/zephyr.elf /mnt/d/tftboot/ + cp ./build/zephyr/zephyr.bin /mnt/d/tftboot/ + +boot_smp: + west build -b e2000q_demo_smp ./ -DOVERLAY_CONFIG=prj.conf + cp ./build/zephyr/zephyr.elf /mnt/d/tftboot/ + cp ./build/zephyr/zephyr.bin /mnt/d/tftboot/ + +boot_aarch32: + west build -b e2000q_a32_demo ./ -DOVERLAY_CONFIG=prj.conf + cp ./build/zephyr/zephyr.elf /mnt/d/tftboot/ + cp ./build/zephyr/zephyr.bin /mnt/d/tftboot/ + +clean: + west build -t clean + rm -rf build + +gdb: + gdb-multiarch -x .gdbinit \ No newline at end of file diff --git a/app/peripheral/pcie/pcie_ecam_test/prj.conf b/app/peripheral/pcie/pcie_ecam_test/prj.conf new file mode 100644 index 0000000..4980fcd --- /dev/null +++ b/app/peripheral/pcie/pcie_ecam_test/prj.conf @@ -0,0 +1,20 @@ +CONFIG_DISK_ACCESS=y + +# 开启shell +CONFIG_SHELL=y + +# 开启启动的BANNER +CONFIG_BOOT_BANNER=y + +# PCIE相关 +CONFIG_PCIE=y +CONFIG_PCIE_CONTROLLER=y +CONFIG_PCIE_ECAM=y +CONFIG_PCIE_SHELL=y + +# log相关 +CONFIG_LOG=y +CONFIG_LOG_BUFFER_SIZE=4096 + +# 加大虚拟内存 +CONFIG_KERNEL_VM_SIZE=0x20000000 \ No newline at end of file diff --git a/app/peripheral/pcie/pcie_ecam_test/sample.yaml b/app/peripheral/pcie/pcie_ecam_test/sample.yaml new file mode 100644 index 0000000..bd682f5 --- /dev/null +++ b/app/peripheral/pcie/pcie_ecam_test/sample.yaml @@ -0,0 +1,13 @@ +sample: + description: pcie ecam test + name: pcie ecam test +tests: + sample.peripheral.pcie_ecam_test: + depends_on: pcie + tags: + - pcie + harness: console + platform_allow: + - e2000q_demo + integration_platforms: + - e2000q_demo \ No newline at end of file diff --git a/app/peripheral/pcie/pcie_ecam_test/src/main.c b/app/peripheral/pcie/pcie_ecam_test/src/main.c new file mode 100644 index 0000000..c08b8fa --- /dev/null +++ b/app/peripheral/pcie/pcie_ecam_test/src/main.c @@ -0,0 +1,27 @@ +// Phytium is pleased to support the open source community by making Zephyr-SDK available. + +// +// Copyright (C) 2024 Phytium Technology Co., Ltd. All rights reserved. +// +// Licensed under the Apache-2.0 License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// https://opensource.org/license/apache-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 +#include +#include +#include + +LOG_MODULE_REGISTER(main); + +int main(void) +{ + printf("This is PCIE ecam test example.\r\n"); + return 0 ; +} \ No newline at end of file diff --git a/app/peripheral/sdio/tf_test/.gdbinit b/app/peripheral/sdio/tf_test/.gdbinit new file mode 100644 index 0000000..49db8cc --- /dev/null +++ b/app/peripheral/sdio/tf_test/.gdbinit @@ -0,0 +1,48 @@ +# increase the default remote timeout in gdb because +# Windows libusb transactions could be slow +set remotetimeout 100000 + +# gdb connect to openocd in port 3333 +target extended-remote localhost:3333 + +# start openocd working queue, monitor followed with openocd command here +monitor init + +# force to use hardware breakpoint, otherwise use software breakpoint +# for e2000d/q, num of hardware breakpoints supposed to be 6 +monitor gdb_breakpoint_override hardware + +# load elf image +load ./build/zephyr/zephyr.elf + +# in case symbols skip load,load agin +file ./build/zephyr/zephyr.elf + +# we can break at the beginning of code by address or by symbol +#break _boot + +# add more breakpoints in application +#break JtagTouchRegisters +#break JtagTouchMemory +# break bubbleSort` +# break JtagPostSort +#break bubbleSortCXX + +# show all breakspoints we before running +# info breakpoints + +# show [-0x10 ~ +0x10 ] range of instructions when breaked +# display /10i $pc-16 + +# start running +# continue +layout src +break boot_banner +# break sdmmc_write_blocks +# break z_arm64_prep_c +# break sdmmc_switch +# break sdmmc_read_csd +# break sdmmc_read_blocks +# break sd_idle +# break sd_send_interface_condition +# continue \ No newline at end of file diff --git a/app/peripheral/sdio/tf_test/CMakeLists.txt b/app/peripheral/sdio/tf_test/CMakeLists.txt new file mode 100644 index 0000000..2175f41 --- /dev/null +++ b/app/peripheral/sdio/tf_test/CMakeLists.txt @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) + +set(EXTRA_ZEPHYR_MODULES "$ENV{ZEPHYR_BASE}/../modules/hal/phytium") +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(tf_test) + +FILE(GLOB app_sources src/*.c) +target_sources(app PRIVATE ${app_sources}) diff --git a/app/peripheral/sdio/tf_test/README.docx b/app/peripheral/sdio/tf_test/README.docx new file mode 100644 index 0000000000000000000000000000000000000000..4f21a584b398805a77b6437261b29f6b098b5887 GIT binary patch literal 55768 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 literal 0 HcmV?d00001 diff --git a/app/peripheral/sdio/tf_test/README.md b/app/peripheral/sdio/tf_test/README.md new file mode 100644 index 0000000..0a3200c --- /dev/null +++ b/app/peripheral/sdio/tf_test/README.md @@ -0,0 +1,70 @@ +# TF卡测试 + +## 1. 例程介绍 + +函数 `sd_perf_test` 是设计用来执行SD卡性能测试的,具体测试包括写入速度和读取速度。这一功能通过向SD卡写入预定的数据块,然后再读取这些数据块来实现,整个过程中计算并展示写入和读取的速度。测试的详细步骤如下: + +1. 验证SDHC(Secure Digital High Capacity)设备是否准备就绪,并确认SD卡是否存在。 +2. 初始化SD卡并获取其扇区(sector)的大小和数量。 +3. 准备写入缓冲区,这里模拟的是将一系列的数据填充进缓冲区。 +4. 进行数据写入操作。这一步中,数据被分批写入SD卡。每次写入一定数量的块(block),直到达到预定的总块数。在写入过程中,展示进度条以反映当前的进度。 +5. 计算写入数据所需的总时间,并据此计算写入速度(单位为MB/s)。 +6. 进行数据读取操作。类似于写入过程,数据也是分批读取的。在读取过程中,同样展示进度条以反映当前进度。 +7. 计算读取数据所需的总时间,并据此计算读取速度(单位为MB/s)。 +8. 读取数据后,对比原始数据和读取后的数据以验证数据的一致性。如果发现数据不一致,表示在写入或读取过程中发生了错误。 +9. 如果所有数据块都被成功写入和读取,且数据一致性验证通过,则输出测试成功的消息,并展示写入和读取速度。 + +## 2. 如何使用例程 + +本例程需要以下硬件, + +- E2000D/Q Demo板 + +### 2.1 硬件配置方法 + +保障串口正常工作后,需要插入一张 SDHC/SDXC 存储卡 + +### 2.2 SDK配置方法 + +- 本例子已经提供好具体的编译指令,以下进行介绍: + +1. ``west build -b e2000q_demo ./ -DOVERLAY_CONFIG=prj.conf``,编译命令, 使用west工具构建当前目录下的Zephyr项目,指定目标板为e2000q_demo,并使用prj.conf配置文件覆盖默认配置 ,最终生成的执行文件将会保存在./build/zephyr/zephyr.elf +2. ``west build -t clean``, 清除缓存 ,使用west工具的clean目标清理Zephyr构建系统可能生成的任何其他临时文件或缓存 + +### 2.3 构建和下载 + +- 编译例程 + +``west build -b e2000q_demo ./ -DOVERLAY_CONFIG=prj.conf`` + +- 编译主机测侧设置重启tftp服务器 + +``` +sudo service tftpd-hpa restart +``` + +- 开发板侧使用bootelf命令跳转 + +``` +setenv ipaddr 192.168.4.20 +setenv serverip 192.168.4.50 +setenv gatewayip 192.168.4.1 +tftpboot 0x90100000 zephyr.elf +bootelf -p 0x90100000 +``` + +### 2.4 输出与实验现象 + +- 所有用例均提供一系列可变配置,可在例程全局变量中修改 + +### 2.4.1 SD 速度测试 + +``` +sdtest +``` + +![1713411631705](figs/README/1713411631705.png) + +## 3. 如何解决问题 + +## 4. 修改历史记录 diff --git a/app/peripheral/sdio/tf_test/figs/README/1713411631705.png b/app/peripheral/sdio/tf_test/figs/README/1713411631705.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e8e42b331b044ddbabc4a564b0d34db73de649 GIT binary patch literal 32610 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 +#include +#include +#include +#include +#include + +LOG_MODULE_REGISTER(main); + +#define MB_SIZE (1024*1024) +#define SD_TOTAL_MB 1 +#define SD_TOTAL_MB_SIZE (SD_TOTAL_MB*MB_SIZE) +#define SD_BLOCK_SIZE 512UL /* most tested sd memory cards have 512 block size by default */ + +#define WRITE_BLOCKS 1024 // 这里假设每次写入40块,即20KB +#define TOTAL_BLOCKS SD_TOTAL_MB_SIZE / SD_BLOCK_SIZE // 总共要写入20MB数据 + +uint8_t write_buf[SD_BLOCK_SIZE * WRITE_BLOCKS] __attribute__((aligned(CONFIG_SDHC_BUFFER_ALIGNMENT))) ; +uint8_t read_buf[SD_BLOCK_SIZE * WRITE_BLOCKS] __attribute__((aligned(CONFIG_SDHC_BUFFER_ALIGNMENT))) ; + + +// 函数用于打印进度条 +void print_progress(int current, int total) { + int progress = current * 100 / total; + printf("\rProgress: %d%% [", progress); + for (int i = 0; i < 100; i += 10) { + if (i < progress) { + printf("="); + } else if (i == progress) { + printf(">"); + } else { + printf(" "); + } + } + printf("]"); + fflush(stdout); // 确保即时打印到控制台 +} + + +void sd_perf_test(const struct shell *shell, size_t argc, char **argv) +{ + struct sd_card card; + int ret; + const struct device *const sdhc_dev = DEVICE_DT_GET(DT_NODELABEL(sdhc1)); + uint32_t sector_size; + uint32_t sector_count; + int64_t start_time, end_time; + double write_duration, read_duration, write_speed, read_speed; + + if(!device_is_ready(sdhc_dev)) + { + LOG_ERR("Sd device is not ready"); + } + + ret = sd_is_card_present(sdhc_dev); + if(!ret) + { + LOG_ERR("SD card not present in slot"); + } + + ret = sd_init(sdhc_dev, &card); + if(ret) + { + LOG_ERR("SD card sd_init is not ok \r\n"); + } + + ret = sdmmc_ioctl(&card, DISK_IOCTL_GET_SECTOR_COUNT, §or_count); + printf("SD card reports sector count of %d\n", sector_count); + + ret = sdmmc_ioctl(&card, DISK_IOCTL_GET_SECTOR_SIZE, §or_size); + printf("SD card reports sector size of %d\n", sector_size); + + // 初始化write_buf + for (int i = 0; i < sizeof(write_buf); ++i) { + write_buf[i] = i % 256; + } + + // 写入数据 + printf("Writing data...\n"); + start_time = k_uptime_get(); + for (int i = 0; i < TOTAL_BLOCKS / WRITE_BLOCKS; ++i) + { + if (sdmmc_write_blocks(&card, write_buf, i * WRITE_BLOCKS, WRITE_BLOCKS) != 0) { + printf("Write failed at block %d\n", i * WRITE_BLOCKS); + return; + } + print_progress(i + 1, TOTAL_BLOCKS / WRITE_BLOCKS); + } + end_time = k_uptime_get(); + printf("\nWrite completed.\n"); + write_duration = (end_time - start_time) / 1000.0; // 将毫秒转换为秒 + printf("\nWrite completed in %.2f seconds.\n", write_duration); + write_speed = SD_TOTAL_MB / write_duration; // 计算写速度,单位MB/s + printf("\nWrite completed in %.2f seconds at %.2f MB/s.\n", write_duration, write_speed); + + // 读取并验证数据 + printf("Reading data...\n"); + start_time = k_uptime_get(); + for (int i = 0; i < TOTAL_BLOCKS / WRITE_BLOCKS; ++i) + { + if (sdmmc_read_blocks(&card, read_buf, i * WRITE_BLOCKS, WRITE_BLOCKS) != 0) { + printf("Read failed at block %d\n", i * WRITE_BLOCKS); + return; + } + + print_progress(i + 1, TOTAL_BLOCKS / WRITE_BLOCKS); + } + end_time = k_uptime_get(); + read_duration = (end_time - start_time) / 1000.0; // 将毫秒转换为秒 + printf("\nRead completed in %.2f seconds.\n", read_duration); + read_speed = SD_TOTAL_MB / read_duration; // 计算读速度,单位MB/s + printf("\nRead completed in %.2f seconds at %.2f MB/s.\n", read_duration, read_speed); + + + for (int i = 0; i < TOTAL_BLOCKS / WRITE_BLOCKS; ++i) + { + memset(read_buf, 0, sizeof(read_buf)); + if (sdmmc_read_blocks(&card, read_buf, i * WRITE_BLOCKS, WRITE_BLOCKS) != 0) { + printf("Read failed at block %d\n", i * WRITE_BLOCKS); + return; + } + + if (memcmp(write_buf, read_buf, SD_BLOCK_SIZE * WRITE_BLOCKS) != 0) { + printf("Data mismatch detected at block %d\n", i * WRITE_BLOCKS); + return; + } + } + + + printf("\n SDHC performance test completed successfully.\n"); + + return ; +} + + +SHELL_CMD_ARG_REGISTER(sdtest, NULL, "Start SD card performance test", sd_perf_test, 1, 0); + +int main(void) +{ + return 0 ; +} diff --git a/app/system/interrupt/.gdbinit b/app/system/interrupt/.gdbinit new file mode 100644 index 0000000..3fbb1f2 --- /dev/null +++ b/app/system/interrupt/.gdbinit @@ -0,0 +1,48 @@ +# increase the default remote timeout in gdb because +# Windows libusb transactions could be slow +set remotetimeout 100000 + +# gdb connect to openocd in port 3333 +target extended-remote localhost:3333 + +# start openocd working queue, monitor followed with openocd command here +monitor init + +# force to use hardware breakpoint, otherwise use software breakpoint +# for e2000d/q, num of hardware breakpoints supposed to be 6 +monitor gdb_breakpoint_override hardware + +# load elf image +load ./build/zephyr/zephyr.elf + +# in case symbols skip load,load agin +file ./build/zephyr/zephyr.elf + +# we can break at the beginning of code by address or by symbol +#break _boot + +# add more breakpoints in application +#break JtagTouchRegisters +#break JtagTouchMemory +# break bubbleSort` +# break JtagPostSort +#break bubbleSortCXX + +# show all breakspoints we before running +# info breakpoints + +# show [-0x10 ~ +0x10 ] range of instructions when breaked +# display /10i $pc-16 + +# start running +# continue +layout src +# break boot_banner +# break sdmmc_write_blocks +# break z_arm64_prep_c +# break sdmmc_switch +# break sdmmc_read_csd +# break sdmmc_read_blocks +# break sd_idle +# break sd_send_interface_condition +# continue \ No newline at end of file diff --git a/app/system/interrupt/CMakeLists.txt b/app/system/interrupt/CMakeLists.txt new file mode 100644 index 0000000..16f5087 --- /dev/null +++ b/app/system/interrupt/CMakeLists.txt @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(interrupt) + +FILE(GLOB app_sources src/*.c) +target_sources(app PRIVATE ${app_sources}) + +# target_include_directories(app PRIVATE +# ${ZEPHYR_BASE}/kernel/include +# ${ZEPHYR_BASE}/arch/${ARCH}/include +# ) + +# target_sources(app PRIVATE +# src/prevent_irq.c +# src/nested_irq.c +# src/main.c +# ) + +# target_sources_ifdef(CONFIG_DYNAMIC_INTERRUPTS app PRIVATE src/dynamic_isr.c) +# target_sources_ifdef(CONFIG_X86 app PRIVATE src/regular_isr.c) +# target_sources_ifdef(CONFIG_SHARED_INTERRUPTS app PRIVATE src/static_shared_irq.c) + +# if (CONFIG_SHARED_INTERRUPTS) +# target_sources_ifdef(CONFIG_DYNAMIC_INTERRUPTS app PRIVATE src/dynamic_shared_irq.c) +# endif() diff --git a/app/system/interrupt/README.md b/app/system/interrupt/README.md new file mode 100644 index 0000000..ef30f04 --- /dev/null +++ b/app/system/interrupt/README.md @@ -0,0 +1,158 @@ +# Interrupt 测试 + +## 1. 例程介绍 + +### dynamic_isr.c + +`test_isr_dynamic`函数的目的是验证动态中断服务例程(ISR)安装的功能。这是内核中断测试的一部分,特别是在支持动态中断连接的系统上非常关键。以下是该测试函数完成的主要验证步骤: + +1. **查找未使用的软件ISR表项**:该测试通过遍历软件ISR表(`_sw_isr_table`),寻找一个未被使用的项,即其中断服务例程指针等于 `z_irq_spurious`的项。`z_irq_spurious`是一个用于处理无效或未配置的中断的“伪”ISR。 +2. **安装动态ISR**:找到未使用的表项后,测试使用 `arch_irq_connect_dynamic`函数安装一个新的动态ISR。该函数允许在运行时动态地连接中断服务例程,不需要在编译时预先定义。测试中,动态ISR为 `dyn_isr`函数,它接受一个指向整数 `i`的指针作为参数。 +3. **验证ISR安装成功**:安装动态ISR后,测试通过检查软件ISR表的相应项来验证ISR是否成功安装。成功的标志是表项的中断服务例程指针等于 `dyn_isr`,并且参数 `arg`与传递给 `arch_irq_connect_dynamic`的参数相匹配。 + +### dynamic_shared_irq.c + +- test_dynamic_shared_irq_disconnect_write + +此函数的目标是验证动态共享中断(ISR)在断开(disconnect)一个ISR/arg对后的行为。测试流程如下: + +1. **预先设置**:首先确保中断服务例程(ISR)通过之前的设置步骤已经被动态地注册到了指定的IRQ位置。 +2. **中断解除共享**:通过调用 `arch_irq_disconnect_dynamic`函数,从共享的中断源中移除一个特定的ISR/arg对。此操作后,中断应该不再被视为“共享”的,因为它只剩下一个ISR/arg对。 +3. **验证中断解除共享后的状态**:检查软件ISR表(`_sw_isr_table`)中的项是否更新为剩余的ISR/arg对,确保中断现在直接连接到了剩余的ISR,而不是通过共享机制。 +4. **触发中断**:使能并触发中断,然后验证剩余的ISR是否被正确调用。 +5. **检查结果**:对比预期结果和实际调用情况,确保只有剩余的ISR/arg对被调用,其他ISR没有被误调。 + +- test_dynamic_shared_irq_write + +此函数的目的是测试动态共享中断在多个ISR/arg对注册后的行为。具体测试步骤包括: + +1. **预先设置**:与上一个测试类似,确保通过之前的设置步骤,已经有多个ISR被动态地注册到指定的IRQ。 +2. **触发中断**:使能并触发相关的两个中断(`fixture.irq1`和 `fixture.irq2`),这两个中断分别有不同的ISR/arg对注册。 +3. **延时等待**:提供足够的时间确保中断处理完成。 +4. **检查执行结果**:验证预期的ISR/arg对是否都被按顺序正确调用。这包括检查全局变量 `test_vector`与预期的结果 `result_vector`是否匹配,以此来确保每个注册的ISR都按预期执行了。 + +- nested_irq.c + +`test_nested_isr`函数主要目的是验证中断嵌套的功能。中断嵌套允许一个正在执行的中断服务例程(ISR)被更高优先级的中断打断,当高优先级的ISR处理完成后,较低优先级的ISR继续执行。这是实时操作系统(RTOS)中一个重要的特性,确保系统能够响应更紧急的任务,同时保持较低优先级任务的状态。以下是该测试函数执行的关键步骤: + +1. **初始化**:确定用于测试的两个中断线(IRQs)编号。这些中断被分配了不同的优先级,其中 `irq_line_0`具有较低的优先级,而 `irq_line_1`具有更高的优先级。 +2. **连接并启用中断**:使用 `arch_irq_connect_dynamic`函数动态地连接两个中断服务例程(`isr0`和 `isr1`)到对应的中断线,并使能这些中断。这一步确保当中断触发时,对应的ISR能够被执行。 +3. **触发较低优先级的中断**:通过 `trigger_irq`函数触发 `irq_line_0`,启动 `isr0`的执行。在 `isr0`中,首先设置验证令牌 `isr0_result`,然后触发更高优先级的 `irq_line_1`,启动 `isr1`的执行。 +4. **执行较高优先级的ISR**:在 `isr1`中,设置验证令牌 `isr1_result`并返回。此时,由于 `isr1`具有更高的优先级,`isr0`的执行将被暂停,直到 `isr1`执行完成。 +5. **中断嵌套验证**:在 `isr0`中继续执行,验证 `isr1_result`令牌确保 `isr1`已经成功执行。然后,`isr0`完成剩余的处理并返回。 +6. **最终结果验证**:在测试线程中,验证 `isr0_result`令牌以确保 `isr0`也已经成功执行。 + +### prevent_irq.c + +`test_prevent_interruption`函数的主要目的是验证内核是否能够有效地阻止中断的发生。这是通过锁定中断并进行忙等待(busy-wait)来实现的,以检验系统计时器中断在中断锁定期间是否被处理;此外,这个测试还验证了在解锁中断后系统计时器中断是否能被正确处理。以下是该测试执行的关键步骤: + +1. **锁定中断**:使用 `irq_lock`函数锁定系统中断。这一步骤是为了阻止任何中断的发生,包括系统计时器中断。 +2. **初始化并启动计时器**:通过 `k_timer_init`和 `k_timer_start`函数初始化并启动一个计时器。计时器在指定的延迟后应触发 `timer_handler`函数。 +3. **忙等待**:在中断锁定的状态下执行忙等待一段时间。如果中断没有被锁定,这段时间内计时器的中断应该会触发。但由于中断被锁定,我们预期 `timer_handler`中设置的 `handler_result`不会在此期间被更新。 +4. **验证计时器中断是否被锁定**:检查 `handler_result`变量,确认在中断锁定期间计时器的中断处理程序是否没有被执行。如果 `handler_result`在忙等待期间未被更新,则表明计时器中断未被处理,验证了中断锁定的有效性。 +5. **解锁中断**:使用 `irq_unlock`函数解锁中断。此操作后,之前锁定的中断应该能够被处理。 +6. **再次忙等待**:在解锁中断后再次执行忙等待,以便系统有机会处理任何挂起的中断,特别是我们之前启动的计时器中断。 +7. **验证计时器中断是否被处理**:再次检查 `handler_result`变量,确认在解锁中断后计时器的中断处理程序是否被执行。如果此时 `handler_result`被更新为预期的令牌,则表明在解锁中断后计时器中断被正确处理。 + +### static_shared_irq.c + +`test_static_shared_irq_write` 函数的主要目的是验证静态共享中断(static shared interrupts)的功能。这个测试检验了是否可以成功地共享中断,即当触发了它们注册的中断时,是否能调用多个中断服务程序(ISR)及其参数(arg)对。 + +### 功能验证步骤: + +1. **中断连接**:通过 `IRQ_CONNECT`宏,函数连接了两个不同的ISR(`test_isr_0` 和 `test_isr_1`)到同一个中断号 `GIC_IRQ1`上,并连接了 `test_isr_2`到另一个中断号 `GIC_IRQ2`上。这模拟了在实际应用中,多个设备可能需要在同一个中断线上注册它们的处理函数的场景。 +2. **中断验证**:函数验证了在 `_sw_isr_table`中对应 `GIC_IRQ1`的条目是否正确地设置为了共享中断处理函数 `z_shared_isr`,并且 `GIC_IRQ2`是否保留了它的原始ISR(`test_isr_2`)。 +3. **参数验证**:进一步验证了 `_sw_isr_table`中 `GIC_IRQ1`和 `GIC_IRQ2`对应条目的参数(arg)是否正确设置。特别是对于 `GIC_IRQ1`,期望它的参数指向共享ISR表中的一个条目,而 `GIC_IRQ2`的参数应直接是 `test_isr_2`的参数。 +4. **客户端数量验证**:检查了与 `GIC_IRQ1`关联的共享ISR条目中的客户端数量是否正确地反映了两个ISR的注册,以及 `GIC_IRQ2`是否没有共享客户端,因为它没有共享ISR。 +5. **触发中断**:通过 `trigger_irq`函数触发了 `GIC_IRQ1`和 `GIC_IRQ2`对应的中断,并等待一段时间,以便ISR有机会执行。 +6. **结果验证**:通过比较 `test_vector`和 `result_vector`的值,验证了当中断被触发时,所有注册的ISR是否都被正确地执行了。这个向量数组用于记录ISR执行的验证标记,以确保它们如预期那样被调用。 +7. **中断禁用与断开连接**:最后,通过 `irq_disable`和 `arch_irq_disconnect_dynamic`函数禁用并断开之前连接的ISR,以清理测试环境。 + +## 2. 如何使用例程 + +本例程需要以下硬件, + +- E2000D/Q Demo板 + +### 2.1 硬件配置方法 + +保障串口正常工作后,不需要额外配置硬件 + +### 2.2 SDK配置方法 + +- 本例子已经提供好具体的编译指令,以下进行介绍: + +1. ``west build -b e2000q_demo_smp ./ -DOVERLAY_CONFIG=prj.conf``,编译命令, 使用west工具构建当前目录下的Zephyr项目,指定目标板为e2000q_demo_smp,并使用prj.conf配置文件覆盖默认配置 ,最终生成的执行文件将会保存在./build/zephyr/zephyr.elf +2. ``west build -t clean``, 清除缓存 ,使用west工具的clean目标清理Zephyr构建系统可能生成的任何其他临时文件或缓存 + +### 2.3 构建和下载 + +- 编译例程 + +``west build -b e2000q_demo_smp ./ -DOVERLAY_CONFIG=prj.conf`` + +- 编译主机测侧设置重启tftp服务器 + +``` +sudo service tftpd-hpa restart +``` + +- 开发板侧使用bootelf命令跳转 + +``` +setenv ipaddr 192.168.4.20 +setenv serverip 192.168.4.50 +setenv gatewayip 192.168.4.1 +tftpboot 0x90100000 zephyr.elf +bootelf -p 0x90100000 +``` + +### 2.4 输出与实验现象 + +- 所有用例均提供一系列可变配置,可在例程全局变量中修改 + +#### 2.4.1 测试动态ISR + +``` +isr_test dynamic_isr +``` + +![dynamic_isr_result](figs/README/1713410482686.png) + +#### 2.4.2 测试动态共享IRQ + +``` +isr_test dynamic_shared_irq +``` + +![dynamic_shared_irq_result](figs/README/1713410509524.png) + +#### 2.4.3 测试嵌套ISR + +``` +isr_test nested_irq +``` + +![nested_irq_result](figs/README/1713410560510.png) + +#### 2.4.4 测试中断防护 + +``` +isr_test prevent_irq +``` + +![prevent_irq_result](figs/README/1713410586639.png) + +#### 2.4.5 测试静态共享IRQ写入 + +``` +isr_test static_shared_irq +``` + +![static_shared_irq_result](figs/README/1713410631027.png) + + +## 3. 如何解决问题 + + +## 4. 修改历史记录 diff --git a/app/system/interrupt/figs/README/1713410482686.png b/app/system/interrupt/figs/README/1713410482686.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e8ad01f122f40c60470247d0990ce1f13180bc GIT binary patch literal 12113 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

Ku32LOj?C4cDjVkaKTNLKF$`E@E<|1bEouq*U24 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

!6X1aUDqgHvFx7VkV8Aj2L%c-?4gVuWE%deQ(T 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ȍ<22COTbI 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 P8%R=APNYi6AmIN1tM>{W literal 0 HcmV?d00001 diff --git a/app/system/interrupt/figs/README/1713410631027.png b/app/system/interrupt/figs/README/1713410631027.png new file mode 100644 index 0000000000000000000000000000000000000000..378c206f86faeb12dab83cefc5b6bf004de472fe GIT binary patch literal 55616 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 +#include "interrupt_util.h" + +#define ISR_DYN_ARG 0xab249cfd + +static unsigned int handler_has_run; +static uintptr_t handler_test_result; + +static void dyn_isr(const void *arg) +{ + ARG_UNUSED(arg); + handler_test_result = (uintptr_t)arg; + handler_has_run++; +} + + +extern struct _isr_table_entry _sw_isr_table[]; + +/** + * @brief Test dynamic ISR installation + * + * @ingroup kernel_interrupt_tests + * + * @details This routine locates an unused entry in the software ISR table, + * installs a dynamic ISR to the unused entry by calling the dynamic + * configured function, and verifies that the ISR is successfully installed + * by checking the software ISR table entry. + * + * @see arch_irq_connect_dynamic() + */ +void test_isr_dynamic(void) +{ + int i; + const void *argval; + + for (i = 0; i < (CONFIG_NUM_IRQS - CONFIG_GEN_IRQ_START_VECTOR); i++) { + if (_sw_isr_table[i].isr == z_irq_spurious) { + break; + } + } + + if (!(_sw_isr_table[i].isr == z_irq_spurious)) { + printk("ERROR: Could not find slot for dynamic ISR.\n"); + } else { + printk("SUCCESS: Found slot for dynamic ISR at %d.\n", CONFIG_GEN_IRQ_START_VECTOR + i); + } + + printk("installing dynamic ISR for IRQ %d\n", + CONFIG_GEN_IRQ_START_VECTOR + i); + + argval = (const void *)&i; + arch_irq_connect_dynamic(i + CONFIG_GEN_IRQ_START_VECTOR, 0, dyn_isr, + argval, 0); + + if (!(_sw_isr_table[i].isr == dyn_isr && _sw_isr_table[i].arg == argval)) { + printk("ERROR: Dynamic ISR did not install successfully.\n"); + } else { + printk("SUCCESS: Dynamic ISR installed successfully for IRQ %d.\n", CONFIG_GEN_IRQ_START_VECTOR + i); + } +} diff --git a/app/system/interrupt/src/dynamic_shared_irq.c b/app/system/interrupt/src/dynamic_shared_irq.c new file mode 100644 index 0000000..22b9333 --- /dev/null +++ b/app/system/interrupt/src/dynamic_shared_irq.c @@ -0,0 +1,292 @@ +/* + * Copyright 2023 NXP + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include "test_shared_irq.h" + +struct shared_irq_fixture { + unsigned int irq1; + unsigned int irq2; + unsigned int irq1_table_idx; + unsigned int irq2_table_idx; + unsigned int irq_priority; +}; + +static struct shared_irq_fixture fixture; + +static void reset_test_vector(void) +{ + int i; + + for (i = 0; i < TEST_VECTOR_SIZE; i++) { + test_vector[i] = 0; + } +} + +static void dynamic_shared_irq_suite_after(void *data) +{ + ARG_UNUSED(data); + + /* note: no need to check the state of the SW ISR tables after + * all these disconnect operations. If there's something wrong + * it should be detected by dynamic_shared_irq_suite_before(). + */ + arch_irq_disconnect_dynamic(fixture.irq1, fixture.irq_priority, + test_isr_0, 0, 0); + arch_irq_disconnect_dynamic(fixture.irq1, fixture.irq_priority, + test_isr_1, (void *)1, 0); + arch_irq_disconnect_dynamic(fixture.irq2, fixture.irq_priority, + test_isr_2, (void *)2, 0); +} + +static void dummy_isr(const void *data) +{ + ARG_UNUSED(data); + + test_vector[0] = TEST_DUMMY_ISR_VAL; +} + +static unsigned int get_irq_slot(unsigned int start) +{ + unsigned int i, table_idx; + + for (i = start; i <= CONFIG_GEN_IRQ_START_VECTOR + CONFIG_NUM_IRQS - 1; i++) { + table_idx = i - CONFIG_GEN_IRQ_START_VECTOR; + + if (_sw_isr_table[table_idx].isr == &z_irq_spurious) { + test_vector[0] = 0; + + /* check to see if we can trigger this IRQ */ + arch_irq_connect_dynamic(i, IRQ_PRIORITY, dummy_isr, + NULL, 0); + irq_enable(i); + trigger_irq(i); + + /* wait a bit */ + k_busy_wait(100); + + if (test_vector[0] == TEST_DUMMY_ISR_VAL) { + /* found a valid INTID */ + irq_disable(i); + + arch_irq_disconnect_dynamic(i, IRQ_PRIORITY, + dummy_isr, NULL, 0); + return i; + } + } + } + + return TEST_INVALID_IRQ; +} + +static void *dynamic_shared_irq_suite_setup(void) +{ + fixture.irq1 = get_irq_slot(CONFIG_GEN_IRQ_START_VECTOR); + + if (fixture.irq1 == TEST_INVALID_IRQ) { + printk("ERROR: No suitable value found for irq1.\n"); + } else { + printk("SUCCESS: Suitable value found for irq1: %d\n", fixture.irq1); + } + + fixture.irq2 = get_irq_slot(fixture.irq1 + 1); + + if (fixture.irq2 == TEST_INVALID_IRQ) { + printk("ERROR: No suitable value found for irq2.\n"); + } else { + printk("SUCCESS: Suitable value found for irq2: %d\n", fixture.irq2); + } + fixture.irq_priority = IRQ_PRIORITY; + + fixture.irq1_table_idx = fixture.irq1 - CONFIG_GEN_IRQ_START_VECTOR; + fixture.irq2_table_idx = fixture.irq2 - CONFIG_GEN_IRQ_START_VECTOR; + + return NULL; +} + +static void dynamic_shared_irq_suite_before(void *data) +{ + ARG_UNUSED(data); + + arch_irq_connect_dynamic(fixture.irq1, fixture.irq_priority, + test_isr_0, 0, 0); + + + if (_sw_isr_table[fixture.irq1_table_idx].isr != test_isr_0) { + printk("ERROR: Wrong _sw_isr_table ISR at irq1.\n"); + } else { + printk("SUCCESS: Correct _sw_isr_table ISR at irq1.\n"); + } + + if (_sw_isr_table[fixture.irq1_table_idx].arg) { + printk("ERROR: Wrong _sw_isr_table argument at irq1.\n"); + } else { + printk("SUCCESS: Correct _sw_isr_table argument at irq1.\n"); + } + + if (z_shared_sw_isr_table[fixture.irq1_table_idx].client_num != 0) { + printk("ERROR: Wrong client number at irq1.\n"); + } else { + printk("SUCCESS: Correct client number at irq1.\n"); + } + + arch_irq_connect_dynamic(fixture.irq1, fixture.irq_priority, + test_isr_1, (void *)1, 0); + + + if (_sw_isr_table[fixture.irq1_table_idx].isr != z_shared_isr) { + printk("ERROR: Wrong _sw_isr_table ISR at irq1 after second registration.\n"); + } else { + printk("SUCCESS: Correct _sw_isr_table ISR at irq1 after second registration.\n"); + } + + if (_sw_isr_table[fixture.irq1_table_idx].arg != &z_shared_sw_isr_table[fixture.irq1_table_idx]) { + printk("ERROR: Wrong _sw_isr_table argument at irq1 after second registration.\n"); + } else { + printk("SUCCESS: Correct _sw_isr_table argument at irq1 after second registration.\n"); + } + + if (z_shared_sw_isr_table[fixture.irq1_table_idx].client_num != 2) { + printk("ERROR: Incorrect client number at irq1 after second registration; expected 2, got %zu.\n", z_shared_sw_isr_table[fixture.irq1_table_idx].client_num); + } else { + printk("SUCCESS: Correct client number at irq1 after second registration.\n"); + } + + + + arch_irq_connect_dynamic(fixture.irq2, fixture.irq_priority, + test_isr_2, (void *)2, 0); + + if (_sw_isr_table[fixture.irq2_table_idx].isr != test_isr_2) { + printk("ERROR: Wrong _sw_isr_table ISR at irq2.\n"); + } else { + printk("SUCCESS: Correct _sw_isr_table ISR installed for irq2.\n"); + } + + if (_sw_isr_table[fixture.irq2_table_idx].arg != (void *)2) { + printk("ERROR: Wrong _sw_isr_table argument at irq2; expected (void *)2, got %p.\n", _sw_isr_table[fixture.irq2_table_idx].arg); + } else { + printk("SUCCESS: Correct _sw_isr_table argument set for irq2.\n"); + } + + if (z_shared_sw_isr_table[fixture.irq2_table_idx].client_num != 0) { + printk("ERROR: Incorrect client number at irq2; expected 0, got %zu.\n", z_shared_sw_isr_table[fixture.irq2_table_idx].client_num); + } else { + printk("SUCCESS: Correct client number at irq2, no shared ISR clients.\n"); + } + + + reset_test_vector(); +} + +/** + * @brief Test writing to a vector with a shared interrupt + * + * @ingroup kernel_interrupt_tests + * + * @details This tests if interrupts are dynamically shared successfully + * (i.e: multiple ISR/arg pairs are called whenever the interrupt + * they were registered for is triggered). + */ +void test_dynamic_shared_irq_write(void) +{ + int i; + + irq_enable(fixture.irq1); + irq_enable(fixture.irq2); + + trigger_irq(fixture.irq1); + trigger_irq(fixture.irq2); + + /* wait 5ms before checking the results */ + k_busy_wait(5000); + + for (i = 0; i < TEST_VECTOR_SIZE; i++) { + if (test_vector[i] != result_vector[i]) { + printk("ERROR: Wrong test_vector value at %d: 0x%x vs 0x%x\n", i, test_vector[i], result_vector[i]); + } else { + printk("SUCCESS: Correct test_vector value at %d: 0x%x\n", i, test_vector[i]); + } + } + + irq_disable(fixture.irq1); + irq_disable(fixture.irq2); +} + +/** + * @brief Test writing to a vector after an ISR/arg disconnect. + * + * @ingroup kernel_interrupt_tests + * + * @details This tests if ISR/arg pairs are disconnected successfully + * and the interrupts are "unshared" whenever a single ISR/arg pair is + * left. + */ +void test_dynamic_shared_irq_disconnect_write(void) +{ + int i; + + /* remove test_isr_0/NULL pair. After this statement we expect + * irq1 to be unshared. + */ + arch_irq_disconnect_dynamic(fixture.irq1, fixture.irq_priority, + test_isr_0, 0, 0); + + if (_sw_isr_table[fixture.irq1_table_idx].isr != test_isr_1) { + printk("ERROR: Wrong _sw_isr_table ISR at irq1 after unsharing.\n"); + } else { + printk("SUCCESS: Correct _sw_isr_table ISR at irq1 after unsharing.\n"); + } + + if (_sw_isr_table[fixture.irq1_table_idx].arg != (void *)1) { + printk("ERROR: Wrong _sw_isr_table arg at irq1 after unsharing; expected (void *)1, got %p.\n", _sw_isr_table[fixture.irq1_table_idx].arg); + } else { + printk("SUCCESS: Correct _sw_isr_table arg at irq1 after unsharing.\n"); + } + + if (z_shared_sw_isr_table[fixture.irq1_table_idx].client_num != 0) { + printk("ERROR: Wrong client number at irq1 after unsharing; expected 0, got %zu.\n", z_shared_sw_isr_table[fixture.irq1_table_idx].client_num); + } else { + printk("SUCCESS: Correct client number at irq1 after unsharing, no clients left.\n"); + } + + irq_enable(fixture.irq1); + trigger_irq(fixture.irq1); + + /* wait 5ms before checking the results */ + k_busy_wait(5000); + + for (i = 0; i < TEST_VECTOR_SIZE; i++) { + if (i == 1) { + if (test_vector[i] != result_vector[i]) { + printk("ERROR: Wrong test_vector at %d: 0x%x vs 0x%x\n", i, test_vector[i], result_vector[i]); + } else { + printk("SUCCESS: Correct test_vector at %d.\n", i); + } + } else { + if (test_vector[i]) { + printk("ERROR: Wrong test_vector value at %d: 0x%x vs 0x%x\n", i, test_vector[i], result_vector[i]); + } else { + printk("SUCCESS: Correct test_vector value at %d, no unwanted interrupts.\n", i); + } + } + } + + irq_disable(fixture.irq1); +} + +void dynamic_shared_irq(void) +{ + + dynamic_shared_irq_suite_setup() ; + dynamic_shared_irq_suite_before(NULL) ; + test_dynamic_shared_irq_disconnect_write() ; + dynamic_shared_irq_suite_after(NULL) ; + + dynamic_shared_irq_suite_before(NULL) ; + test_dynamic_shared_irq_write() ; + dynamic_shared_irq_suite_after(NULL) ; + +} diff --git a/app/system/interrupt/src/interrupt_util.h b/app/system/interrupt/src/interrupt_util.h new file mode 100644 index 0000000..158dc49 --- /dev/null +++ b/app/system/interrupt/src/interrupt_util.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018 Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef INTERRUPT_UTIL_H_ +#define INTERRUPT_UTIL_H_ + +#define MS_TO_US(ms) (ms * USEC_PER_MSEC) + + +#include +#include + +static inline void trigger_irq(int irq) +{ + printk("Triggering irq : %d\n", irq); + + /* Ensure that the specified IRQ number is a valid SGI interrupt ID */ + // zassert_true(irq <= 15, "%u is not a valid SGI interrupt ID", irq); + if (!(irq <= 15)) { + printk("ERROR: %u is not a valid SGI interrupt ID.\n", irq); + return; + } + + /* + * Generate a software generated interrupt and forward it to the + * requesting CPU. + */ +#if CONFIG_GIC_VER <= 2 + sys_write32(GICD_SGIR_TGTFILT_REQONLY | GICD_SGIR_SGIINTID(irq), + GICD_SGIR); +#else + uint64_t mpidr = GET_MPIDR(); + uint8_t aff0 = MPIDR_AFFLVL(mpidr, 0); + + gic_raise_sgi(irq, mpidr, BIT(aff0)); +#endif +} + + +#endif /* INTERRUPT_UTIL_H_ */ diff --git a/app/system/interrupt/src/main.c b/app/system/interrupt/src/main.c new file mode 100644 index 0000000..8c878ba --- /dev/null +++ b/app/system/interrupt/src/main.c @@ -0,0 +1,74 @@ +// Phytium is pleased to support the open source community by making Zephyr-SDK available. + +// +// Copyright (C) 2024 Phytium Technology Co., Ltd. All rights reserved. +// +// Licensed under the Apache-2.0 License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// https://opensource.org/license/apache-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 +#include +#include "test_interrupt.h" +LOG_MODULE_REGISTER(app); + +int main(void) +{ + return 0; +} + + +static int cmd_dynamic_isr(const struct shell *sh, + size_t argc, char **argv) +{ + test_isr_dynamic() ; + return 0 ; +} + +static int cmd_dynamic_shared_irq(const struct shell *sh, + size_t argc, char **argv) +{ + dynamic_shared_irq() ; + return 0 ; +} + +static int cmd_nested_irq(const struct shell *sh, + size_t argc, char **argv) +{ + test_nested_isr() ; + return 0 ; +} + +static int cmd_prevent_irq(const struct shell *sh, + size_t argc, char **argv) +{ + test_prevent_interruption() ; + return 0 ; +} + + +static int cmd_static_shared_irq(const struct shell *sh, + size_t argc, char **argv) +{ + test_static_shared_irq_write() ; + return 0 ; +} + +SHELL_STATIC_SUBCMD_SET_CREATE(sub_isr_tests, + SHELL_CMD(dynamic_isr, NULL, "Test dynamic ISR.", cmd_dynamic_isr), + SHELL_CMD(dynamic_shared_irq, NULL, "Test dynamic shared IRQ.", cmd_dynamic_shared_irq), + SHELL_CMD(nested_irq, NULL, "Test nested ISR.", cmd_nested_irq), + SHELL_CMD(prevent_irq, NULL, "Test prevention of interruption.", cmd_prevent_irq), + SHELL_CMD(static_shared_irq, NULL, "Test static shared IRQ write.", cmd_static_shared_irq), + SHELL_SUBCMD_SET_END +); + +/* Register 'isr_test' as a subcommand of 'kernel' */ +SHELL_CMD_REGISTER(isr_test, &sub_isr_tests, "ISR testing commands", NULL); + + diff --git a/app/system/interrupt/src/nested_irq.c b/app/system/interrupt/src/nested_irq.c new file mode 100644 index 0000000..dbf99cf --- /dev/null +++ b/app/system/interrupt/src/nested_irq.c @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2020 Stephanos Ioannidis + * Copyright (c) 2018 Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include "interrupt_util.h" + +/* + * Run the nested interrupt test for the supported platforms only. + */ +#if defined(CONFIG_CPU_CORTEX_M) || defined(CONFIG_ARC) || \ + defined(CONFIG_GIC) +#define TEST_NESTED_ISR +#endif + +#define DURATION 5 + +#define ISR0_TOKEN 0xDEADBEEF +#define ISR1_TOKEN 0xCAFEBABE + +/* + * This test uses two IRQ lines selected within the range of available IRQs on + * the target SoC. These IRQs are platform and interrupt controller-specific, + * and must be specified for every supported platform. + * + * In terms of priority, the IRQ1 is triggered from the ISR of the IRQ0; + * therefore, the priority of IRQ1 must be greater than that of the IRQ0. + */ + +/* + * For the platforms that use the ARM GIC, use the SGI (software generated + * interrupt) lines 13 and 14 for testing. + */ +#define IRQ0_LINE 14 +#define IRQ1_LINE 13 + +/* + * Choose lower prio for IRQ0 and higher priority for IRQ1 + * Minimum legal value of GICC BPR is '3' ie + * Hence choosing default priority and highest possible priority + * '0x0' as the priorities so that the preemption rule applies + * generically to all GIC versions and security states. + */ +#define IRQ0_PRIO IRQ_DEFAULT_PRIORITY +#define IRQ1_PRIO 0x0 + + + +static uint32_t irq_line_0; +static uint32_t irq_line_1; + +static uint32_t isr0_result; +static uint32_t isr1_result; + +void isr1(const void *param) +{ + ARG_UNUSED(param); + + printk("isr1: Enter\n"); + + /* Set verification token */ + isr1_result = ISR1_TOKEN; + + printk("isr1: Leave\n"); +} + +void isr0(const void *param) +{ + ARG_UNUSED(param); + + printk("isr0: Enter\n"); + + /* Set verification token */ + isr0_result = ISR0_TOKEN; + + /* Trigger nested IRQ 1 */ + trigger_irq(irq_line_1); + + /* Wait for interrupt */ + k_busy_wait(MS_TO_US(DURATION)); + + /* Validate nested ISR result token */ + if (isr1_result != ISR1_TOKEN) + { + printk("ERROR: isr1 did not execute as expected. Expected %d, got %d\n", ISR1_TOKEN, isr1_result); + } else { + printk("SUCCESS: isr1 executed as expected.\n"); + } + + printk("isr0: Leave\n"); +} + +/** + * @brief Test interrupt nesting + * + * @ingroup kernel_interrupt_tests + * + * This routine tests the interrupt nesting feature, which allows an ISR to be + * preempted in mid-execution if a higher priority interrupt is signaled. The + * lower priority ISR resumes execution once the higher priority ISR has + * completed its processing. + * + * The expected control flow for this test is as follows: + * + * 1. [thread] Trigger IRQ 0 (lower priority) + * 2. [isr0] Set ISR 0 result token and trigger IRQ 1 (higher priority) + * 3. [isr1] Set ISR 1 result token and return + * 4. [isr0] Validate ISR 1 result token and return + * 5. [thread] Validate ISR 0 result token + */ +void test_nested_isr(void) +{ + /* Resolve test IRQ line numbers */ + + irq_line_0 = IRQ0_LINE; + irq_line_1 = IRQ1_LINE; + + + /* Connect and enable test IRQs */ + arch_irq_connect_dynamic(irq_line_0, IRQ0_PRIO, isr0, NULL, 0); + arch_irq_connect_dynamic(irq_line_1, IRQ1_PRIO, isr1, NULL, 0); + + irq_enable(irq_line_0); + irq_enable(irq_line_1); + + /* Trigger test IRQ 0 */ + trigger_irq(irq_line_0); + + /* Wait for interrupt */ + k_busy_wait(MS_TO_US(DURATION)); + + /* Validate ISR result token */ + if (isr0_result != ISR0_TOKEN) + { + printk("ERROR: isr0 did not execute as expected. Expected token: %d, Got token: %d\n", ISR0_TOKEN, isr0_result); + } else { + printk("SUCCESS: isr0 executed as expected with correct token.\n"); + } +} diff --git a/app/system/interrupt/src/prevent_irq.c b/app/system/interrupt/src/prevent_irq.c new file mode 100644 index 0000000..c369641 --- /dev/null +++ b/app/system/interrupt/src/prevent_irq.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018 Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include "interrupt_util.h" + +#define DURATION 5 +#define HANDLER_TOKEN 0xDEADBEEF + +/* Long enough to be guaranteed a tick "should have fired" */ +#define TIMER_DELAY_US (128 * 1000000 / CONFIG_SYS_CLOCK_TICKS_PER_SEC) + +static struct k_timer irqlock_timer; +volatile uint32_t handler_result; + +static void timer_handler(struct k_timer *timer) +{ + ARG_UNUSED(timer); + handler_result = HANDLER_TOKEN; + printk("timer fired\n"); +} + +/** + * @brief Test interrupt prevention + * + * @ingroup kernel_interrupt_tests + * + * This routine tests if the kernel is capable of preventing interruption, by + * locking interrupts and busy-waiting to see if the system timer interrupt is + * serviced while interrupts are locked; in addition, this test also verifies + * that the system timer interrupt is serviced after interrupts are unlocked. + */ +// ZTEST(interrupt_feature, test_prevent_interruption) +void test_prevent_interruption(void) +{ + unsigned int key; + + printk("locking interrupts\n"); + key = irq_lock(); + + handler_result = 0; + + k_timer_init(&irqlock_timer, timer_handler, NULL); + + /* Start the timer and busy-wait for a bit with IRQs locked. The + * timer ought to have fired during this time if interrupts weren't + * locked -- but since they are, check_lock_new isn't updated. + */ + k_timer_start(&irqlock_timer, K_MSEC(DURATION), K_NO_WAIT); + k_busy_wait(TIMER_DELAY_US); + if (handler_result == HANDLER_TOKEN) { + printk("ERROR: timer interrupt was serviced while interrupts are locked.\n"); + } else { + printk("SUCCESS: Timer interrupt was not serviced while interrupts are locked, as expected.\n"); + } + + printk("unlocking interrupts\n"); + irq_unlock(key); + + k_busy_wait(TIMER_DELAY_US); + + if (handler_result != HANDLER_TOKEN) { + printk("ERROR: Timer should have fired after unlocking interrupts.\n"); + } else { + printk("SUCCESS: Timer fired after unlocking interrupts, as expected.\n"); + } + k_timer_stop(&irqlock_timer); +} + + diff --git a/app/system/interrupt/src/static_shared_irq.c b/app/system/interrupt/src/static_shared_irq.c new file mode 100644 index 0000000..06b70b1 --- /dev/null +++ b/app/system/interrupt/src/static_shared_irq.c @@ -0,0 +1,126 @@ +/* + * Copyright 2023 NXP + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include "test_shared_irq.h" + +#define GIC_IRQ1 10 +#define GIC_IRQ2 11 + +/** + * @brief Test writing to a vector using static shared interrupts. + * + * @ingroup kernel_interrupt_tests + * + * @details This tests if interrupts are statically shared successfully + * (i.e: multiple ISR/arg pairs are called whenever the interrupt they + * were registered for is triggered). + */ +// ZTEST(interrupt_feature, test_static_shared_irq_write) +void test_static_shared_irq_write(void) +{ + /* note: this test is very brittle since it requires that + * the chosen interrupt lines be unused for all of the + * testing platforms. Failing to meet this requirement + * leads to build failures due to the number of clients + * exceeding the limit. Still, it's important to test that + * the static shared interrupts work properly. As such, + * this test shall be restricted to a single platform, thus + * decreasing the risk of build errors appearing due to the + * chosen interrupts being used. + */ + + int i; + + IRQ_CONNECT(GIC_IRQ1, IRQ_PRIORITY, test_isr_0, 0, 0); + IRQ_CONNECT(GIC_IRQ1, IRQ_PRIORITY, test_isr_1, (void *)1, 0); + IRQ_CONNECT(GIC_IRQ2, IRQ_PRIORITY, test_isr_2, (void *)2, 0); + + if (_sw_isr_table[GIC_IRQ1].isr != z_shared_isr) { + printk("ERROR: Wrong _sw_isr_table ISR at GIC_IRQ1.\n"); + } else { + printk("SUCCESS: Correct _sw_isr_table ISR at GIC_IRQ1.\n"); + } + + if (_sw_isr_table[GIC_IRQ2].isr != test_isr_2) { + printk("ERROR: Wrong _sw_isr_table ISR at GIC_IRQ2.\n"); + } else { + printk("SUCCESS: Correct _sw_isr_table ISR at GIC_IRQ2.\n"); + } + + if (_sw_isr_table[GIC_IRQ1].arg != &z_shared_sw_isr_table[GIC_IRQ1]) { + printk("ERROR: Wrong _sw_isr_table arg at GIC_IRQ1.\n"); + } else { + printk("SUCCESS: Correct _sw_isr_table arg at GIC_IRQ1.\n"); + } + + if (_sw_isr_table[GIC_IRQ2].arg != (void *)2) { + printk("ERROR: Wrong _sw_isr_table arg at GIC_IRQ2.\n"); + } else { + printk("SUCCESS: Correct _sw_isr_table arg at GIC_IRQ2.\n"); + } + + if (z_shared_sw_isr_table[GIC_IRQ1].client_num != 2) { + printk("ERROR: Wrong client number for GIC_IRQ1.\n"); + } else { + printk("SUCCESS: Correct client number for GIC_IRQ1.\n"); + } + + if (z_shared_sw_isr_table[GIC_IRQ2].client_num != 0) { + printk("ERROR: Wrong client number for GIC_IRQ2.\n"); + } else { + printk("SUCCESS: No client for GIC_IRQ2, as expected.\n"); + } + + // Note: Assuming client_exists_at_index() returns a boolean indicating existence + if (!client_exists_at_index(test_isr_0, 0, GIC_IRQ1, TEST_INVALID_IDX)) { + printk("ERROR: test_isr_0 not a client for GIC_IRQ1.\n"); + } else { + printk("SUCCESS: test_isr_0 is a client for GIC_IRQ1.\n"); + } + + if (!client_exists_at_index(test_isr_1, (void *)1, GIC_IRQ1, TEST_INVALID_IDX)) { + printk("ERROR: test_isr_1 not a client for GIC_IRQ1.\n"); + } else { + printk("SUCCESS: test_isr_1 is a client for GIC_IRQ1.\n"); + } + + irq_enable(GIC_IRQ1); + irq_enable(GIC_IRQ2); + + trigger_irq(GIC_IRQ1); + trigger_irq(GIC_IRQ2); + + /* wait 5ms before checking the results */ + k_busy_wait(5000); + + for (i = 0; i < TEST_VECTOR_SIZE; i++) { + + if (test_vector[i] != result_vector[i]) { + printk("ERROR: Wrong test_vector value at %d: 0x%x vs 0x%x\n", i, test_vector[i], result_vector[i]); + } else { + printk("SUCCESS: Correct test_vector value at %d: 0x%x\n", i, test_vector[i]); + } + + + } + + irq_disable(GIC_IRQ1); + irq_disable(GIC_IRQ2); + +// #ifdef CONFIG_DYNAMIC_INTERRUPTS + /* if dynamic interrupts are enabled this will restore the _sw_isr_table + * entries for GIC_IRQ1 and GIC_IRQ2 to their default values (NULL, + * z_irq_spurious). In turn, this will increase the probability of + * dynamic_shared_irq.c's get_irq_slot() being able to find an available + * slot. + */ + arch_irq_disconnect_dynamic(GIC_IRQ1, IRQ_PRIORITY, test_isr_0, 0, 0); + arch_irq_disconnect_dynamic(GIC_IRQ1, IRQ_PRIORITY, test_isr_1, (void *)1, 0); + arch_irq_disconnect_dynamic(GIC_IRQ2, IRQ_PRIORITY, test_isr_2, (void *)2, 0); +// #endif /* CONFIG_DYNAMIC_INTERRUPTS */ + +// #endif /* CONFIG_BOARD_QEMU_CORTEX_A53 */ +} diff --git a/app/system/interrupt/src/test_interrupt.h b/app/system/interrupt/src/test_interrupt.h new file mode 100644 index 0000000..86e422c --- /dev/null +++ b/app/system/interrupt/src/test_interrupt.h @@ -0,0 +1,23 @@ +#ifndef __TEST_INTERRUPT_H__ +#define __TEST_INTERRUPT_H__ + + + +void test_isr_dynamic(void) ; + + +void dynamic_shared_irq(void) ; + + +void test_nested_isr(void) ; + + +void test_prevent_interruption(void) ; + + +void test_isr_regular(void) ; + + +void test_static_shared_irq_write(void) ; + +#endif /* __TEST_INTERRUPT_H__ */ diff --git a/app/system/interrupt/src/test_shared_irq.h b/app/system/interrupt/src/test_shared_irq.h new file mode 100644 index 0000000..de65451 --- /dev/null +++ b/app/system/interrupt/src/test_shared_irq.h @@ -0,0 +1,69 @@ +/* + * Copyright 2023 NXP + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef __TEST_SHARED_IRQ_H__ +#define __TEST_SHARED_IRQ_H__ + + +#include "interrupt_util.h" + +#define IRQ_PRIORITY 1 +#define TEST_VECTOR_SIZE 10 +#define TEST_INVALID_IDX 0xcafebabe +#define TEST_DUMMY_ISR_VAL 0xdeadbeef +#define TEST_INVALID_IRQ 0xcafebabe + +#define ISR_DEFINE(name) \ +static inline void name(const void *data) \ +{ \ + int idx = POINTER_TO_INT(data); \ + test_vector[idx] = result_vector[idx]; \ +} \ + +static uint32_t test_vector[TEST_VECTOR_SIZE] = { +}; + +static uint32_t result_vector[TEST_VECTOR_SIZE] = { + 0xdeadbeef, + 0xcafebabe, + 0x1234cafe, +}; + +ISR_DEFINE(test_isr_0); +ISR_DEFINE(test_isr_1); +ISR_DEFINE(test_isr_2); + +static inline bool client_exists_at_index(void (*routine)(const void *arg), + void *arg, int irq, size_t idx) +{ + size_t i; + struct z_shared_isr_table_entry *shared_entry; + struct z_shared_isr_client *client; + + shared_entry = &z_shared_sw_isr_table[irq]; + + if (idx == TEST_INVALID_IDX) { + for (i = 0; i < shared_entry->client_num; i++) { + client = &shared_entry->clients[i]; + + if (client->isr == routine && client->arg == arg) { + return true; + } + } + } else { + if (shared_entry->client_num <= idx) { + return false; + } + + client = &shared_entry->clients[idx]; + + return client->isr == routine && client->arg == arg; + } + + return false; +} + +#endif /* __TEST_SHARED_IRQ_H__ */ diff --git a/app/system/kernel_feature/schedule/.gdbinit b/app/system/kernel_feature/schedule/.gdbinit new file mode 100644 index 0000000..f654f4c --- /dev/null +++ b/app/system/kernel_feature/schedule/.gdbinit @@ -0,0 +1,59 @@ +# increase the default remote timeout in gdb because +# Windows libusb transactions could be slow +set remotetimeout 100000 + +# gdb connect to openocd in port 3333 +target extended-remote localhost:3333 + +# start openocd working queue, monitor followed with openocd command here +monitor init + +# force to use hardware breakpoint, otherwise use software breakpoint +# for e2000d/q, num of hardware breakpoints supposed to be 6 +monitor gdb_breakpoint_override hardware + +# load elf image +load ./build/zephyr/zephyr.elf + +# in case symbols skip load,load agin +file ./build/zephyr/zephyr.elf + +# we can break at the beginning of code by address or by symbol +#break _boot + +# add more breakpoints in application +#break JtagTouchRegisters +#break JtagTouchMemory +# break bubbleSort` +# break JtagPostSort +#break bubbleSortCXX + +# show all breakspoints we before running +# info breakpoints + +# show [-0x10 ~ +0x10 ] range of instructions when breaked +# display /10i $pc-16 + +# start running +# continue +layout src +# break eth_phytium_xmac_iface_init +# break eth_phytium_xmac_isr +# break init_app +# break bg_thread_main +# break eth_phytium_xmac_setuphandler +# break eth_phytium_xmac_send +# break eth_phytium_xmac_send +# break eth_phytium_xmac_send +# break net_config_init_by_iface +# break check_interface +# break z_arm64_sync_exc +# break sdmmc_read_scr +# break sdmmc_write_blocks +# break z_arm64_prep_c +# break sdmmc_switch +# break sdmmc_read_csd +# break sdmmc_read_blocks +# break sd_idle +# break sd_send_interface_condition +# continue \ No newline at end of file diff --git a/app/system/kernel_feature/schedule/CMakeLists.txt b/app/system/kernel_feature/schedule/CMakeLists.txt new file mode 100644 index 0000000..80b4013 --- /dev/null +++ b/app/system/kernel_feature/schedule/CMakeLists.txt @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(schedule_test) + +FILE(GLOB app_sources src/*.c) +target_sources(app PRIVATE ${app_sources}) + diff --git a/app/system/kernel_feature/schedule/README.md b/app/system/kernel_feature/schedule/README.md new file mode 100644 index 0000000..73b13fe --- /dev/null +++ b/app/system/kernel_feature/schedule/README.md @@ -0,0 +1,165 @@ +# 调度测试 + +## 1. 例程介绍 + +### test_priority_scheduling.c + +本源代码演示和测试Zephyr 中基于优先级的抢占式调度行为。这种测试对于验证RTOS调度器在处理不同优先级的线程时的行为非常重要,确保更高优先级的线程能够按预期抢占较低优先级线程的执行。这段代码特别设计用于观察和验证多个线程按照其优先级被调度和执行的顺序。 + +### test_sched_is_preempt_thread.c + +本源代码文件 `test_sched_is_preempt_thread.c` 是专为展示和测试 Zephyr 实时操作系统 (RTOS) 中基于优先级的抢占式调度行为而设计。通过创建抢占式和合作式线程,然后锁定和解锁调度器,以及调整线程的优先级,该测试验证了 `k_is_preempt_thread()` 函数的正确性。这一过程对于确认RTOS调度器能够正确处理不同优先级的线程,确保更高优先级的线程能够按预期抢占较低优先级线程的执行至关重要。本代码通过两个关键函数——`tpreempt_ctx` 和 `tcoop_ctx` ——分别检验了抢占式和合作式线程在调度器被锁定和解锁时的行为,以及在调整线程优先级后的状态变化,从而展现了线程按其优先级被调度和执行的顺序。 + +### test_sched_priority.c + +本源代码文件是为了展示和测试Zephyr实时操作系统(RTOS)中基于优先级的抢占式调度行为而精心设计的。通过创建不同优先级的线程,并在特定条件下执行它们,这一系列测试验证了Zephyr调度器如何根据优先级和等待时间来调度线程。这些测试对于确保RTOS调度器能够正确地处理不同优先级的线程,保证更高优先级的线程可以按预期抢占较低优先级线程的执行非常关键。 + +- `test_priority_cooperative` 函数验证合作线程不会被抢占的功能。通过创建一个比当前线程优先级更高的合作线程,并验证该高优先级线程不会抢占当前较低优先级的合作线程。这一测试强调了合作线程(cooperative threads)之间的非抢占性,展示了即使在优先级较高的情况下,合作线程也不会打断其他合作线程的执行。 +- `test_priority_preemptible` 函数演示了抢占式线程的抢占性特点。首先,它通过创建一个优先级低于当前线程的抢占式线程,验证新创建的线程不会抢占当前线程。随后,通过创建一个优先级高于当前线程的抢占式线程,确保新创建的线程可以抢占当前线程。这一测试突出了抢占式线程(preemptive threads)根据优先级的抢占机制,即高优先级的抢占式线程可以打断低优先级线程的执行。 +- `test_priority_preemptible_wait_prio` 函数验证了在存在启动延迟时,抢占式线程的调度顺序。它通过创建四个优先级高于当前线程的抢占式线程,这些线程具有不同的启动延迟,来确保优先级最高且等待时间最长的线程首先被调度执行。此测试验证了调度器不仅考虑线程的优先级,还考虑了它们的等待时间,在多个线程具有相同优先级时,等待时间更长的线程将先获得执行机会。 + +### test_sched_timeslice_and_lock.c + +本源代码文件是为了展示和测试Zephyr实时操作系统(RTOS)中的多线程调度行为而设计的。通过一系列精心设计的测试案例,该文件验证了Zephyr调度器在处理合作式(cooperative)和抢占式(preemptive)线程时的行为。特别地,这些测试案例涵盖了线程的创建、睡眠、唤醒、优先级调整、调度锁定和解锁,以及时间片调度等方面。这些测试对于确保RTOS调度器能够正确地管理不同优先级的线程,保证更高优先级的线程能够按预期抢占较低优先级线程的执行至关重要。 + +- `test_yield_cooperative` 验证了合作式线程在执行 `k_yield()`后的行为。该测试通过创建三个不同优先级的线程,并使当前合作式线程让出CPU,来检查更高优先级的线程是否如预期那样被执行。 +- `test_sleep_cooperative` 检验了合作式线程调用 `k_sleep()`后的行为。该测试创建三个线程,并通过让当前线程睡眠,来验证所有就绪状态的线程是否都能够被正确地执行。 +- `test_busy_wait_cooperative` 验证了合作式线程在执行 `k_busy_wait()`期间的行为。这个测试确保了在当前线程繁忙等待时,没有其他线程被执行。 +- `test_sleep_wakeup_preemptible` 检验了使用 `k_wakeup()`唤醒处于睡眠状态的抢占式线程的行为。通过让一个线程睡眠然后被唤醒,该测试验证了唤醒操作能够按预期工作。 +- `test_pending_thread_wakeup` 验证了 `k_wakeup()`对于等待中(pending)的线程的行为。该测试确保了 `k_wakeup()`在线程等待资源时不会错误地将其唤醒。 +- `test_time_slicing_preemptible` 演示了在启用时间片(time slicing)的情况下抢占式线程的行为。这个测试验证了具有相同优先级的线程是否能够在各自的时间片内被执行。 +- `test_time_slicing_disable_preemptible` 验证了在执行 `k_busy_wait()`时时间片调度被禁用的情况。该测试确保了在忙等待期间,具有相同优先级的其他线程不会被执行。 +- `test_lock_preemptible` 通过锁定调度器,来验证在调度器锁定期间,即使创建了新的线程,这些线程也不会被执行的行为。 +- `test_unlock_preemptible` 检验了调度器从锁定状态解锁后,之前创建的线程是否能够如预期执行。 +- `test_unlock_nested_sched_lock` 通过测试嵌套的调度器锁定和解锁,来验证解锁操作是否正确地使线程恢复执行。 +- `test_wakeup_expired_timer_thread` 验证了对于因定时器超时而被唤醒的线程,`k_wakeup()`函数的行为是否符合预期。 + +### test_sched_timeslice_reset.c + +本源代码文件 `test_slice_reset.c` 是专为展示和测试Zephyr实时操作系统(RTOS)中基于时间片的抢占式线程调度行为而设计的。该文件通过 `test_slice_reset`函数,验证了当时间片被启用和禁用时,抢占式线程的行为。通过创建多个具有不同优先级和相同优先级的抢占式线程,并启用时间片,该测试确保每个线程都被赋予了预期的时间片周期来执行。 + +`test_slice_reset`函数执行以下关键步骤来完成其验证功能: + +1. **禁用时间片**:首先,禁用时间片以确保在测试设置期间,时间片不会影响线程调度。 +2. **创建线程**:随后,创建多个抢占式线程,它们具有不同的优先级。其中一部分线程被设置为具有相同的优先级,以验证相同优先级的线程在时间片启用时的行为。 +3. **启用时间片**:通过调用 `k_sched_time_slice_set`函数,启用时间片,并设置时间片的大小。这是为了测试系统是否能够根据设定的时间片大小,正确地分配CPU时间给每个线程。 +4. **执行和验证**:每个线程在其执行函数中计算它实际获得的CPU时间,并与预期的时间片大小进行比较。这一步骤验证了时间片是否被正确地应用于线程调度,以及线程是否在它们的时间片结束时被正确地抢占。 +5. **禁用时间片和恢复环境**:在测试完成后,时间片被禁用,并恢复测试前的线程优先级,以保证测试的隔离性和重复性。 + +### test_slice_scheduling.c + +这两个测试案例专门设计用于验证Zephyr实时操作系统(RTOS)中抢占式线程的时间片调度行为。这些测试对确保系统能够正确地按照预设的时间片分配CPU时间给不同的线程至关重要。 + +- test_slice_scheduling + +**功能验证:** `test_slice_scheduling` 函数验证了当时间片(time slice)被启用时,拥有相同优先级的多个抢占式线程的调度行为。该测试通过创建具有相同优先级的多个线程,然后启用时间片调度,以确保每个线程均被赋予相等的执行时间。 + +**操作步骤:** + +1. **禁用时间片:** 首先,通过设置时间片大小为0来禁用时间片,确保开始测试时时间片调度不会影响线程的执行。 +2. **创建线程:** 创建具有相同优先级的多个抢占式线程。 +3. **启用时间片:** 通过 `k_sched_time_slice_set`函数启用时间片,并设置适当的时间片大小。 +4. **执行验证:** 主线程让出CPU,允许创建的线程按时间片轮转执行。每个线程在其分配的时间片内执行,并通过信号量同步,确保它们按预期接受CPU时间。 +5. **结果验证:** 验证每个线程是否在其分配的时间片内完成执行,并且在每次迭代中,所有线程均有机会执行。 + +- test_slice_perthread + +**功能验证:** `test_slice_perthread` 函数特别针对支持每个线程独立设置时间片大小的配置(`CONFIG_TIMESLICE_PER_THREAD`)进行测试。它验证了可以为单个线程设置特定的时间片大小,并确保这个线程在其时间片到期时正确地被抢占。 + +## 2. 如何使用例程 + +本例程需要以下硬件, + +- E2000D/Q Demo板 + +### 2.1 硬件配置方法 + +保障串口正常工作后,不需要额外配置硬件 + +### 2.2 SDK配置方法 + +- 本例子已经提供好具体的编译指令,以下进行介绍: + +1. ``west build -b e2000q_demo ./ -DOVERLAY_CONFIG=prj.conf``,编译命令, 使用west工具构建当前目录下的Zephyr项目,指定目标板为e2000q_demo,并使用prj.conf配置文件覆盖默认配置 ,最终生成的执行文件将会保存在./build/zephyr/zephyr.elf +2. ``west build -t clean``, 清除缓存 ,使用west工具的clean目标清理Zephyr构建系统可能生成的任何其他临时文件或缓存 + +### 2.3 构建和下载 + +- 编译例程 + +``west build -b e2000q_demo ./ -DOVERLAY_CONFIG=prj.conf`` + +- 编译主机测侧设置重启tftp服务器 + +``` +sudo service tftpd-hpa restart +``` + +- 开发板侧使用bootelf命令跳转 + +``` +setenv ipaddr 192.168.4.20 +setenv serverip 192.168.4.50 +setenv gatewayip 192.168.4.1 +tftpboot 0x90100000 zephyr.elf +bootelf -p 0x90100000 +``` + +### 2.4 输出与实验现象 + +- 所有用例均提供一系列可变配置,可在例程全局变量中修改 + +#### 2.4.1 测试优先级调度 + +``` +schedule_test priority_scheduling +``` + +![priority_scheduling_result](figs/README/1713405703335.png) + +#### 2.4.2 测试当前线程是否可抢占 + +``` +schedule_test is_preempt_thread +``` + +![is_preempt_thread_result](figs/README/1713405732059.png) + +#### 2.4.3 通过优先级测试线程调度 + +``` +schedule_test priority +``` + +![priority_result](figs/README/1713405767652.png) + +#### 2.4.4 测试时间片重置 + +``` +schedule_test timeslice_reset +``` + +![timeslice_reset_result](figs/README/1713405796614.png) + +#### 2.4.5 测试时间片调度 + +``` +schedule_test slice_scheduling +``` + +![slice_scheduling_result](figs/README/1713405833265.png) + +#### 2.4.6 测试时间片和锁 + +``` +schedule_test timeslice_lock +``` + +![timeslice_lock_result](figs/README/1713405866527.png) + + +## 3. 如何解决问题 + + + +## 4. 修改历史记录 diff --git a/app/system/kernel_feature/schedule/figs/README/1713405703335.png b/app/system/kernel_feature/schedule/figs/README/1713405703335.png new file mode 100644 index 0000000000000000000000000000000000000000..3f6297b8d412f4a6aa912518f811a767f701c463 GIT binary patch literal 43992 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 UBPb6W4EQH0DkoAUY!LW=0JTRO5&!@I literal 0 HcmV?d00001 diff --git a/app/system/kernel_feature/schedule/figs/README/1713405732059.png b/app/system/kernel_feature/schedule/figs/README/1713405732059.png new file mode 100644 index 0000000000000000000000000000000000000000..a4741209333d8c4635654139088af6d4f1c75bcf GIT binary patch literal 17533 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 T_Z#vrL!e|N6vZn=jRXD{O;VL` literal 0 HcmV?d00001 diff --git a/app/system/kernel_feature/schedule/figs/README/1713405767652.png b/app/system/kernel_feature/schedule/figs/README/1713405767652.png new file mode 100644 index 0000000000000000000000000000000000000000..9f12925b1d3c7d7cfc2edadabfd47aa9f6f81fb3 GIT binary patch literal 13074 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 R_8$wJtdyc;rMOYh{{dg{5T*bC literal 0 HcmV?d00001 diff --git a/app/system/kernel_feature/schedule/figs/README/1713405796614.png b/app/system/kernel_feature/schedule/figs/README/1713405796614.png new file mode 100644 index 0000000000000000000000000000000000000000..6dbd4d8c678c07f7be620ffe9dacc9454a77c4db GIT binary patch literal 38032 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%0A|u9ECb-*MYMN-J~EH&K9CuC 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 literal 0 HcmV?d00001 diff --git a/app/system/kernel_feature/schedule/makefile b/app/system/kernel_feature/schedule/makefile new file mode 100644 index 0000000..f6ef7cb --- /dev/null +++ b/app/system/kernel_feature/schedule/makefile @@ -0,0 +1,18 @@ +boot: + west build -b e2000q_demo ./ -DOVERLAY_CONFIG=prj.conf + cp ./build/zephyr/zephyr.elf /mnt/d/tftboot/ + cp ./build/zephyr/zephyr.bin /mnt/d/tftboot/ + +boot_aarch32: + west build -b e2000q_a32_demo ./ -DOVERLAY_CONFIG=prj.conf + cp ./build/zephyr/zephyr.elf /mnt/d/tftboot/ + cp ./build/zephyr/zephyr.bin /mnt/d/tftboot/ + +clean: + west build -t clean + rm -rf build + +gdb: + gdb-multiarch -x .gdbinit + + diff --git a/app/system/kernel_feature/schedule/prj.conf b/app/system/kernel_feature/schedule/prj.conf new file mode 100644 index 0000000..a9c9ece --- /dev/null +++ b/app/system/kernel_feature/schedule/prj.conf @@ -0,0 +1,21 @@ +# General config +CONFIG_MAIN_STACK_SIZE=4096 + +# schedule +CONFIG_TIMESLICE_PER_THREAD=y + + +CONFIG_LOG=y +CONFIG_LOG_DEFAULT_LEVEL=1 +CONFIG_LOG_MODE_IMMEDIATE=y +# CONFIG_HAL_STANDALONE_SDK_DEBUG=y + +# CONFIG_NET_MGMT_EVENT_STACK_SIZE=4096 +# CONFIG_KERNEL_VM_BASE=0x10000000 +# 将 0 ~ 0x80000000 的地址空间作为虚拟内存使用 2G +# CONFIG_KERNEL_VM_SIZE=0x80000000 + +# SHELL 开关 +CONFIG_SHELL=y +CONFIG_SHELL_LOG_LEVEL_INF=y +CONFIG_SHELL_STACK_SIZE=8192 diff --git a/app/system/kernel_feature/schedule/src/main.c b/app/system/kernel_feature/schedule/src/main.c new file mode 100644 index 0000000..d3e2462 --- /dev/null +++ b/app/system/kernel_feature/schedule/src/main.c @@ -0,0 +1,102 @@ + +#include +#include "test_sched.h" +LOG_MODULE_REGISTER(app); + +/* Shared threads */ +K_THREAD_STACK_DEFINE(tstack, STACK_SIZE); +K_THREAD_STACK_ARRAY_DEFINE(tstacks, MAX_NUM_THREAD, STACK_SIZE); + +void spin_for_ms(int ms) +{ + uint32_t t32 = k_uptime_get_32(); + + while (k_uptime_get_32() - t32 < ms) { + /* In the posix arch, a busy loop takes no time, so + * let's make it take some + */ + if (IS_ENABLED(CONFIG_ARCH_POSIX)) { + k_busy_wait(50); + } + } +} + + + +int main(void) +{ + return 0; +} + + +static int cmd_test_priority_scheduling(const struct shell *sh, + size_t argc, char **argv) +{ + test_priority_scheduling() ; + return 0 ; +} + +static int cmd_test_sched_is_preempt_thread(const struct shell *sh, + size_t argc, char **argv) +{ + test_sched_is_preempt_thread() ; + return 0 ; +} + +static int cmd_test_sched_priority(const struct shell *sh, + size_t argc, char **argv) +{ + test_priority_cooperative() ; + test_priority_preemptible() ; + test_priority_preemptible_wait_prio() ; + return 0 ; +} + + + +static int cmd_test_sched_timeslice_reset(const struct shell *sh, + size_t argc, char **argv) +{ + test_slice_reset() ; + return 0 ; +} + + +static int cmd_test_slice_scheduling(const struct shell *sh, + size_t argc, char **argv) +{ + test_slice_scheduling() ; + test_slice_perthread() ; + return 0 ; +} + +static int cmd_test_sched_timeslice_and_lock(const struct shell *sh, + size_t argc, char **argv) +{ + test_yield_cooperative() ; + test_sleep_cooperative() ; + test_busy_wait_cooperative() ; + test_sleep_wakeup_preemptible() ; + test_pending_thread_wakeup() ; + test_time_slicing_preemptible() ; + test_time_slicing_disable_preemptible() ; + test_lock_preemptible() ; + test_unlock_preemptible() ; + test_unlock_nested_sched_lock() ; + test_wakeup_expired_timer_thread() ; + return 0 ; +} + + +SHELL_STATIC_SUBCMD_SET_CREATE(sub_schedule_tests, + SHELL_CMD(priority_scheduling, NULL, "Test priority scheduling.", cmd_test_priority_scheduling), + SHELL_CMD(is_preempt_thread, NULL, "Test if current thread is preemptible.", cmd_test_sched_is_preempt_thread), + SHELL_CMD(priority, NULL, "Test thread scheduling by priority.", cmd_test_sched_priority), + SHELL_CMD(timeslice_reset, NULL, "Test timeslice resetting.", cmd_test_sched_timeslice_reset), + SHELL_CMD(slice_scheduling, NULL, "Test scheduling with time slicing.", cmd_test_slice_scheduling), + SHELL_CMD(timeslice_lock, NULL, "Test time slicing and locks.", cmd_test_sched_timeslice_and_lock), + SHELL_SUBCMD_SET_END +); + +/* 注册 'schedule_test' 作为 'kernel' 子命令 */ +SHELL_CMD_REGISTER(schedule_test, &sub_schedule_tests, "Schedule testing commands", NULL); diff --git a/app/system/kernel_feature/schedule/src/test_priority_scheduling.c b/app/system/kernel_feature/schedule/src/test_priority_scheduling.c new file mode 100644 index 0000000..f31fc51 --- /dev/null +++ b/app/system/kernel_feature/schedule/src/test_priority_scheduling.c @@ -0,0 +1,115 @@ + +#include +#include "test_sched.h" + +/* nrf 51 has lower ram, so creating less number of threads */ +#if CONFIG_SRAM_SIZE <= 24 + #define NUM_THREAD 2 +#elif (CONFIG_SRAM_SIZE <= 32) \ + || defined(CONFIG_SOC_EMSK_EM7D) + #define NUM_THREAD 3 +#else + #define NUM_THREAD 10 +#endif +#define ITERATION_COUNT 5 +#define BASE_PRIORITY 1 + +BUILD_ASSERT(NUM_THREAD <= MAX_NUM_THREAD); + +/* Semaphore on which Ztest thread wait */ +static K_SEM_DEFINE(sema2, 0, NUM_THREAD); + +/* Semaphore on which application threads wait */ +static K_SEM_DEFINE(sema3, 0, NUM_THREAD); + +static int thread_idx; +static struct k_thread t[NUM_THREAD]; + +/* Application thread */ +/** + * @name: thread_tslice + * @msg: This function represents the body of an application thread. It prints a character representing the thread, checks if threads are executing according to their priority, and performs synchronization with other threads using semaphores. Threads cycle through printing their representation and wait for a semaphore to continue, ensuring scheduled execution. + * @param {void} *p1 represents the thread index, converted and used to determine the character to print. + * @param {void} *p2 and *p3 are unused parameters, included for compatibility with the thread creation function signature. + * @return {None} + */ +static void thread_tslice(void *p1, void *p2, void *p3) +{ + int idx = POINTER_TO_INT(p1); + + /* Print New line for last thread */ + int thread_parameter = (idx == (NUM_THREAD - 1)) ? '\n' : + (idx + 'A'); + + while (1) { + /* Printing alphabet corresponding to thread */ + printk("%c ", thread_parameter); + /* Testing if threads are executed as per priority */ + if (idx != thread_idx) + { + /* Handle error: log and potentially halt */ + printk("Unexpected thread index: %d; expected: %d", idx, thread_idx); + } + thread_idx = (thread_idx + 1) % (NUM_THREAD); + + /* Release CPU and give chance to Ztest thread to run */ + k_sem_give(&sema2); + /* Wait for release of semaphore from test_priority_scheduling thread */ + k_sem_take(&sema3, K_FOREVER); + } + +} + +/** + * @brief Check the behavior of preemptive threads with different priorities + * + * @details Create multiple threads of different priorities - all are preemptive, + * current thread is also made preemptive. Check how the threads get chance to + * execute based on their priorities + * + */ +void test_priority_scheduling(void) +{ + k_tid_t tid[NUM_THREAD]; + int old_prio = k_thread_priority_get(k_current_get()); + int count = 0; + + /* update priority for current thread */ + k_thread_priority_set(k_current_get(), + K_PRIO_PREEMPT(BASE_PRIORITY - 1)); + + /* Create Threads with different Priority */ + for (int i = 0; i < NUM_THREAD; i++) { + tid[i] = k_thread_create(&t[i], tstacks[i], STACK_SIZE, + thread_tslice, INT_TO_POINTER(i), NULL, NULL, + K_PRIO_PREEMPT(BASE_PRIORITY + i), 0, + K_NO_WAIT); + } + + while (count < ITERATION_COUNT) { + + /* Wait for each thread to complete */ + for (int i = 0; i < NUM_THREAD; i++) + { + printf("test_priority_scheduling take %d \r\n",i) ; + k_sem_take(&sema2, K_FOREVER); + } + /* Delay to give chance to last thread to run */ + k_sleep(K_MSEC(100)); + + /* Giving Chance to other threads to run */ + for (int i = 0; i < NUM_THREAD; i++) { + k_sem_give(&sema3); + } + count++; + } + + /* test case teardown */ + for (int i = 0; i < NUM_THREAD; i++) { + k_thread_abort(tid[i]); + } + /* Set priority of Main thread to its old value */ + k_thread_priority_set(k_current_get(), old_prio); + + printk("SUCCESS: test_priority_scheduling \r\n") ; +} diff --git a/app/system/kernel_feature/schedule/src/test_sched.h b/app/system/kernel_feature/schedule/src/test_sched.h new file mode 100644 index 0000000..6fd04cd --- /dev/null +++ b/app/system/kernel_feature/schedule/src/test_sched.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2016 Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef __TEST_SCHED_H__ +#define __TEST_SCHED_H__ + +#include +#include + +#define MAX_NUM_THREAD 10 +#define STACK_SIZE (640 + CONFIG_TEST_EXTRA_STACK_SIZE) + +K_THREAD_STACK_DECLARE(tstack, STACK_SIZE); +K_THREAD_STACK_ARRAY_DECLARE(tstacks, MAX_NUM_THREAD, STACK_SIZE); +extern struct k_thread user_thread; +extern struct k_sem user_sem; + +struct thread_data { + k_tid_t tid; + int priority; + int executed; +}; + +void spin_for_ms(int ticks); + +void test_priority_preemptible_wait_prio(void) ; +void test_yield_cooperative(void); +void test_sleep_cooperative(void); +void test_busy_wait_cooperative(void); +void test_sleep_wakeup_preemptible(void); +void test_pending_thread_wakeup(void); +void test_time_slicing_preemptible(void); +void test_time_slicing_disable_preemptible(void); +void test_priority_preemptible(void) ; +void test_lock_preemptible(void); +void test_unlock_preemptible(void); +void test_priority_cooperative(void) ; +void test_unlock_nested_sched_lock(void); +void test_sched_is_preempt_thread(void); +void test_slice_reset(void); +void test_slice_scheduling(void); +void test_priority_scheduling(void); +void test_wakeup_expired_timer_thread(void); +void test_user_k_wakeup(void); +void test_user_k_is_preempt(void); +void test_k_thread_suspend_init_null(void); +void test_k_thread_resume_init_null(void); +void test_k_thread_priority_get_init_null(void); +void test_k_thread_priority_set_init_null(void); +void test_k_thread_priority_set_overmax(void); +void test_k_thread_priority_set_upgrade(void); +void test_k_wakeup_init_null(void); +void test_slice_perthread(void); + +#endif /* __TEST_SCHED_H__ */ + diff --git a/app/system/kernel_feature/schedule/src/test_sched_is_preempt_thread.c b/app/system/kernel_feature/schedule/src/test_sched_is_preempt_thread.c new file mode 100644 index 0000000..7ec5b31 --- /dev/null +++ b/app/system/kernel_feature/schedule/src/test_sched_is_preempt_thread.c @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2017 Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include "test_sched.h" +#include + +/* local variables */ +static struct k_thread tdata; +static struct k_sem end_sema; + + +/** + * @name: tpreempt_ctx + * @msg: This function is designed to verify the behavior of a preemptive thread with regards to scheduler locking and thread priority adjustments. It first checks if the current thread is preemptible. Then, it locks the scheduler to make the current thread non-preemptible and checks the thread's preempt status again. After unlocking the scheduler, it verifies the thread's preempt status for a third time. Lastly, it sets the thread's priority to a cooperative level and checks the preempt status again, ensuring each state transition is as expected. + * @param {void} *p1, *p2, *p3 are unused parameters, included for compatibility with the thread function signature. + * @return {None} + */ +static void tpreempt_ctx(void *p1, void *p2, void *p3) +{ + if (k_is_preempt_thread()) { + printk("TESTPOINT PASSED: The thread's priority is in the preemptible range.\n"); + } else { + printk("TESTPOINT FAILED: The thread's priority is not in the preemptible range.\n"); + } + + k_sched_lock(); + if (k_is_preempt_thread()) { + printk("TESTPOINT FAILED: The thread should not be preemptible after locking the scheduler.\n"); + } else { + printk("TESTPOINT PASSED: The thread has locked the scheduler.\n"); + } + k_sched_unlock(); + if (k_is_preempt_thread()) { + printk("TESTPOINT PASSED: The thread has unlocked the scheduler and is preemptible again.\n"); + } else { + printk("TESTPOINT FAILED: The thread is still non-preemptible after unlocking the scheduler.\n"); + } + + k_thread_priority_set(k_current_get(), K_PRIO_COOP(1)); + if (k_is_preempt_thread()) { + printk("TESTPOINT FAILED: The thread's priority should be in the cooperative range now.\n"); + } else { + printk("TESTPOINT PASSED: The thread's priority is in the cooperative range.\n"); + } + k_sem_give(&end_sema); +} + +/** + * @name: tcoop_ctx + * @msg: This function evaluates the behavior of a cooperative thread in relation to scheduler locking and thread priority adjustments. It begins by verifying that the current thread is non-preemptible due to its cooperative nature. The function then adjusts the thread's priority to a preemptive level and re-evaluates its preempt status. Following this, it locks and unlocks the scheduler, each time checking the thread's preempt status to confirm that the operations are effectively altering the thread's preemptibility as expected. + * @param {void} *p1, *p2, *p3 are placeholders for potential future parameters, serving no purpose in the current context. + * @return {None} + */ +static void tcoop_ctx(void *p1, void *p2, void *p3) +{ + if (k_is_preempt_thread()) { + printk("TESTPOINT FAILED: The thread's priority should be in the cooperative range.\n"); + } else { + printk("TESTPOINT PASSED: The thread's priority is in the cooperative range.\n"); + } + + k_thread_priority_set(k_current_get(), K_PRIO_PREEMPT(1)); + if (k_is_preempt_thread()) { + printk("TESTPOINT PASSED: The thread's priority is now in the preemptible range.\n"); + } else { + printk("TESTPOINT FAILED: The thread's priority is not in the preemptible range after adjustment.\n"); + } + + k_sched_lock(); + if (k_is_preempt_thread()) { + printk("TESTPOINT FAILED: The thread should not be preemptible after locking the scheduler.\n"); + } else { + printk("TESTPOINT PASSED: The thread has locked the scheduler.\n"); + } + k_sched_unlock(); + if (k_is_preempt_thread()) { + printk("TESTPOINT PASSED: The thread has unlocked the scheduler and is preemptible again.\n"); + } else { + printk("TESTPOINT FAILED: The thread is still non-preemptible after unlocking the scheduler.\n"); + } + + k_sem_give(&end_sema); +} + + + +/** + * @brief Validate the correctness of k_is_preempt_thread() + * + * @details Create a preemptive thread, lock the scheduler + * and call k_is_preempt_thread(). Unlock the scheduler and + * call k_is_preempt_thread() again. Create a cooperative + * thread and lock the scheduler k_is_preempt_thread() and + * unlock the scheduler and call k_is_preempt_thread(). + * + * @see k_is_preempt_thread() + * + * @ingroup kernel_sched_tests + */ + void test_sched_is_preempt_thread(void) +{ + k_sem_init(&end_sema, 0, 1); + + /* create preempt thread */ + k_tid_t tid = k_thread_create(&tdata, tstack, STACK_SIZE, + tpreempt_ctx, NULL, NULL, NULL, + K_PRIO_PREEMPT(1), 0, K_NO_WAIT); + k_sem_take(&end_sema, K_FOREVER); + k_thread_abort(tid); + + /* create coop thread */ + tid = k_thread_create(&tdata, tstack, STACK_SIZE, + tcoop_ctx, NULL, NULL, NULL, + K_PRIO_COOP(1), 0, K_NO_WAIT); + k_sem_take(&end_sema, K_FOREVER); + k_thread_abort(tid); + +} + diff --git a/app/system/kernel_feature/schedule/src/test_sched_priority.c b/app/system/kernel_feature/schedule/src/test_sched_priority.c new file mode 100644 index 0000000..b1bd37c --- /dev/null +++ b/app/system/kernel_feature/schedule/src/test_sched_priority.c @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2016 Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include "test_sched.h" +#include +#include + + +#define THREAD_NUM 4 + +static struct k_thread tdata_prio[THREAD_NUM]; +static struct k_thread tdata; +static int last_prio; +static uint8_t tid_num[4]; +static struct k_sem sync_sema; + + +static void thread_entry(void *p1, void *p2, void *p3) +{ + last_prio = k_thread_priority_get(k_current_get()); +} + +static void thread_entry_prio(void *p1, void *p2, void *p3) +{ + static int i; + + k_sem_take(&sync_sema, K_MSEC(100)); + + tid_num[i++] = POINTER_TO_INT(p1); +} + + +/* test cases */ + +/** + * @brief Validate that the cooperative thread will + * not be preempted + * + * @details Create a cooperative thread with priority higher + * than the current cooperative thread. Make sure that the higher + * priority thread will not preempt the lower priority cooperative + * thread. + * + * @ingroup kernel_sched_tests + */ +void test_priority_cooperative(void) +{ + int old_prio = k_thread_priority_get(k_current_get()); + + /* set current thread to a negative priority */ + last_prio = -1; + k_thread_priority_set(k_current_get(), last_prio); + + /* spawn thread with higher priority */ + int spawn_prio = last_prio - 1; + + k_tid_t tid = k_thread_create(&tdata, tstack, STACK_SIZE, + thread_entry, NULL, NULL, NULL, + spawn_prio, 0, K_NO_WAIT); + /* checkpoint: current thread shouldn't preempted by higher thread */ + if (last_prio != k_thread_priority_get(k_current_get())) { + printk("ERROR: Current thread's priority was changed unexpectedly.\n"); + } else { + printk("PASS: Current thread's priority remains unchanged, as expected.\n"); + } + k_sleep(K_MSEC(100)); + /* checkpoint: spawned thread get executed */ + if (last_prio != spawn_prio) + { + printk("ERROR: Spawned thread's priority does not match the expected value.\n"); + } else { + printk("PASS: Spawned thread's priority matches the expected value.\n"); + } + k_thread_abort(tid); + + /* restore environment */ + k_thread_priority_set(k_current_get(), old_prio); +} + +/** + * @brief Validate preemptiveness of preemptive thread + * + * @details Create a preemptive thread which is of priority + * lower than current thread. Current thread is made has preemptive. + * Make sure newly created thread is not preempted. Now create a + * preemptive thread which is of priority higher than current + * thread. Make sure newly created thread is preempted + * + * @ingroup kernel_sched_tests + */ +void test_priority_preemptible(void) +{ + int old_prio = k_thread_priority_get(k_current_get()); + + /* set current thread to a non-negative priority */ + last_prio = 2; + k_thread_priority_set(k_current_get(), last_prio); + + int spawn_prio = last_prio - 1; + + k_tid_t tid = k_thread_create(&tdata, tstack, STACK_SIZE, + thread_entry, NULL, NULL, NULL, + spawn_prio, 0, K_NO_WAIT); + /* checkpoint: thread is preempted by higher thread */ + if (last_prio == spawn_prio) + { + printk("Checkpoint PASSED: Thread is preempted by higher priority thread.\n"); + } else { + printk("Checkpoint FAILED: Thread should have been preempted by higher priority thread.\n"); + } + + k_sleep(K_MSEC(100)); + k_thread_abort(tid); + + spawn_prio = last_prio + 1; + tid = k_thread_create(&tdata, tstack, STACK_SIZE, + thread_entry, NULL, NULL, NULL, + spawn_prio, 0, K_NO_WAIT); + /* checkpoint: thread is not preempted by lower thread */ + if (last_prio == spawn_prio) { + printk("Checkpoint FAILED: Thread should not be preempted by lower priority thread.\n"); + } else { + printk("Checkpoint PASSED: Thread is not preempted by lower priority thread.\n"); + } + k_thread_abort(tid); + + /* restore environment */ + k_thread_priority_set(k_current_get(), old_prio); +} + + +/** + * @brief Validate scheduling sequence of preemptive threads with start delay + * + * @details Create four preemptive threads which are of priority + * higher than current thread. Make sure that the highest priority + * and longest waiting thread is scheduled first. + * + * @ingroup kernel_sched_tests + */ +void test_priority_preemptible_wait_prio(void) +{ + int old_prio = k_thread_priority_get(k_current_get()); + k_tid_t tid[THREAD_NUM]; + uint8_t tid_chk[4] = { 0, 1, 2, 3 }; + + k_sem_init(&sync_sema, 0, THREAD_NUM); + + /* Ensure that this code starts running at the start of a system tick */ + k_usleep(1); + + /* set current thread to a non-negative priority */ + last_prio = K_PRIO_PREEMPT(2); + k_thread_priority_set(k_current_get(), last_prio); + + /* the highest-priority thread that has waited the longest */ + tid[0] = k_thread_create(&tdata_prio[0], tstacks[0], STACK_SIZE, + thread_entry_prio, INT_TO_POINTER(0), NULL, NULL, + K_PRIO_PREEMPT(0), 0, K_MSEC(10)); + /* the highest-priority thread that has waited the shorter */ + tid[1] = k_thread_create(&tdata_prio[1], tstacks[1], STACK_SIZE, + thread_entry_prio, INT_TO_POINTER(1), NULL, NULL, + K_PRIO_PREEMPT(0), 0, K_MSEC(20)); + /* the lowest-priority thread that has waited longest */ + tid[2] = k_thread_create(&tdata_prio[2], tstacks[2], STACK_SIZE, + thread_entry_prio, INT_TO_POINTER(2), NULL, NULL, + K_PRIO_PREEMPT(1), 0, K_MSEC(10)); + /* the lowest-priority thread that has waited shorter */ + tid[3] = k_thread_create(&tdata_prio[3], tstacks[3], STACK_SIZE, + thread_entry_prio, INT_TO_POINTER(3), NULL, NULL, + K_PRIO_PREEMPT(1), 0, K_MSEC(20)); + + /* relinquish CPU for above threads to start */ + k_sleep(K_MSEC(30)); + + for (int i = 0; i < THREAD_NUM; i++) { + k_sem_give(&sync_sema); + } + + if (memcmp(tid_num, tid_chk, 4) != 0) { + printk("ERROR: scheduling priority failed\n"); + } else { + printk("Test PASSED: scheduling priorities are correct\n"); + } + + /* test case tear down */ + for (int i = 0; i < THREAD_NUM; i++) { + k_thread_abort(tid[i]); + } + + /* restore environment */ + k_thread_priority_set(k_current_get(), old_prio); +} + diff --git a/app/system/kernel_feature/schedule/src/test_sched_timeslice_and_lock.c b/app/system/kernel_feature/schedule/src/test_sched_timeslice_and_lock.c new file mode 100644 index 0000000..ff0b987 --- /dev/null +++ b/app/system/kernel_feature/schedule/src/test_sched_timeslice_and_lock.c @@ -0,0 +1,573 @@ +/* + * Copyright (c) 2016 Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include "test_sched.h" +#include +#include + +#define THREADS_NUM 3 +#define DURATION K_MSEC(1) + +BUILD_ASSERT(THREADS_NUM <= MAX_NUM_THREAD); + +static struct thread_data tdata[THREADS_NUM]; +static struct k_thread tthread[THREADS_NUM]; +static int old_prio, init_prio; + +struct k_thread t; + +K_SEM_DEFINE(pend_sema, 0, 1); +K_SEM_DEFINE(timer_sema, 0, 1); +struct k_timer th_wakeup_timer; + +static void thread_entry(void *p1, void *p2, void *p3) +{ + int sleep_ms = POINTER_TO_INT(p2); + + if (sleep_ms > 0) { + k_msleep(sleep_ms); + } + + int tnum = POINTER_TO_INT(p1); + + tdata[tnum].executed = 1; +} + +static void setup_threads(void) +{ + old_prio = k_thread_priority_get(k_current_get()); + for (int i = 0; i < THREADS_NUM; i++) { + if (i == 0) { + /* spawn thread with higher priority */ + tdata[i].priority = init_prio - 1; + } else if (i == 1) { + /* spawn thread with same priority */ + tdata[i].priority = init_prio; + } else { + /* spawn thread with lower priority */ + tdata[i].priority = init_prio + 1; + } + tdata[i].executed = 0; + } + k_thread_priority_set(k_current_get(), init_prio); +} + +static void spawn_threads(int sleep_sec) +{ + for (int i = 0; i < THREADS_NUM; i++) { + tdata[i].tid = k_thread_create(&tthread[i], tstacks[i], + STACK_SIZE, thread_entry, + INT_TO_POINTER(i), + INT_TO_POINTER(sleep_sec), + NULL, tdata[i].priority, 0, + K_NO_WAIT); + } +} + +static void teardown_threads(void) +{ + for (int i = 0; i < THREADS_NUM; i++) { + k_thread_abort(tdata[i].tid); + } + k_thread_priority_set(k_current_get(), old_prio); +} + +static void timer_handler(struct k_timer *timer) +{ + ARG_UNUSED(timer); + k_sem_give(&timer_sema); +} + +static void thread_handler(void *p1, void *p2, void *p3) +{ + k_timer_init(&th_wakeup_timer, timer_handler, NULL); + k_timer_start(&th_wakeup_timer, DURATION, K_NO_WAIT); +} + +/* test cases */ + +/** + * @brief Validate the behavior of cooperative thread + * when it yields + * + * @ingroup kernel_sched_tests + * + * @details Create 3 threads of priority -2, -1 and 0. + * Yield the main thread which is cooperative. Check + * if all the threads gets executed. + */ +void test_yield_cooperative(void) +{ + + /* set current thread to a cooperative priority */ + init_prio = -1; + setup_threads(); + + spawn_threads(0); + /* checkpoint: only higher priority thread get executed when yield */ + k_yield(); + if (!(tdata[0].executed == 1 && tdata[1].executed == 1)) { + printk("ERROR: Higher priority threads did not execute as expected.\n"); + } + else + { + printk("SUCCESS: Higher priority threads executed as expected.\n"); + } + + for (int i = 2; i < THREADS_NUM; i++) { + if (tdata[i].executed != 0) { + printk("ERROR: Lower priority thread %d executed unexpectedly.\n", i); + } + else + { + printk("SUCCESS: Lower priority thread %d did not execute as expected.\n", i); + } + } + /* restore environment */ + teardown_threads(); +} +/** + * @brief Validate the behavior of cooperative thread when it sleeps + * + * @details Create 3 threads of priority -2, -1 and 0. Put the main + * thread in timeout queue by calling k_sleep() which is cooperative. + * Check if all the threads gets executed. + * + * @ingroup kernel_sched_tests + */ +void test_sleep_cooperative(void) +{ + /* set current thread to a cooperative priority */ + init_prio = -1; + setup_threads(); + + spawn_threads(0); + /* checkpoint: all ready threads get executed when k_sleep */ + k_sleep(K_MSEC(100)); + for (int i = 0; i < THREADS_NUM; i++) { + if (tdata[i].executed != 1) + { + printk("ERROR: Thread %d did not execute as expected.\n", i); + } + else + { + printk("SUCCESS: All threads executed after k_sleep as expected.\n"); + } + } + + /* restore environment */ + teardown_threads(); +} + +void test_busy_wait_cooperative(void) +{ + /* set current thread to a cooperative priority */ + init_prio = -1; + setup_threads(); + + spawn_threads(0); + k_busy_wait(100000); /* 100 ms */ + /* checkpoint: No other threads get executed */ + for (int i = 0; i < THREADS_NUM; i++) { + if (tdata[i].executed != 0) { + printk("ERROR: Thread %d executed unexpectedly during busy wait.\n", i); + } + else + { + printk("SUCCESS: No threads executed during busy wait as expected.\n"); + } + } + /* restore environment */ + teardown_threads(); +} + +/** + * @brief Validate k_wakeup() + * + * @details Create 3 threads with main thread with priority 0 + * and other threads with -1, 0 ,+1 priority. Now -1 priority + * thread gets executed and it is made to sleep for 10 sec. + * Now, wake up the -1 priority thread and check if it starts + * executing. + * + * @see k_wakeup() + * + * @ingroup kernel_sched_tests + */ +void test_sleep_wakeup_preemptible(void) +{ + /* set current thread to a preemptible priority */ + init_prio = 0; + setup_threads(); + + spawn_threads(10 * 1000); /* 10 second */ + /* checkpoint: lower threads not executed, high threads are in sleep */ + for (int i = 0; i < THREADS_NUM; i++) { + if (tdata[i].executed != 0) + { + printk("ERROR: Thread %d executed unexpectedly before wakeup.\n", i); + } + else + { + printk("SUCCESS: Thread %d did not execute before wakeup as expected.\n", i); + } + } + k_wakeup(tdata[0].tid); + if (tdata[0].executed != 1) + { + printk("ERROR: Thread 0 did not execute after wakeup.\n"); + } + else + { + printk("SUCCESS: Thread 0 executed after wakeup as expected.\n"); + } + /* restore environment */ + teardown_threads(); +} + +static int executed; +static void coop_thread(void *p1, void *p2, void *p3) +{ + k_sem_take(&pend_sema, K_MSEC(100)); + executed = 1; +} + +/** + * @brief Verify k_wakeup() behavior on pending thread + * + * @details The test creates a cooperative thread and let + * it wait for semaphore. Then calls k_wakeup(). The k_wakeup() + * call should return gracefully without waking up the thread + * + * @see k_wakeup() + * + * @ingroup kernel_sched_tests + */ +void test_pending_thread_wakeup(void) +{ + /* Make current thread preemptible */ + k_thread_priority_set(k_current_get(), K_PRIO_PREEMPT(1)); + + /* Create a thread which waits for semaphore */ + k_tid_t tid = k_thread_create(&t, tstack, STACK_SIZE, + (k_thread_entry_t)coop_thread, + NULL, NULL, NULL, + K_PRIO_COOP(1), 0, K_NO_WAIT); + + if (executed == 1) { + printk("ERROR: The thread didn't wait for semaphore acquisition.\n"); + } + else + { + printk("SUCCESS: The thread is correctly waiting for semaphore acquisition.\n"); + } + + /* Call wakeup on pending thread */ + k_wakeup(tid); + + if (executed == 1) { + printk("ERROR: k_wakeup woke up a pending thread!\n"); + } + else + { + printk("SUCCESS: k_wakeup did not affect the pending thread as expected.\n"); + } + + k_thread_abort(tid); +} + +/** + * @brief Validate preemptive thread behavior with time slice + * + * @details Create 3 threads with -1, 0, and 1 as priority, setup + * time slice for threads with priority 0. Make sure the threads + * with equal priorities are executed in time slice. + * + * @ingroup kernel_sched_tests + */ + +void test_time_slicing_preemptible(void) +{ +#ifdef CONFIG_TIMESLICING + /* set current thread to a preemptible priority */ + init_prio = 0; + setup_threads(); + + k_sched_time_slice_set(200, 0); /* 200 ms */ + spawn_threads(0); + /* checkpoint: higher priority threads get executed immediately */ + if (tdata[0].executed != 1) { + printk("ERROR: Higher priority thread did not execute immediately.\n"); + } + else + { + printk("SUCCESS: Higher priority thread executed immediately as expected.\n"); + } + + k_busy_wait(500000); /* 500 ms */ + /* checkpoint: equal priority threads get executed every time slice */ + if (tdata[1].executed != 1) { + printk("ERROR: Equal priority thread did not execute during time slice.\n"); + } + else + { + printk("SUCCESS: Equal priority thread executed during time slice as expected.\n"); + } + + for (int i = 2; i < THREADS_NUM; i++) { + if (tdata[i].executed != 0) { + printk("ERROR: Thread %d executed unexpectedly.\n", i); + } + else + { + printk("SUCCESS: Thread %d did not execute during time slice as expected.\n", i); + } + } + + /* restore environment */ + k_sched_time_slice_set(0, 0); /* disable time slice */ + teardown_threads(); +#else /* CONFIG_TIMESLICING */ + printk("Time slicing configuration is not enabled.\n"); +#endif /* CONFIG_TIMESLICING */ +} + +/** + * @brief Check the behavior of preemptive thread with k_busy_wait() + * + * @details Create 3 threads with -1, 0, and 1 as priority, + * setup time slice for threads with priority 0. Make sure the + * threads with equal priorities are executed in time slice. + * Also run k_busy_wait() for 5 secs and check if other threads + * are not executed at that time. + * + * @see k_busy_wait() + * + * @ingroup kernel_sched_tests + */ +void test_time_slicing_disable_preemptible(void) +{ +#ifdef CONFIG_TIMESLICING + /* set current thread to a preemptible priority */ + init_prio = 0; + setup_threads(); + + spawn_threads(0); + + /* checkpoint: higher priority threads get executed immediately */ + if (tdata[0].executed != 1) { + printk("ERROR: Higher priority threads did not execute immediately.\n"); + } + else + { + printk("SUCCESS: Higher priority thread executed immediately as expected.\n"); + } + + k_busy_wait(500000); /* 500 ms */ + /* checkpoint: equal priority threads get executed every time slice */ + if (tdata[1].executed != 0) { + printk("ERROR: An equal priority thread executed during busy wait.\n"); + } + else + { + printk("SUCCESS: No equal priority threads executed during busy wait as expected.\n"); + } + + + for (int i = 2; i < THREADS_NUM; i++) { + if (tdata[i].executed != 0) { + printk("ERROR: Thread %d executed unexpectedly.\n", i); + } + else + { + printk("SUCCESS: Thread %d did not execute unexpectedly as expected.\n", i); + } + } + /* restore environment */ + teardown_threads(); +#else /* CONFIG_TIMESLICING */ + printk("CONFIG_TIMESLICING is not enabled.\n"); +#endif /* CONFIG_TIMESLICING */ +} + +/** + * @brief Lock the scheduler when preemptive threads are running + * + * @details Create 3 threads and lock the scheduler. Make sure that the + * threads are not executed. Call k_sleep() and check if the threads + * have executed. + * + * @ingroup kernel_sched_tests + */ +void test_lock_preemptible(void) +{ + /* set current thread to a preemptible priority */ + init_prio = 0; + setup_threads(); + + k_sched_lock(); + spawn_threads(0); + /* do critical thing */ + k_busy_wait(100000); + /* checkpoint: all other threads not been executed */ + for (int i = 0; i < THREADS_NUM; i++) { + if (tdata[i].executed != 0) { + printk("ERROR: Thread %d executed despite the scheduler being locked.\n", i); + } + else + { + printk("SUCCESS: Scheduler lock prevented thread %d from executing as expected.\n", i); + } + } + /* make current thread unready */ + k_sleep(K_MSEC(100)); + /* checkpoint: all other threads get executed */ + for (int i = 0; i < THREADS_NUM; i++) { + if (tdata[i].executed != 1) { + printk("ERROR: Thread %d did not execute after scheduler unlock.\n", i); + } + else + { + printk("SUCCESS: Thread %d executed after scheduler unlock as expected.\n", i); + } + } + /* restore environment */ + teardown_threads(); +} + +/** + * @brief Validate k_sched_lock() and k_sched_unlock() + * + * @details Lock the scheduler and create 3 threads. Check + * that the threads are not executed. Call k_sched_unlock() + * and check if the threads have executed. + * + * @see k_sched_lock(), k_sched_unlock() + * + * @ingroup kernel_sched_tests + */ +void test_unlock_preemptible(void) +{ + /* set current thread to a preemptible priority */ + init_prio = 0; + setup_threads(); + + k_sched_lock(); + spawn_threads(0); + /* do critical thing */ + k_busy_wait(100000); + + k_sched_unlock(); + + /* ensure threads of equal priority can run */ + k_yield(); + + /* checkpoint: higher and equal threads get executed */ + if (tdata[0].executed != 1 || tdata[1].executed != 1 || tdata[2].executed != 0) { + printk("ERROR: Incorrect execution state of threads after unlock.\n"); + } + else { + printk("SUCCESS: Higher and equal priority threads executed after unlock as expected.\n"); + for (int i = 0; i < THREADS_NUM; i++) { + if (tdata[i].executed == 1) { + printk("SUCCESS: Thread %d executed as expected.\n", i); + } + } + } + /* restore environment */ + teardown_threads(); +} + +/** + * @brief Validate nested k_sched_lock() and k_sched_unlock() + * + * @details In a preemptive thread, lock the scheduler twice and + * create a cooperative thread. Call k_sched_unlock() and check the + * cooperative thread haven't executed. Unlock it again to see the + * thread have executed this time. + * + * @see k_sched_lock(), k_sched_unlock() + * + * @ingroup kernel_sched_tests + */ +void test_unlock_nested_sched_lock(void) +{ + /* set current thread to a preemptible priority */ + init_prio = 0; + setup_threads(); + + /* take the scheduler lock twice */ + k_sched_lock(); + k_sched_lock(); + + /* spawn threads without wait */ + spawn_threads(0); + + /* do critical thing */ + k_busy_wait(100000); + + /* unlock once; this shouldn't let other threads to run */ + k_sched_unlock(); + + /* checkpoint: no threads get executed */ + for (int i = 0; i < THREADS_NUM; i++) { + if (tdata[i].executed != 0) { + printk("ERROR: Thread %d executed after one unlock.\n", i); + } + } + + /* unlock another; this let the higher thread to run */ + k_sched_unlock(); + + /* Ensure threads of equal priority run */ + k_yield(); + + /* checkpoint: higher threads NOT get executed */ + + if (tdata[0].executed != 1 || tdata[1].executed != 1 || tdata[2].executed != 0) { + printk("ERROR: Incorrect execution state of threads after second unlock.\n"); + } + else + { + printk("SUCCESS: Higher and equal priority threads executed after second unlock as expected.\n"); + } + + /* restore environment */ + teardown_threads(); +} + +/** + * @brief validate k_wakeup() in some corner scenario + * @details trigger a timer and after expiration of timer + * call k_wakeup(), even the thread is not in sleep state neither + * in pending state + * + * @see k_wakeup() + * + * @ingroup kernel_sched_tests + */ + +void test_wakeup_expired_timer_thread(void) +{ + k_tid_t tid = k_thread_create(&tthread[0], tstack, STACK_SIZE, + thread_handler, NULL, NULL, NULL, + K_PRIO_PREEMPT(0), 0, K_NO_WAIT); + k_sem_take(&timer_sema, K_FOREVER); + /* wakeup a thread if the timer is expired */ + k_wakeup(tid); + k_thread_abort(tid); +} + + + + + + + + + + diff --git a/app/system/kernel_feature/schedule/src/test_sched_timeslice_reset.c b/app/system/kernel_feature/schedule/src/test_sched_timeslice_reset.c new file mode 100644 index 0000000..704f3cc --- /dev/null +++ b/app/system/kernel_feature/schedule/src/test_sched_timeslice_reset.c @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2017 Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include "test_sched.h" +#include +#include + + + + +#define NUM_THREAD 3 + +BUILD_ASSERT(NUM_THREAD <= MAX_NUM_THREAD); + +/* slice size in millisecond */ +#define SLICE_SIZE 200 +/* busy for more than one slice */ +#define BUSY_MS (SLICE_SIZE + 20) +/* a half timeslice */ +#define HALF_SLICE_SIZE (SLICE_SIZE >> 1) +#define HALF_SLICE_SIZE_CYCLES \ + ((uint64_t)(HALF_SLICE_SIZE)*sys_clock_hw_cycles_per_sec() / 1000) + +/* Task switch tolerance ... */ +#if CONFIG_SYS_CLOCK_TICKS_PER_SEC >= 1000 +/* ... will not take more than 1 ms. */ +#define TASK_SWITCH_TOLERANCE (1) +#else +/* ... 1ms is faster than a tick, loosen tolerance to 1 tick */ +#define TASK_SWITCH_TOLERANCE (1000 / CONFIG_SYS_CLOCK_TICKS_PER_SEC) +#endif + +K_SEM_DEFINE(sema, 0, NUM_THREAD); +/* elapsed_slice taken by last thread */ +static uint32_t elapsed_slice; +static int thread_idx; + +static uint32_t cycles_delta(uint32_t *reftime) +{ + uint32_t now, delta; + + now = k_cycle_get_32(); + delta = now - *reftime; + *reftime = now; + + return delta; +} + +static void thread_time_slice(void *p1, void *p2, void *p3) +{ + uint32_t t = cycles_delta(&elapsed_slice); + uint32_t expected_slice_min, expected_slice_max; + uint32_t switch_tolerance_ticks = + k_ms_to_ticks_ceil32(TASK_SWITCH_TOLERANCE); + + if (thread_idx == 0) { + /* + * Thread number 0 releases CPU after HALF_SLICE_SIZE, and + * expected to switch in less than the switching tolerance. + */ + expected_slice_min = + (uint64_t)(HALF_SLICE_SIZE - TASK_SWITCH_TOLERANCE) * + sys_clock_hw_cycles_per_sec() / 1000; + expected_slice_max = + (uint64_t)(HALF_SLICE_SIZE + TASK_SWITCH_TOLERANCE) * + sys_clock_hw_cycles_per_sec() / 1000; + } else { + /* + * Other threads are sliced with tick granularity. Here, we + * also expecting task switch below the switching tolerance. + */ + expected_slice_min = + (k_ms_to_ticks_floor32(SLICE_SIZE) + - switch_tolerance_ticks) + * k_ticks_to_cyc_floor32(1); + expected_slice_max = + (k_ms_to_ticks_ceil32(SLICE_SIZE) + + switch_tolerance_ticks) + * k_ticks_to_cyc_ceil32(1); + } + + printk("thread[%d] elapsed slice: %d, expected: <%d, %d>\n", + thread_idx, t, expected_slice_min, expected_slice_max); + + + /* Before the assert, otherwise in case of fail the output + * will give the impression that the same thread ran more than + * once + */ + thread_idx = (thread_idx + 1) % NUM_THREAD; + + + if (!(t >= expected_slice_min && t <= expected_slice_max)) { + printk("ERROR: Thread[%d] timeslice out of expected range, got %u, expected <%u, %u>\n", + thread_idx, t, expected_slice_min, expected_slice_max); + } else { + printk("SUCCESS: Thread[%d] timeslice within expected range.\n", thread_idx); + } + + + /* Keep the current thread busy for more than one slice, even though, + * when timeslice used up the next thread should be scheduled in. + */ + spin_for_ms(BUSY_MS); + k_sem_give(&sema); +} + +/* test cases */ +/** + * @brief Check the behavior of preemptive threads when the + * time slice is disabled and enabled + * + * @details Create multiple preemptive threads with few different + * priorities and few with same priorities and enable the time slice. + * Ensure that each thread is given the time slice period to execute. + * + * @see k_sched_time_slice_set(), k_sem_reset(), k_cycle_get_32(), + * k_uptime_get_32() + * + * @ingroup kernel_sched_tests + */ +void test_slice_reset(void) +{ + uint32_t t32; + k_tid_t tid[NUM_THREAD]; + struct k_thread t[NUM_THREAD]; + int old_prio = k_thread_priority_get(k_current_get()); + + thread_idx = 0; + /* disable timeslice */ + k_sched_time_slice_set(0, K_PRIO_PREEMPT(0)); + + /* The slice size needs to be set in ms (which get converted + * into ticks internally), but we want to loop over a half + * slice in cycles. That requires a bit of care to be sure the + * value divides properly. + */ + uint32_t slice_ticks = k_ms_to_ticks_ceil32(SLICE_SIZE); + uint32_t half_slice_cyc = k_ticks_to_cyc_ceil32(slice_ticks / 2); + + if (slice_ticks % 2 != 0) { + uint32_t deviation = k_ticks_to_cyc_ceil32(1); + /* slice_ticks can't be divisible by two, so we add the + * (slice_ticks / 2) floating part back to half_slice_cyc. + */ + half_slice_cyc = half_slice_cyc + (deviation / 2); + } + + for (int j = 0; j < 2; j++) { + k_sem_reset(&sema); + + /* update priority for current thread */ + k_thread_priority_set(k_current_get(), K_PRIO_PREEMPT(j)); + + /* synchronize to tick boundary */ + k_usleep(1); + + /* create delayed threads with equal preemptive priority */ + for (int i = 0; i < NUM_THREAD; i++) { + tid[i] = k_thread_create(&t[i], tstacks[i], STACK_SIZE, + thread_time_slice, NULL, NULL, + NULL, K_PRIO_PREEMPT(j), 0, + K_NO_WAIT); + } + + /* enable time slice (and reset the counter!) */ + k_sched_time_slice_set(SLICE_SIZE, K_PRIO_PREEMPT(0)); + + /* initialize reference timestamp */ + cycles_delta(&elapsed_slice); + + /* current thread consumed a half timeslice */ + t32 = k_cycle_get_32(); + while (k_cycle_get_32() - t32 < half_slice_cyc) { + Z_SPIN_DELAY(50); + } + + /* relinquish CPU and wait for each thread to complete */ + k_sleep(K_TICKS(slice_ticks * (NUM_THREAD + 1))); + for (int i = 0; i < NUM_THREAD; i++) { + k_sem_take(&sema, K_FOREVER); + } + + /* test case teardown */ + for (int i = 0; i < NUM_THREAD; i++) { + k_thread_abort(tid[i]); + } + /* disable time slice */ + k_sched_time_slice_set(0, K_PRIO_PREEMPT(0)); + } + k_thread_priority_set(k_current_get(), old_prio); +} + diff --git a/app/system/kernel_feature/schedule/src/test_slice_scheduling.c b/app/system/kernel_feature/schedule/src/test_slice_scheduling.c new file mode 100644 index 0000000..f8638ad --- /dev/null +++ b/app/system/kernel_feature/schedule/src/test_slice_scheduling.c @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2022 Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include "test_sched.h" +#include +#include + + + +/* nrf 51 has lower ram, so creating less number of threads */ +#if CONFIG_SRAM_SIZE <= 24 + #define NUM_THREAD 2 +#elif (CONFIG_SRAM_SIZE <= 32) \ + || defined(CONFIG_SOC_EMSK_EM7D) + #define NUM_THREAD 3 +#else + #define NUM_THREAD 10 +#endif +#define BASE_PRIORITY 0 +#define ITERATION_COUNT 5 + +BUILD_ASSERT(NUM_THREAD <= MAX_NUM_THREAD); +/* slice size in millisecond */ +#define SLICE_SIZE 200 +#define PERTHREAD_SLICE_TICKS 64 +#define TICK_SLOP 4 +/* busy for more than one slice */ +#define BUSY_MS (SLICE_SIZE + 20) +static struct k_thread t[NUM_THREAD]; + +static K_SEM_DEFINE(sema1, 0, NUM_THREAD); +/* elapsed_slice taken by last thread */ +static int64_t elapsed_slice; + +static int thread_idx; + +static void thread_tslice(void *p1, void *p2, void *p3) +{ + int idx = POINTER_TO_INT(p1); + + /* Print New line for last thread */ + int thread_parameter = (idx == (NUM_THREAD - 1)) ? '\n' : + (idx + 'A'); + + int64_t expected_slice_min = k_ticks_to_ms_floor64(k_ms_to_ticks_ceil32(SLICE_SIZE) - 1); + int64_t expected_slice_max = k_ticks_to_ms_ceil64(k_ms_to_ticks_ceil32(SLICE_SIZE) + 1); + + /* Clumsy, but need to handle the precision loss with + * submillisecond ticks. It's always possible to alias and + * produce a tdelta of "1", no matter how fast ticks are. + */ + if (expected_slice_max == expected_slice_min) { + expected_slice_max = expected_slice_min + 1; + } + + while (1) { + int64_t tdelta = k_uptime_delta(&elapsed_slice); + printf("%c", thread_parameter); + /* Test Fails if thread exceed allocated time slice or + * Any thread is scheduled out of order. + */ + if (!(tdelta >= expected_slice_min) || !(tdelta <= expected_slice_max) || !(idx == thread_idx)) { + printk("ERROR: Thread %d exceeded allocated time slice. tdelta: %lld, expected: <%lld, %lld>\n", + idx, tdelta, expected_slice_min, expected_slice_max); + // Handling error: You can choose to abort or take other actions. + } else { + printk("SUCCESS: Thread %d within time slice. tdelta: %lld, expected: <%lld, %lld>\n", + idx, tdelta, expected_slice_min, expected_slice_max); + } + + thread_idx = (thread_idx + 1) % (NUM_THREAD); + + /* Keep the current thread busy for more than one slice, + * even though, when timeslice used up the next thread + * should be scheduled in. + */ + spin_for_ms(BUSY_MS); + k_sem_give(&sema1); + } +} + +/* test cases */ + +/** + * @brief Check the behavior of preemptive threads when the + * time slice is disabled and enabled + * + * @details Create multiple preemptive threads with same priorities + * and few with same priorities and enable the time slice. + * Ensure that each thread is given the time slice period to execute. + * + * @ingroup kernel_sched_tests + */ +void test_slice_scheduling(void) +{ + k_tid_t tid[NUM_THREAD]; + int old_prio = k_thread_priority_get(k_current_get()); + int count = 0; + + thread_idx = 0; + + /* disable timeslice */ + k_sched_time_slice_set(0, K_PRIO_PREEMPT(0)); + + /* update priority for current thread */ + k_thread_priority_set(k_current_get(), K_PRIO_PREEMPT(BASE_PRIORITY)); + + /* create threads with equal preemptive priority */ + for (int i = 0; i < NUM_THREAD; i++) { + tid[i] = k_thread_create(&t[i], tstacks[i], STACK_SIZE, + thread_tslice, + INT_TO_POINTER(i), NULL, NULL, + K_PRIO_PREEMPT(BASE_PRIORITY), 0, + K_NO_WAIT); + } + + /* enable time slice */ + k_sched_time_slice_set(SLICE_SIZE, K_PRIO_PREEMPT(BASE_PRIORITY)); + + while (count < ITERATION_COUNT) { + k_uptime_delta(&elapsed_slice); + + /* Keep the current thread busy for more than one slice, + * even though, when timeslice used up the next thread + * should be scheduled in. + */ + spin_for_ms(BUSY_MS); + + /* relinquish CPU and wait for each thread to complete */ + for (int i = 0; i < NUM_THREAD; i++) { + k_sem_take(&sema1, K_FOREVER); + } + count++; + } + + + /* test case teardown */ + for (int i = 0; i < NUM_THREAD; i++) { + k_thread_abort(tid[i]); + } + + /* disable time slice */ + k_sched_time_slice_set(0, K_PRIO_PREEMPT(0)); + + k_thread_priority_set(k_current_get(), old_prio); +} + +static volatile int32_t perthread_count; +static volatile uint32_t last_cyc; +static volatile bool perthread_running; +static K_SEM_DEFINE(perthread_sem, 0, 1); + +static void slice_expired(struct k_thread *thread, void *data) +{ + if (thread != data) { + printk("ERROR: Wrong callback data pointer.\n"); + } + + uint32_t now = k_cycle_get_32(); + uint32_t dt = k_cyc_to_ticks_near32(now - last_cyc); + + if (!perthread_running) { + printk("ERROR: Thread didn't start.\n"); + } + + + if (dt < (PERTHREAD_SLICE_TICKS - TICK_SLOP)) { + printk("ERROR: Slice expired >%d ticks too soon (dt=%d).\n", TICK_SLOP, dt); + } else if ((dt - PERTHREAD_SLICE_TICKS) > TICK_SLOP) { + printk("ERROR: Slice expired >%d ticks late (dt=%d).\n", TICK_SLOP, dt); + } + + last_cyc = now; + + /* First time through, just let the slice expire and keep + * running. Second time, abort the thread and wake up the + * main test function. + */ + if (perthread_count++ != 0) { + k_thread_abort(thread); + perthread_running = false; + k_sem_give(&perthread_sem); + } +} + +static void slice_perthread_fn(void *a, void *b, void *c) +{ + ARG_UNUSED(a); ARG_UNUSED(b); ARG_UNUSED(c); + while (true) { + perthread_running = true; + k_busy_wait(10); + } +} + +void test_slice_perthread(void) +{ + if (!IS_ENABLED(CONFIG_TIMESLICE_PER_THREAD)) { + printk("TEST SKIPPED: Time slicing per thread is not enabled.\n"); + return; + } + + /* Create the thread but don't start it */ + k_thread_create(&t[0], tstacks[0], STACK_SIZE, + slice_perthread_fn, NULL, NULL, NULL, + 1, 0, K_FOREVER); + k_thread_time_slice_set(&t[0], PERTHREAD_SLICE_TICKS, slice_expired, &t[0]); + + /* Tick align, set up, then start */ + k_usleep(1); + last_cyc = k_cycle_get_32(); + k_thread_start(&t[0]); + + k_sem_take(&perthread_sem, K_FOREVER); + if (perthread_running) { + printk("ERROR: Thread failed to suspend as expected.\n"); + } else { + printk("SUCCESS: Thread suspended as expected.\n"); + } + +} + + + diff --git a/app/system/smp/smp_test/.gdbinit b/app/system/smp/smp_test/.gdbinit new file mode 100644 index 0000000..68c1f81 --- /dev/null +++ b/app/system/smp/smp_test/.gdbinit @@ -0,0 +1,48 @@ +# increase the default remote timeout in gdb because +# Windows libusb transactions could be slow +set remotetimeout 100000 + +# gdb connect to openocd in port 3333 +target extended-remote localhost:3333 + +# start openocd working queue, monitor followed with openocd command here +monitor init + +# force to use hardware breakpoint, otherwise use software breakpoint +# for e2000d/q, num of hardware breakpoints supposed to be 6 +monitor gdb_breakpoint_override hardware + +# load elf image +# load ./build/zephyr/zephyr.elf + +# in case symbols skip load,load agin +file ./build/zephyr/zephyr.elf + +# we can break at the beginning of code by address or by symbol +#break _boot + +# add more breakpoints in application +#break JtagTouchRegisters +#break JtagTouchMemory +# break bubbleSort` +# break JtagPostSort +#break bubbleSortCXX + +# show all breakspoints we before running +# info breakpoints + +# show [-0x10 ~ +0x10 ] range of instructions when breaked +# display /10i $pc-16 + +# start running +# continue +layout src +# break boot_banner +# break sdmmc_write_blocks +# break z_arm64_prep_c +# break sdmmc_switch +# break sdmmc_read_csd +# break sdmmc_read_blocks +# break sd_idle +# break sd_send_interface_condition +# continue \ No newline at end of file diff --git a/app/system/smp/smp_test/CMakeLists.txt b/app/system/smp/smp_test/CMakeLists.txt new file mode 100644 index 0000000..e50ffc4 --- /dev/null +++ b/app/system/smp/smp_test/CMakeLists.txt @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(smp) + +target_sources(app PRIVATE src/main.c + src/smp_test.c) + +target_include_directories(app PRIVATE + ${ZEPHYR_BASE}/kernel/include + ${ZEPHYR_BASE}/arch/${ARCH}/include + ) diff --git a/app/system/smp/smp_test/Kconfig b/app/system/smp/smp_test/Kconfig new file mode 100644 index 0000000..606135a --- /dev/null +++ b/app/system/smp/smp_test/Kconfig @@ -0,0 +1,11 @@ +# Copyright (c) 2023 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +mainmenu "SMP test" + +source "Kconfig.zephyr" + +config SMP_TEST_RUN_FACTOR + int "Run factor for stressing tests, such as 'switch torture', \ + as a percentage" + default 100 diff --git a/app/system/smp/smp_test/README.md b/app/system/smp/smp_test/README.md new file mode 100644 index 0000000..baff159 --- /dev/null +++ b/app/system/smp/smp_test/README.md @@ -0,0 +1,98 @@ +# SMP 测试 + +## 1. 例程介绍 + +以下是对指定函数的详细描述,基于Zephyr RTOS的SMP(对称多处理)功能的测试场景。 + +- smp_tests_setup + 本函数用于SMP测试的初始化。通过让系统稍微睡眠,确保所有CPU都进入空闲线程,从而可以正确退出并运行主测试线程。这是SMP测试的通用准备步骤,确保测试环境的一致性和稳定性。 +- test_coop_resched_threads + 验证合作(cooperative)线程在SMP环境中的非抢占性。通过在多核上创建与CPU核数相等的合作线程,确保最后一个创建的线程不会抢占任何已经在运行的线程。这个测试验证了合作线程即使在多核环境下也保持其非抢占特性。 +- test_coop_switch_in_abort + 测试在SMP系统中中止(abort)线程时的合作线程切换行为。特别是,在一个线程中调用 `k_thread_abort()`时,验证是否可以正确地切换到其他合作线程执行,这是检测中止线程时上下文切换正确性的重要测试。 +- test_cpu_id_threads + 验证SMP环境中线程可以正确识别其运行的CPU核心。通过在一个线程中获取当前CPU的ID,然后在另一个线程中验证这个ID,以确保线程的CPU亲和性(affinity)和调度行为符合预期。 +- test_fatal_on_smp + 测试在SMP环境中触发致命错误(fatal error)的行为。验证当一个线程因致命错误被终止时,系统能否正确处理并确保系统稳定性。这是评估系统错误处理机制在多核环境下正确性的关键测试。 +- test_get_cpu + 验证在SMP环境中能否正确获取当前线程运行的CPU。通过在不同线程中调用获取CPU ID的函数,并比较结果,以确保线程能够准确识别其运行的处理器。 +- test_inc_concurrency + 测试SMP环境下的并发性。通过创建多个线程同时增加一个全局计数器,验证是否所有线程都能正确执行并发操作,以及全局状态的一致性和正确性。 +- test_preempt_resched_threads + 在SMP环境中验证抢占式(preemptive)线程的抢占性。通过创建不同优先级的抢占式线程,验证更高优先级的线程能否正确抢占CPU资源。 +- test_sleep_threads + 测试在SMP环境中线程睡眠(sleep)的行为。通过让线程睡眠,然后验证是否所有线程在预定时间后都能被正确唤醒和执行,以评估睡眠调度机制的正确性。 +- test_smp_coop_threads + 验证在SMP环境下,多个合作线程能否同时在不同核心上运行。这个测试通过创建多个合作线程并观察它们是否能够被分配到不同的CPU上执行,来评估系统的多核调度能力。 +- test_smp_ipi + 测试SMP环境中的内核间中断(Inter-Processor Interrupts, IPI)功能。通过触发IPI并验证是否所有CPU核心都能接收到IPI信号,来测试IPI的正确性和效率。 +- test_smp_release_global_lock + 验证在SMP系统中释放全局锁的行为。这个测试专注于全局锁在上下文切换和线程中止时的正确释放,是验证SMP系统同步机制正确性的重要测试。 +- test_smp_switch_torture + 对SMP系统中的上下文切换代码进行压力测试。通过频繁地在所有CPU核心上请求线程切换,测试系统的稳定 + +性和上下文切换的性能。 + +- test_wakeup_threads + 测试SMP环境中线程唤醒(wakeup)的行为。通过创建多个线程并使它们睡眠,然后从主线程中唤醒这些线程,以验证唤醒机制的正确性和效率。 +- test_workq_on_smp + 验证SMP环境下系统工作队列(workqueue)的行为。通过提交工作项到系统工作队列,并确保工作项能在不同的CPU核心上执行,来测试工作队列的多核调度能力。 +- test_yield_threads + 在SMP环境中测试线程主动让出(yield)CPU的行为。通过创建多个线程并使用 `k_yield()`让出CPU,然后验证是否所有线程都能按预期被调度执行,来评估调度器的公平性和响应性。 + +## 2. 如何使用例程 + +本例程需要以下硬件, + +- E2000D/Q Demo板 + +### 2.1 硬件配置方法 + +保障串口正常工作后,不需要额外配置硬件 + +### 2.2 SDK配置方法 + +- 本例子已经提供好具体的编译指令,以下进行介绍: + +1. ``west build -b e2000q_demo_smp ./ -DOVERLAY_CONFIG=prj.conf``,编译命令, 使用west工具构建当前目录下的Zephyr项目,指定目标板为e2000q_demo_smp,并使用prj.conf配置文件覆盖默认配置 ,最终生成的执行文件将会保存在./build/zephyr/zephyr.elf +2. ``west build -t clean``, 清除缓存 ,使用west工具的clean目标清理Zephyr构建系统可能生成的任何其他临时文件或缓存 + +### 2.3 构建和下载 + +- 编译例程 + +``west build -b e2000q_demo_smp ./ -DOVERLAY_CONFIG=prj.conf`` + +- 编译主机测侧设置重启tftp服务器 + +``` +sudo service tftpd-hpa restart +``` + +- 开发板侧使用bootelf命令跳转 + +``` +setenv ipaddr 192.168.4.20 +setenv serverip 192.168.4.50 +setenv gatewayip 192.168.4.1 +tftpboot 0x90100000 zephyr.elf +bootelf -p 0x90100000 +``` + +### 2.4 输出与实验现象 + +- 所有用例均提供一系列可变配置,可在例程全局变量中修改 + +### 2.4.1 smp 测试 + +``` +smp_test +``` + +![1713407267028](figs/README/1713407267028.png) + +## 3. 如何解决问题 + +1. 本例程仅可以使用开启smp的配置 + +## 4. 修改历史记录 diff --git a/app/system/smp/smp_test/figs/README/1713407267028.png b/app/system/smp/smp_test/figs/README/1713407267028.png new file mode 100644 index 0000000000000000000000000000000000000000..59a82544f7eb0a8c22762a294ed4adb04f0c25c0 GIT binary patch literal 127185 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

ab2OAUD>wG#@xx_oC4X= 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 z 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%0AjNx5xnM-I|GzR6W(t-=H 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

g|ljgug(x;;pmJMMsSu$CK) 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Π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 z ./build/zephyr/zephyr.dis + cp ./build/zephyr/zephyr.elf /mnt/d/tftboot/ + + + +clean: + west build -t clean + + +gdb: + gdb-multiarch -x .gdbinit \ No newline at end of file diff --git a/app/system/smp/smp_test/prj.conf b/app/system/smp/smp_test/prj.conf new file mode 100644 index 0000000..824613c --- /dev/null +++ b/app/system/smp/smp_test/prj.conf @@ -0,0 +1,28 @@ +# Allow worker threads to capture all resources +# CONFIG_MAIN_THREAD_PRIORITY=11 + + + +# Enable assertions, stack overflow checking, etc +CONFIG_TEST=y + +# 开启shell +CONFIG_SHELL=y +# 开启启动的BANNER +CONFIG_BOOT_BANNER=y + +#debug +CONFIG_LOG_PRINTK=n +CONFIG_PRINTK=y +CONFIG_LOG=y +CONFIG_LOG_MAX_LEVEL=4 +CONFIG_DEBUG_INFO=y + + +# example +CONFIG_OBJ_CORE=y +CONFIG_TRACE_SCHED_IPI=y +CONFIG_SMP=y +CONFIG_TRACE_SCHED_IPI=y +CONFIG_POLL=y +# CONFIG_TRACE_SCHED_IPI=y \ No newline at end of file diff --git a/app/system/smp/smp_test/src/main.c b/app/system/smp/smp_test/src/main.c new file mode 100644 index 0000000..472c8b0 --- /dev/null +++ b/app/system/smp/smp_test/src/main.c @@ -0,0 +1,9 @@ + + +#include + + +int main(void) +{ + return 0; +} \ No newline at end of file diff --git a/app/system/smp/smp_test/src/smp_test.c b/app/system/smp/smp_test/src/smp_test.c new file mode 100644 index 0000000..3377321 --- /dev/null +++ b/app/system/smp/smp_test/src/smp_test.c @@ -0,0 +1,1298 @@ +/* + * Copyright (c) 2018 Intel Corporation. + * + * SPDX-License-Identifier: Apache-2.0 + */ + + +#include +#include +#include +#include + +#if CONFIG_MP_MAX_NUM_CPUS < 2 +#error SMP test requires at least two CPUs! +#endif + +#define RUN_FACTOR (CONFIG_SMP_TEST_RUN_FACTOR / 100.0) + +#define T2_STACK_SIZE (2048 + CONFIG_TEST_EXTRA_STACK_SIZE) +#define STACK_SIZE (384 + CONFIG_TEST_EXTRA_STACK_SIZE) +#define DELAY_US 50000 +#define TIMEOUT 1000 +#define EQUAL_PRIORITY 1 +#define TIME_SLICE_MS 500 +#define THREAD_DELAY 1 +#define SLEEP_MS_LONG ((int)(15000 * RUN_FACTOR)) + +struct k_thread t2; +K_THREAD_STACK_DEFINE(t2_stack, T2_STACK_SIZE); + +volatile int t2_count; +volatile int sync_count = -1; + +static int main_thread_id; +static int child_thread_id; +volatile int rv; + +K_SEM_DEFINE(cpuid_sema, 0, 1); +K_SEM_DEFINE(sema, 0, 1); +static struct k_mutex smutex; +static struct k_sem smp_sem; + +#define MAX_NUM_THREADS CONFIG_MP_MAX_NUM_CPUS + +struct thread_info { + k_tid_t tid; + int executed; + int priority; + int cpu_id; +}; +static volatile struct thread_info tinfo[MAX_NUM_THREADS]; +static struct k_thread tthread[MAX_NUM_THREADS]; +static K_THREAD_STACK_ARRAY_DEFINE(tstack, MAX_NUM_THREADS, STACK_SIZE); + +static volatile int thread_started[MAX_NUM_THREADS - 1]; + +static struct k_poll_signal tsignal[MAX_NUM_THREADS]; +static struct k_poll_event tevent[MAX_NUM_THREADS]; + +static int curr_cpu(void) +{ + unsigned int k = arch_irq_lock(); + int ret = arch_curr_cpu()->id; + + arch_irq_unlock(k); + return ret; +} + +/** + * @brief SMP + * @defgroup kernel_smp_tests SMP Tests + * @ingroup all_tests + * @{ + * @} + */ + +/** + * @defgroup kernel_smp_integration_tests SMP Integration Tests + * @ingroup kernel_smp_tests + * @{ + * @} + */ + +/** + * @defgroup kernel_smp_module_tests SMP Module Tests + * @ingroup kernel_smp_tests + * @{ + * @} + */ + +static void t2_fn(void *a, void *b, void *c) +{ + ARG_UNUSED(a); + ARG_UNUSED(b); + ARG_UNUSED(c); + + t2_count = 0; + + /* This thread simply increments a counter while spinning on + * the CPU. The idea is that it will always be iterating + * faster than the other thread so long as it is fairly + * scheduled (and it's designed to NOT be fairly schedulable + * without a separate CPU!), so the main thread can always + * check its progress. + */ + while (1) { + k_busy_wait(DELAY_US); + t2_count++; + } +} + +/** + * @brief Verify SMP with 2 cooperative threads + * + * @ingroup kernel_smp_tests + * + * @details Multi processing is verified by checking whether + * 2 cooperative threads run simultaneously at different cores + */ +void test_smp_coop_threads(void) +{ + int i, ok = 1; + + if (!IS_ENABLED(CONFIG_SCHED_IPI_SUPPORTED)) { + /* The spawned thread enters an infinite loop, so it can't be + * successfully aborted via an IPI. Just skip in that + * configuration. + */ + printk("SMP functionality test skipped.\n"); + return; + } + + k_tid_t tid = k_thread_create(&t2, t2_stack, T2_STACK_SIZE, t2_fn, + NULL, NULL, NULL, + K_PRIO_COOP(2), 0, K_NO_WAIT); + + /* Wait for the other thread (on a separate CPU) to actually + * start running. We want synchrony to be as perfect as + * possible. + */ + t2_count = -1; + while (t2_count == -1) { + } + + for (i = 0; i < 10; i++) { + /* Wait slightly longer than the other thread so our + * count will always be lower + */ + k_busy_wait(DELAY_US + (DELAY_US / 8)); + + if (t2_count <= i) { + ok = 0; + break; + } + } + + k_thread_abort(tid); + k_thread_join(tid, K_FOREVER); + + if (ok) { + printk("SUCCESS: SMP functionality verified.\n"); + } else { + // The error message is already printed in the loop above. + } + +} + +static void child_fn(void *p1, void *p2, void *p3) +{ + ARG_UNUSED(p2); + ARG_UNUSED(p3); + int parent_cpu_id = POINTER_TO_INT(p1); + + if (parent_cpu_id == curr_cpu()) { + printk("ERROR: Parent isn't on other core. Expected parent on core %d, but running on core %d.\n", parent_cpu_id, curr_cpu()); + } else { + printk("SUCCESS: Parent is on a different core as expected.\n"); + } + + sync_count++; + k_sem_give(&cpuid_sema); +} + +/** + * @brief Verify CPU IDs of threads in SMP + * + * @ingroup kernel_smp_tests + * + * @details Verify whether thread running on other core is + * parent thread from child thread + */ +void test_cpu_id_threads(void) +{ + + int old_prio = k_thread_priority_get(k_current_get()); + k_thread_priority_set(k_current_get(), K_PRIO_PREEMPT(2)); + + /* Make sure idle thread runs on each core */ + k_sleep(K_MSEC(1000)); + + int parent_cpu_id = curr_cpu(); + + k_tid_t tid = k_thread_create(&t2, t2_stack, T2_STACK_SIZE, child_fn, + INT_TO_POINTER(parent_cpu_id), NULL, + NULL, K_PRIO_PREEMPT(2), 0, K_NO_WAIT); + + while (sync_count == -1) { + } + k_sem_take(&cpuid_sema, K_FOREVER); + + k_thread_abort(tid); + k_thread_join(tid, K_FOREVER); + k_thread_priority_set(k_current_get(), old_prio); +} + +static void thread_entry_fn(void *p1, void *p2, void *p3) +{ + ARG_UNUSED(p2); + ARG_UNUSED(p3); + int thread_num = POINTER_TO_INT(p1); + int count = 0; + + tinfo[thread_num].executed = 1; + tinfo[thread_num].cpu_id = curr_cpu(); + printk("curr_cpu is %d:%d \r\n",thread_num,tinfo[thread_num].cpu_id) ; + while (count++ < 5) { + k_busy_wait(DELAY_US); + } +} + +static void spin_for_threads_exit(void) +{ + unsigned int num_threads = arch_num_cpus(); + + for (int i = 0; i < num_threads - 1; i++) { + volatile uint8_t *p = &tinfo[i].tid->base.thread_state; + + while (!(*p & _THREAD_DEAD)) { + } + } + k_busy_wait(DELAY_US); +} + +static void spawn_threads(int prio, int thread_num, int equal_prio, + k_thread_entry_t thread_entry, int delay) +{ + int i; + + /* Spawn threads of priority higher than + * the previously created thread + */ + for (i = 0; i < thread_num; i++) { + if (equal_prio) { + tinfo[i].priority = prio; + } else { + /* Increase priority for each thread */ + tinfo[i].priority = prio - 1; + prio = tinfo[i].priority; + } + tinfo[i].tid = k_thread_create(&tthread[i], tstack[i], + STACK_SIZE, thread_entry, + INT_TO_POINTER(i), NULL, NULL, + tinfo[i].priority, 0, + K_MSEC(delay)); + if (delay) { + /* Increase delay for each thread */ + delay = delay + 10; + } + } +} + +static void abort_threads(int num) +{ + for (int i = 0; i < num; i++) { + k_thread_abort(tinfo[i].tid); + } + + for (int i = 0; i < num; i++) { + k_thread_join(tinfo[i].tid, K_FOREVER); + } +} + +static void cleanup_resources(void) +{ + unsigned int num_threads = arch_num_cpus(); + + for (int i = 0; i < num_threads; i++) { + tinfo[i].tid = 0; + tinfo[i].executed = 0; + tinfo[i].priority = 0; + } +} + +static void __no_optimization thread_ab_entry(void *p1, void *p2, void *p3) +{ + ARG_UNUSED(p1); + ARG_UNUSED(p2); + ARG_UNUSED(p3); + + while (true) { + } +} + +#define SPAWN_AB_PRIO K_PRIO_COOP(10) + +/** + * @brief Verify the code path when we do context switch in k_thread_abort on SMP system + * + * @ingroup kernel_smp_tests + * + * @details test logic: + * - The ztest thread has cooperative priority. + * - From ztest thread we spawn N number of cooperative threads, where N = number of CPUs. + * - The spawned cooperative are executing infinite loop (so they occupy CPU core until they are + * aborted). + * - We have (number of CPUs - 1) spawned threads run and executing infinite loop, as current CPU + * is occupied by ztest cooperative thread. Due to that the last of spawned threads is ready but + * not executing. + * - We abort spawned threads one-by-one from the ztest thread. + * - At the first k_thread_abort call the ztest thread will be preempted by the remaining spawned + * thread which has higher priority than ztest thread. + * But... k_thread_abort call should has destroyed one of the spawned threads, so ztest thread + * should have a CPU available to run on. + * - We expect that all spawned threads will be aborted successfully. + * + * This was the test case for zephyrproject-rtos/zephyr#58040 issue where this test caused system + * hang. + */ +void test_coop_switch_in_abort(void) +{ + int old_prio = k_thread_priority_get(k_current_get()); + k_thread_priority_set(k_current_get(), K_PRIO_COOP(11)); + k_tid_t tid[MAX_NUM_THREADS]; + unsigned int num_threads = arch_num_cpus(); + unsigned int i; + + + if (!(_current->base.prio < 0)) { + printk("ERROR: Test case relies on ztest thread being cooperative.\n"); + return; // Optionally handle error + } + if (!(_current->base.prio > SPAWN_AB_PRIO)) { + printk("ERROR: Spawn test needs to have higher priority than ztest thread.\n"); + return; // Optionally handle error + } + + /* Spawn N number of cooperative threads, where N = number of CPUs */ + for (i = 0; i < num_threads; i++) { + tid[i] = k_thread_create(&tthread[i], tstack[i], + STACK_SIZE, thread_ab_entry, + NULL, NULL, NULL, + SPAWN_AB_PRIO, 0, K_NO_WAIT); + } + + /* Wait for some time to let spawned threads on other cores run and start executing infinite + * loop. + */ + k_busy_wait(DELAY_US * 4); + + /* At this time we have (number of CPUs - 1) spawned threads run and executing infinite loop + * on other CPU cores, as current CPU is occupied by this ztest cooperative thread. + * Due to that the last of spawned threads is ready but not executing. + */ + + /* Abort all spawned threads one-by-one. At the first k_thread_abort call the context + * switch will happen and the last 'spawned' thread will start. + * We should successfully abort all threads. + */ + for (i = 0; i < num_threads; i++) { + k_thread_abort(tid[i]); + } + + /* Cleanup */ + for (i = 0; i < num_threads; i++) + { + if (k_thread_join(tid[i], K_FOREVER) != 0) { + printk("ERROR: Failed to join thread %d.\n", i); + } else { + printk("SUCCESS: Successfully joined thread %d.\n", i); + } + } + k_thread_priority_set(k_current_get(), old_prio); +} + +/** + * @brief Test cooperative threads non-preemption + * + * @ingroup kernel_smp_tests + * + * @details Spawn cooperative threads equal to number of cores + * supported. Main thread will already be running on 1 core. + * Check if the last thread created preempts any threads + * already running. + */ +void test_coop_resched_threads(void) +{ + int old_prio = k_thread_priority_get(k_current_get()); + unsigned int num_threads = arch_num_cpus(); + k_thread_priority_set(k_current_get(), K_PRIO_COOP(10)); + /* Spawn threads equal to number of cores, + * since we don't give up current CPU, last thread + * will not get scheduled + */ + spawn_threads(K_PRIO_COOP(10), num_threads, !EQUAL_PRIORITY, + &thread_entry_fn, THREAD_DELAY); + + /* Wait for some time to let other core's thread run */ + k_busy_wait(DELAY_US); + + + /* Reassure that cooperative thread's are not preempted + * by checking last thread's execution + * status. We know that all threads got rescheduled on + * other cores except the last one + */ + for (int i = 0; i < num_threads - 1; i++) { + if (tinfo[i].executed != 1) { + printk("ERROR: Cooperative thread %d didn't run as expected.\n", i); + // Consider adding break or handling the error as appropriate for your test setup + } + } + if (tinfo[num_threads - 1].executed != 0) { + printk("ERROR: Cooperative thread %d is preempted which is unexpected.\n", num_threads - 1); + } else { + printk("SUCCESS: Last cooperative thread was not preempted as expected.\n"); + } + + + /* Abort threads created */ + abort_threads(num_threads); + cleanup_resources(); + /* restore environment */ + k_thread_priority_set(k_current_get(), old_prio); +} + +/** + * @brief Test preemptness of preemptive thread + * + * @ingroup kernel_smp_tests + * + * @details Create preemptive thread and let it run + * on another core and verify if it gets preempted + * if another thread of higher priority is spawned + */ +void test_preempt_resched_threads(void) +{ + unsigned int num_threads = arch_num_cpus(); + + /* Spawn threads equal to number of cores, + * lower priority thread should + * be preempted by higher ones + */ + spawn_threads(K_PRIO_PREEMPT(10), num_threads, !EQUAL_PRIORITY, + &thread_entry_fn, THREAD_DELAY); + + spin_for_threads_exit(); + + for (int i = 0; i < num_threads; i++) { + if (tinfo[i].executed != 1) { + printk("ERROR: Preemptive thread %d didn't run as expected.\n", i); + } else { + printk("SUCCESS: Preemptive thread %d ran as expected.\n", i); + } + } + + /* Abort threads created */ + abort_threads(num_threads); + cleanup_resources(); +} + +/** + * @brief Validate behavior of thread when it yields + * + * @ingroup kernel_smp_tests + * + * @details Spawn cooperative threads equal to number + * of cores, so last thread would be pending, call + * yield() from main thread. Now, all threads must be + * executed + */ +void test_yield_threads(void) +{ + unsigned int num_threads = arch_num_cpus(); + + /* Spawn threads equal to the number + * of cores, so the last thread would be + * pending. + */ + spawn_threads(K_PRIO_COOP(10), num_threads, !EQUAL_PRIORITY, + &thread_entry_fn, !THREAD_DELAY); + + k_yield(); + k_busy_wait(DELAY_US); + + for (int i = 0; i < num_threads; i++) { + if (tinfo[i].executed != 1) { + printk("ERROR: Thread %d did not execute as expected.\n", i); + // Optionally, handle the failure case, e.g., abort the test or cleanup + } else { + printk("SUCCESS: Thread %d executed as expected.\n", i); + } + + } + + abort_threads(num_threads); + cleanup_resources(); +} + +/** + * @brief Test behavior of thread when it sleeps + * + * @ingroup kernel_smp_tests + * + * @details Spawn cooperative thread and call + * sleep() from main thread. After timeout, all + * threads has to be scheduled. + */ +void test_sleep_threads(void) +{ + unsigned int num_threads = arch_num_cpus(); + + spawn_threads(K_PRIO_COOP(10), num_threads, !EQUAL_PRIORITY, + &thread_entry_fn, !THREAD_DELAY); + + k_msleep(TIMEOUT); + + for (int i = 0; i < num_threads; i++) { + if (tinfo[i].executed != 1) { + printk("ERROR: Thread %d did not execute as expected.\n", i); + } else { + printk("SUCCESS: Thread %d executed as expected.\n", i); + } + } + + abort_threads(num_threads); + cleanup_resources(); +} + +static void thread_wakeup_entry(void *p1, void *p2, void *p3) +{ + ARG_UNUSED(p2); + ARG_UNUSED(p3); + int thread_num = POINTER_TO_INT(p1); + + thread_started[thread_num] = 1; + + k_msleep(DELAY_US * 1000); + + tinfo[thread_num].executed = 1; +} + +static void wakeup_on_start_thread(int tnum) +{ + int threads_started = 0, i; + + /* For each thread, spin waiting for it to first flag that + * it's going to sleep, and then that it's actually blocked + */ + for (i = 0; i < tnum; i++) { + while (thread_started[i] == 0) { + } + while (!z_is_thread_prevented_from_running(tinfo[i].tid)) { + } + } + + for (i = 0; i < tnum; i++) { + if (thread_started[i] == 1 && threads_started <= tnum) { + threads_started++; + k_wakeup(tinfo[i].tid); + } + } + + if (threads_started != tnum) { + printk("ERROR: All threads haven't started. Expected %d, got %d.\n", tnum, threads_started); + } else { + printk("SUCCESS: All %d threads have started as expected.\n", tnum); + } +} + +static void check_wokeup_threads(int tnum) +{ + int threads_woke_up = 0, i; + + /* k_wakeup() isn't synchronous, give the other CPU time to + * schedule them + */ + k_busy_wait(200000); + + for (i = 0; i < tnum; i++) { + if (tinfo[i].executed == 1 && threads_woke_up <= tnum) { + threads_woke_up++; + } + } + // zassert_equal(threads_woke_up, tnum, "Threads did not wakeup"); + if (threads_woke_up != tnum) { + printk("ERROR: Threads did not wakeup as expected. Expected %d, got %d.\n", tnum, threads_woke_up); + } else { + printk("SUCCESS: All %d threads woke up as expected.\n", tnum); + } +} + +/** + * @brief Test behavior of wakeup() in SMP case + * + * @ingroup kernel_smp_tests + * + * @details Spawn number of threads equal to number of + * remaining cores and let them sleep for a while. Call + * wakeup() of those threads from parent thread and check + * if they are all running + */ +void test_wakeup_threads(void) +{ + unsigned int num_threads = arch_num_cpus(); + + /* Spawn threads to run on all remaining cores */ + spawn_threads(K_PRIO_COOP(10), num_threads - 1, !EQUAL_PRIORITY, + &thread_wakeup_entry, !THREAD_DELAY); + + /* Check if all the threads have started, then call wakeup */ + wakeup_on_start_thread(num_threads - 1); + + /* Count threads which are woken up */ + check_wokeup_threads(num_threads - 1); + + /* Abort all threads and cleanup */ + abort_threads(num_threads - 1); + cleanup_resources(); +} + +/* a thread for testing get current cpu */ +static void thread_get_cpu_entry(void *p1, void *p2, void *p3) +{ + int bsp_id = *(int *)p1; + int cpu_id = -1; + + /* get current cpu number for running thread */ + _cpu_t *curr_cpu = arch_curr_cpu(); + + /**TESTPOINT: call arch_curr_cpu() to get cpu struct */ + if (curr_cpu == NULL) { + printk("ERROR: Test failed to get current cpu.\n"); + return; // Optional: decide if you want to return or handle differently + } else { + printk("SUCCESS: Successfully obtained current cpu struct.\n"); + } + + cpu_id = curr_cpu->id; + + + if (bsp_id == cpu_id) { + printk("ERROR: Should not be the same with our BSP. BSP ID: %d, CPU ID: %d\n", bsp_id, cpu_id); + return; // Optional: decide if you want to return or handle differently + } else { + printk("SUCCESS: Running on a different CPU than the BSP as expected. BSP ID: %d, CPU ID: %d\n", bsp_id, cpu_id); + } + + /* loop forever to ensure running on this CPU */ + while (1) { + k_busy_wait(DELAY_US); + } +} + +/** + * @brief Test get a pointer of CPU + * + * @ingroup kernel_smp_module_tests + * + * @details + * Test Objective: + * - To verify architecture layer provides a mechanism to return a pointer to the + * current kernel CPU record of the running CPU. + * We call arch_curr_cpu() and get its member, both in main and spawned thread + * separately, and compare them. They shall be different in SMP environment. + * + * Testing techniques: + * - Interface testing, function and block box testing, + * dynamic analysis and testing, + * + * Prerequisite Conditions: + * - CONFIG_SMP=y, and the HW platform must support SMP. + * + * Input Specifications: + * - N/A + * + * Test Procedure: + * -# In main thread, call arch_curr_cpu() to get it's member "id",then store it + * into a variable thread_id. + * -# Spawn a thread t2, and pass the stored thread_id to it, then call + * k_busy_wait() 50us to wait for thread run and won't be swapped out. + * -# In thread t2, call arch_curr_cpu() to get pointer of current cpu data. Then + * check if it not NULL. + * -# Store the member id via accessing pointer of current cpu data to var cpu_id. + * -# Check if cpu_id is not equaled to bsp_id that we pass into thread. + * -# Call k_busy_wait() and loop forever. + * -# In main thread, terminate the thread t2 before exit. + * + * Expected Test Result: + * - The pointer of current cpu data that we got from function call is correct. + * + * Pass/Fail Criteria: + * - Successful if the check of step 3,5 are all passed. + * - Failure if one of the check of step 3,5 is failed. + * + * Assumptions and Constraints: + * - This test using for the platform that support SMP, in our current scenario + * , only x86_64, arc and xtensa supported. + * + * @see arch_curr_cpu() + */ +static int _cpu_id; +void test_get_cpu(void) +{ + k_tid_t thread_id; + int old_prio = k_thread_priority_get(k_current_get()); + k_thread_priority_set(k_current_get(), K_PRIO_COOP(10)); + + if (!IS_ENABLED(CONFIG_SCHED_IPI_SUPPORTED)) { + /* The spawned thread enters an infinite loop, so it can't be + * successfully aborted via an IPI. Just skip in that + * configuration. + */ + printk("CONFIG_SCHED_IPI_SUPPORTED is not enabled, skipping test.\n"); + k_thread_priority_set(k_current_get(), old_prio); + return; + } + + /* get current cpu number */ + _cpu_id = arch_curr_cpu()->id; + + thread_id = k_thread_create(&t2, t2_stack, T2_STACK_SIZE, + (k_thread_entry_t)thread_get_cpu_entry, + &_cpu_id, NULL, NULL, + K_PRIO_COOP(2), + K_INHERIT_PERMS, K_NO_WAIT); + + k_busy_wait(DELAY_US); + + k_thread_abort(thread_id); + k_thread_join(thread_id, K_FOREVER); + k_thread_priority_set(k_current_get(), old_prio); +} + +#ifdef CONFIG_TRACE_SCHED_IPI +/* global variable for testing send IPI */ +static volatile int sched_ipi_has_called; + +void z_trace_sched_ipi(void) +{ + sched_ipi_has_called++; +} +#endif + +/** + * @brief Test interprocessor interrupt + * + * @ingroup kernel_smp_integration_tests + * + * @details + * Test Objective: + * - To verify architecture layer provides a mechanism to issue an interprocessor + * interrupt to all other CPUs in the system that calls the scheduler IPI. + * We simply add a hook in z_sched_ipi(), in order to check if it has been + * called once in another CPU except the caller, when arch_sched_ipi() is + * called. + * + * Testing techniques: + * - Interface testing, function and block box testing, + * dynamic analysis and testing + * + * Prerequisite Conditions: + * - CONFIG_SMP=y, and the HW platform must support SMP. + * - CONFIG_TRACE_SCHED_IPI=y was set. + * + * Input Specifications: + * - N/A + * + * Test Procedure: + * -# In main thread, given a global variable sched_ipi_has_called equaled zero. + * -# Call arch_sched_ipi() then sleep for 100ms. + * -# In z_sched_ipi() handler, increment the sched_ipi_has_called. + * -# In main thread, check the sched_ipi_has_called is not equaled to zero. + * -# Repeat step 1 to 4 for 3 times. + * + * Expected Test Result: + * - The pointer of current cpu data that we got from function call is correct. + * + * Pass/Fail Criteria: + * - Successful if the check of step 4 are all passed. + * - Failure if one of the check of step 4 is failed. + * + * Assumptions and Constraints: + * - This test using for the platform that support SMP, in our current scenario + * , only x86_64 and arc supported. + * + * @see arch_sched_ipi() + */ +#ifdef CONFIG_SCHED_IPI_SUPPORTED +void test_smp_ipi(void) +{ +#ifndef CONFIG_TRACE_SCHED_IPI + printk("CONFIG_TRACE_SCHED_IPI is not enabled, skipping test.\n"); + return; +#endif + + printk("cpu num=%d", arch_num_cpus()); + + for (int i = 0; i < 3 ; i++) { + /* issue a sched ipi to tell other CPU to run thread */ + sched_ipi_has_called = 0; + arch_sched_ipi(); + + /* Need to wait longer than we think, loaded CI + * systems need to wait for host scheduling to run the + * other CPU's thread. + */ + k_msleep(100); + + /**TESTPOINT: check if enter our IPI interrupt handler */ + if (sched_ipi_has_called == 0) { + printk("ERROR: did not receive IPI.(%d)\n", sched_ipi_has_called); + // Optionally, handle the error case, e.g., abort the test or cleanup + } else { + printk("SUCCESS: Received IPI as expected.\n"); + } + } +} +#endif + +void k_sys_fatal_error_handler(unsigned int reason, const z_arch_esf_t *esf) +{ + static int trigger; + + if (reason != K_ERR_KERNEL_OOPS) { + printk("wrong error reason\n"); + printk("PROJECT EXECUTION FAILED\n"); + k_fatal_halt(reason); + } + + if (trigger == 0) { + child_thread_id = curr_cpu(); + trigger++; + } else { + main_thread_id = curr_cpu(); + + /* Verify the fatal was happened on different core */ + if (main_thread_id == child_thread_id) + { + printk("ERROR: Fatal occurred on the same core.\n"); + // Optionally handle error, such as by halting the system + } else { + printk("SUCCESS: Fatal occurred on different cores as expected.\n"); + } + } +} + +void entry_oops(void *p1, void *p2, void *p3) +{ + printk("%d k_oops \r\n",curr_cpu()) ; + printk("SHOULD NEVER SEE THIS\n"); +} + +/** + * @brief Test fatal error can be triggered on different core + + * @details When CONFIG_SMP is enabled, on some multiprocessor + * platforms, exception can be triggered on different core at + * the same time. + * + * @ingroup kernel_common_tests + */ +void test_fatal_on_smp(void) +{ + /* Creat a child thread and trigger a crash */ + k_thread_create(&t2, t2_stack, T2_STACK_SIZE, entry_oops, + NULL, NULL, NULL, + K_PRIO_PREEMPT(2), 0, K_NO_WAIT); + + /* hold cpu and wait for thread trigger exception and being terminated */ + k_busy_wait(2 * DELAY_US); + + /* Verify that child thread is no longer running. We can't simply use k_thread_join here + * as we don't want to introduce reschedule point here. + */ + if (!z_is_thread_state_set(&t2, _THREAD_DEAD)) { + printk("ERROR: Child thread is still running but should be dead.\n"); + // Optional: Handle the error, e.g., abort the test or cleanup + } else { + printk("SUCCESS: Child thread is correctly marked as dead.\n"); + } +} + +static void workq_handler(struct k_work *work) +{ + child_thread_id = curr_cpu(); +} + +/** + * @brief Test system workq run on different core + + * @details When macro CONFIG_SMP is enabled, workq can be run + * on different core. + * + * @ingroup kernel_common_tests + */ +void test_workq_on_smp(void) +{ + static struct k_work work; + + k_work_init(&work, workq_handler); + + /* submit work item on system workq */ + k_work_submit(&work); + + /* Wait for some time to let other core's thread run */ + k_busy_wait(DELAY_US); + + /* check work have finished */ + if (k_work_busy_get(&work) != 0) { + printk("ERROR: Work item has not finished as expected.\n"); + } else { + printk("SUCCESS: Work item has finished as expected.\n"); + } + + main_thread_id = curr_cpu(); + + /* Verify the ztest thread and system workq run on different core */ + if (main_thread_id == child_thread_id) { + printk("ERROR: System workq ran on the same core as main thread.\n"); + } else { + printk("SUCCESS: System workq and main thread ran on different cores.\n"); + } + +} + +static void t1_mutex_lock(void *p1, void *p2, void *p3) +{ + /* t1 will get mutex first */ + k_mutex_lock((struct k_mutex *)p1, K_FOREVER); + + k_msleep(2); + + k_mutex_unlock((struct k_mutex *)p1); +} + +static void t2_mutex_lock(void *p1, void *p2, void *p3) +{ + if (_current->base.global_lock_count != 0) { + printk("ERROR: Initial thread global lock count %d is incorrect.\n", _current->base.global_lock_count); + return; // Optionally handle error + } + + + k_mutex_lock((struct k_mutex *)p1, K_FOREVER); + + if (_current->base.global_lock_count != 0) { + printk("ERROR: Thread global lock count %d is incorrect after mutex lock.\n", _current->base.global_lock_count); + k_mutex_unlock((struct k_mutex *)p1); // Ensure mutex is unlocked before returning + return; // Optionally handle error + } + + + k_mutex_unlock((struct k_mutex *)p1); + + /**TESTPOINT: z_smp_release_global_lock() has been call during + * context switch but global_lock_cnt has not been decrease + * because no irq_lock() was called. + */ + if (_current->base.global_lock_count != 0) { + printk("ERROR: Thread global lock count %d is incorrect after mutex unlock.\n", _current->base.global_lock_count); + } else { + printk("SUCCESS: Thread global lock count is correct throughout.\n"); + } + + +} + +/** + * @brief Test scenario that a thread release the global lock + * + * @ingroup kernel_smp_tests + * + * @details Validate the scenario that make the internal APIs of SMP + * z_smp_release_global_lock() to be called. + */ +// ZTEST(smp, test_smp_release_global_lock) +void test_smp_release_global_lock(void) +{ + k_mutex_init(&smutex); + + tinfo[0].tid = + k_thread_create(&tthread[0], tstack[0], STACK_SIZE, + (k_thread_entry_t)t1_mutex_lock, + &smutex, NULL, NULL, + K_PRIO_PREEMPT(5), + K_INHERIT_PERMS, K_NO_WAIT); + + tinfo[1].tid = + k_thread_create(&tthread[1], tstack[1], STACK_SIZE, + (k_thread_entry_t)t2_mutex_lock, + &smutex, NULL, NULL, + K_PRIO_PREEMPT(3), + K_INHERIT_PERMS, K_MSEC(1)); + + /* Hold one of the cpu to ensure context switch as we wanted + * can happen in another cpu. + */ + k_busy_wait(20000); + + k_thread_join(tinfo[1].tid, K_FOREVER); + k_thread_join(tinfo[0].tid, K_FOREVER); + cleanup_resources(); +} + +#define LOOP_COUNT ((int)(20000 * RUN_FACTOR)) + +enum sync_t { + LOCK_IRQ, + LOCK_SEM, + LOCK_MUTEX +}; + +static int global_cnt; +static struct k_mutex smp_mutex; + +static void (*sync_lock)(void *); +static void (*sync_unlock)(void *); + +static void sync_lock_dummy(void *k) +{ + /* no sync lock used */ +} + +static void sync_lock_irq(void *k) +{ + *((unsigned int *)k) = irq_lock(); +} + +static void sync_unlock_irq(void *k) +{ + irq_unlock(*(unsigned int *)k); +} + +static void sync_lock_sem(void *k) +{ + k_sem_take(&smp_sem, K_FOREVER); +} + +static void sync_unlock_sem(void *k) +{ + k_sem_give(&smp_sem); +} + +static void sync_lock_mutex(void *k) +{ + k_mutex_lock(&smp_mutex, K_FOREVER); +} + +static void sync_unlock_mutex(void *k) +{ + k_mutex_unlock(&smp_mutex); +} + +static void sync_init(int lock_type) +{ + switch (lock_type) { + case LOCK_IRQ: + sync_lock = sync_lock_irq; + sync_unlock = sync_unlock_irq; + break; + case LOCK_SEM: + sync_lock = sync_lock_sem; + sync_unlock = sync_unlock_sem; + k_sem_init(&smp_sem, 1, 3); + break; + case LOCK_MUTEX: + sync_lock = sync_lock_mutex; + sync_unlock = sync_unlock_mutex; + k_mutex_init(&smp_mutex); + break; + + default: + sync_lock = sync_unlock = sync_lock_dummy; + } +} + +static void inc_global_cnt(void *a, void *b, void *c) +{ + int key; + + for (int i = 0; i < LOOP_COUNT; i++) { + + sync_lock(&key); + + global_cnt++; + global_cnt--; + global_cnt++; + + sync_unlock(&key); + } +} + +static int run_concurrency(int type, void *func) +{ + uint32_t start_t, end_t; + + sync_init(type); + global_cnt = 0; + start_t = k_cycle_get_32(); + + tinfo[0].tid = + k_thread_create(&tthread[0], tstack[0], STACK_SIZE, + (k_thread_entry_t)func, + NULL, NULL, NULL, + K_PRIO_PREEMPT(1), + K_INHERIT_PERMS, K_NO_WAIT); + + tinfo[1].tid = + k_thread_create(&tthread[1], tstack[1], STACK_SIZE, + (k_thread_entry_t)func, + NULL, NULL, NULL, + K_PRIO_PREEMPT(1), + K_INHERIT_PERMS, K_NO_WAIT); + + k_tid_t tid = + k_thread_create(&t2, t2_stack, T2_STACK_SIZE, + (k_thread_entry_t)func, + NULL, NULL, NULL, + K_PRIO_PREEMPT(1), + K_INHERIT_PERMS, K_NO_WAIT); + + k_thread_join(tinfo[0].tid, K_FOREVER); + k_thread_join(tinfo[1].tid, K_FOREVER); + k_thread_join(tid, K_FOREVER); + cleanup_resources(); + + end_t = k_cycle_get_32(); + + printk("type %d: cnt %d, spend %u ms\n", type, global_cnt, + k_cyc_to_ms_ceil32(end_t - start_t)); + + return global_cnt == (LOOP_COUNT * 3); +} + +/** + * @brief Test if the concurrency of SMP works or not + * + * @ingroup kernel_smp_tests + * + * @details Validate the global lock and unlock API of SMP are thread-safe. + * We make 3 thread to increase the global count in different cpu and + * they both do locking then unlocking for LOOP_COUNT times. It shall be no + * deadlock happened and total global count shall be 3 * LOOP COUNT. + * + * We show the 4 kinds of scenario: + * - No any lock used + * - Use global irq lock + * - Use semaphore + * - Use mutex + */ +void test_inc_concurrency(void) +{ + if (!run_concurrency(LOCK_IRQ, inc_global_cnt)) { + printk("ERROR: Total count %d is wrong with LOCK_IRQ.\n", global_cnt); + } else { + printk("SUCCESS: Total count correct with LOCK_IRQ.\n"); + } + + /* increasing global var with semaphore */ + if (!run_concurrency(LOCK_SEM, inc_global_cnt)) { + printk("ERROR: Total count %d is wrong with LOCK_SEM.\n", global_cnt); + } else { + printk("SUCCESS: Total count correct with LOCK_SEM.\n"); + } + + /* increasing global var with mutex */ + if (!run_concurrency(LOCK_MUTEX, inc_global_cnt)) { + printk("ERROR: Total count %d is wrong with LOCK_MUTEX.\n", global_cnt); + } else { + printk("SUCCESS: Total count correct with LOCK_MUTEX.\n"); + } +} + +/** + * @brief Torture test for context switching code + * + * @ingroup kernel_smp_tests + * + * @details Leverage the polling API to stress test the context switching code. + * This test will hammer all the CPUs with thread swapping requests. + */ +static void process_events(void *arg0, void *arg1, void *arg2) +{ + uintptr_t id = (uintptr_t) arg0; + + while (1) { + k_poll(&tevent[id], 1, K_FOREVER); + + if (tevent[id].signal->result != 0x55) { + printk("ERROR: Expected signal result 0x55, got 0x%x for event id %lu \n", tevent[id].signal->result, id); + return; + } + + tevent[id].signal->signaled = 0; + tevent[id].state = K_POLL_STATE_NOT_READY; + + k_poll_signal_reset(&tsignal[id]); + } +} + +static void signal_raise(void *arg0, void *arg1, void *arg2) +{ + unsigned int num_threads = arch_num_cpus(); + + while (1) { + for (uintptr_t i = 0; i < num_threads; i++) { + k_poll_signal_raise(&tsignal[i], 0x55); + } + } +} + +void test_smp_switch_torture(void) +{ + unsigned int num_threads = arch_num_cpus(); + + if (CONFIG_SMP_TEST_RUN_FACTOR == 0) { + /* If CONFIG_SMP_TEST_RUN_FACTOR is zero, + * the switch torture test is effectively + * not doing anything as the k_sleep() + * below is not going to sleep at all, + * and all created threads are being + * terminated (almost) immediately after + * creation. So if run factor is zero, + * mark the test as skipped. + */ + printk("CONFIG_SMP_TEST_RUN_FACTOR is zero, skipping test.\n"); + return; + } + + for (uintptr_t i = 0; i < num_threads; i++) { + k_poll_signal_init(&tsignal[i]); + k_poll_event_init(&tevent[i], K_POLL_TYPE_SIGNAL, + K_POLL_MODE_NOTIFY_ONLY, &tsignal[i]); + + k_thread_create(&tthread[i], tstack[i], STACK_SIZE, + (k_thread_entry_t) process_events, + (void *) i, NULL, NULL, K_PRIO_PREEMPT(i + 1), + K_INHERIT_PERMS, K_NO_WAIT); + } + + k_thread_create(&t2, t2_stack, T2_STACK_SIZE, signal_raise, + NULL, NULL, NULL, K_PRIO_COOP(2), 0, K_NO_WAIT); + + k_sleep(K_MSEC(SLEEP_MS_LONG)); + + k_thread_abort(&t2); + k_thread_join(&t2, K_FOREVER); + for (uintptr_t i = 0; i < num_threads; i++) { + k_thread_abort(&tthread[i]); + k_thread_join(&tthread[i], K_FOREVER); + } +} + +static void *smp_tests_setup(void) +{ + /* Sleep a bit to guarantee that both CPUs enter an idle + * thread from which they can exit correctly to run the main + * test. + */ + k_sleep(K_MSEC(10)); + + return NULL; +} + + +void smp_test(const struct shell *shell, size_t argc, char **argv) +{ + smp_tests_setup() ; + test_coop_resched_threads() ; + test_coop_switch_in_abort() ; + test_cpu_id_threads() ; + test_fatal_on_smp() ; + test_get_cpu() ; + test_inc_concurrency() ; + test_preempt_resched_threads() ; + test_sleep_threads() ; + test_smp_coop_threads() ; + test_smp_ipi() ; + test_smp_release_global_lock() ; + test_smp_switch_torture() ; + test_wakeup_threads() ; + test_workq_on_smp() ; + test_yield_threads() ; + +} + + +SHELL_CMD_ARG_REGISTER(smp_test, NULL, "Smp test", smp_test,1, 0); \ No newline at end of file diff --git a/app/system/smp/smp_test/testcase.yaml b/app/system/smp/smp_test/testcase.yaml new file mode 100644 index 0000000..e0ca7e9 --- /dev/null +++ b/app/system/smp/smp_test/testcase.yaml @@ -0,0 +1,16 @@ +tests: + kernel.multiprocessing.smp: + tags: + - kernel + - smp + ignore_faults: true + filter: (CONFIG_MP_MAX_NUM_CPUS > 1) + kernel.multiprocessing.smp.minimallibc: + tags: + - kernel + - smp + - libc + ignore_faults: true + filter: (CONFIG_MP_MAX_NUM_CPUS > 1) and CONFIG_MINIMAL_LIBC_SUPPORTED + extra_configs: + - CONFIG_MINIMAL_LIBC=y diff --git a/doc/ChangeLog.md b/doc/ChangeLog.md new file mode 100644 index 0000000..ee148f4 --- /dev/null +++ b/doc/ChangeLog.md @@ -0,0 +1,59 @@ +# Phytium-Zephyr-SDK 2024-06-26 v1.0.0 ChangeLog + +Change Log since 2024-06-26 + +## README + +- update version number + +# Phytium-Zephyr-SDK 2024-06-21 ChangeLog + +Change Log since 2024-06-17 + +## app + +- add const key word to one variable + +## README + +- update README.md, remove the description about /zephyeproject, add some detail notes + +# Phytium-Zephyr-SDK 2024-06-21 ChangeLog + +Change Log since 2024-06-17 + +## app + +- modified every CMakeLists.tx in peripheral apps to resolve the issue of inability to compile due to repository merging. + +## modules + +- standalone_for_zephyr repository merge into Phytium-zephyr-sdk repository + +# Phytium-Zephyr-SDK 2024-06-13 ChangeLog + +Change Log since 2024-06-07 + +## app + +- add pcie enum example + +# Phytium-Zephyr-SDK 2024-05-08 ChangeLog + +Change Log since 2024-04-11 + +## doc + +- modify the bugs in the documentation + +# Phytium-Zephyr-SDK 2024-04-11 ChangeLog + +Change Log since 2024-04-11 + +## doc + +- add readme + +## example + +- add xmac echo example \ No newline at end of file diff --git a/figs/readme/1712020444273.png b/figs/readme/1712020444273.png new file mode 100644 index 0000000000000000000000000000000000000000..4848fbe3d0745ca70447fd7f9378e7fdbf66690e GIT binary patch literal 27752 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 literal 0 HcmV?d00001 diff --git a/figs/readme/1712107861173.png b/figs/readme/1712107861173.png new file mode 100644 index 0000000000000000000000000000000000000000..9273ccce22dcc29ef940600bcf30ec3a2516930d GIT binary patch literal 15371 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 aJYqzpTSsaIJS;!Ik&#doFBARpHqI8IefYKr@ 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 literal 0 HcmV?d00001 diff --git "a/figs/readme/\344\273\223\345\272\223\346\236\266\346\236\204\345\233\276.png" "b/figs/readme/\344\273\223\345\272\223\346\236\266\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..0aa6cac8fe4f615002bda97a57b83bb84ce16617 GIT binary patch literal 28063 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 literal 0 HcmV?d00001 diff --git a/modules/hal/phytium/CMakeLists.txt b/modules/hal/phytium/CMakeLists.txt new file mode 100644 index 0000000..5774150 --- /dev/null +++ b/modules/hal/phytium/CMakeLists.txt @@ -0,0 +1,5 @@ + + +add_subdirectory_ifdef(CONFIG_PHYTIUM_STANDALONE_SDK hal) + + diff --git a/modules/hal/phytium/LICENSE b/modules/hal/phytium/LICENSE new file mode 100644 index 0000000..8f71f43 --- /dev/null +++ b/modules/hal/phytium/LICENSE @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed 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. + diff --git a/modules/hal/phytium/hal/CMakeLists.txt b/modules/hal/phytium/hal/CMakeLists.txt new file mode 100644 index 0000000..1402437 --- /dev/null +++ b/modules/hal/phytium/hal/CMakeLists.txt @@ -0,0 +1,80 @@ + + +zephyr_library() + +# pl011 drivers +set(PL011_UART_SOURCES + phytium-standalone-sdk/drivers/serial/fpl011/fpl011.c + phytium-standalone-sdk/drivers/serial/fpl011/fpl011_options.c + phytium-standalone-sdk/drivers/serial/fpl011/fpl011_intr.c + phytium-standalone-sdk/drivers/serial/fpl011/fpl011_hw.c + phytium-standalone-sdk/drivers/serial/fpl011/fpl011_g.c +) + +foreach(SOURCE IN LISTS PL011_UART_SOURCES) + zephyr_library_sources_ifdef(CONFIG_ENABLE_Pl011_UART ${SOURCE}) +endforeach() + +# sdif drivers + +set(PHYTIUM_SDHC_SOURCES + phytium-standalone-sdk/drivers/mmc/fsdif/fsdif.c + phytium-standalone-sdk/drivers/mmc/fsdif/fsdif_cmd.c + phytium-standalone-sdk/drivers/mmc/fsdif/fsdif_dma.c + phytium-standalone-sdk/drivers/mmc/fsdif/fsdif_intr.c + phytium-standalone-sdk/drivers/mmc/fsdif/fsdif_pio.c + phytium-standalone-sdk/drivers/mmc/fsdif/fsdif_sinit.c +) + +foreach(SOURCE IN LISTS PHYTIUM_SDHC_SOURCES) + zephyr_library_sources_ifdef(CONFIG_ENABLE_PHYTIUM_SDHC ${SOURCE}) +endforeach() + +zephyr_include_directories(phytium-standalone-sdk/drivers/mmc/fsdif) + + +# io ctrl +set(PHYTIUM_FIO_SOURCES + phytium-standalone-sdk/drivers/iomux/fiopad/fiopad.c + phytium-standalone-sdk/drivers/iomux/fiopad/fiopad_hw.c +) + +foreach(SOURCE IN LISTS PHYTIUM_FIO_SOURCES) + zephyr_library_sources_ifdef(CONFIG_PINCTRL_PHYTIUM ${SOURCE}) +endforeach() + +zephyr_include_directories(phytium-standalone-sdk/drivers/iomux/fiopad) + +# xmac +set(PHYTIUM_XMAC_SOURCES + phytium-standalone-sdk/drivers/eth/fxmac/fxmac.c + phytium-standalone-sdk/drivers/eth/fxmac/fxmac_bdring.c + phytium-standalone-sdk/drivers/eth/fxmac/fxmac_debug.c + phytium-standalone-sdk/drivers/eth/fxmac/fxmac_intr.c + phytium-standalone-sdk/drivers/eth/fxmac/fxmac_options.c + phytium-standalone-sdk/drivers/eth/fxmac/fxmac_phy.c + phytium-standalone-sdk/drivers/eth/fxmac/fxmac_sinit.c +) + +foreach(SOURCE IN LISTS PHYTIUM_XMAC_SOURCES) + zephyr_library_sources_ifdef(CONFIG_ETH_PHYTIUM_XMAC ${SOURCE}) +endforeach() + +zephyr_include_directories(phytium-standalone-sdk/drivers/eth/fxmac) +zephyr_include_directories(phytium-standalone-sdk/drivers/eth/fxmac/phy) + + +# common +zephyr_library_sources(phytium-standalone-sdk/common/fassert.c) + +zephyr_include_directories(phytium-standalone-sdk/drivers/serial/fpl011/) + +zephyr_include_directories(phytium-standalone-sdk/common) +zephyr_include_directories(phytium-standalone-sdk/soc/common) +zephyr_include_directories(phytium-standalone-sdk/soc/e2000) +zephyr_include_directories(phytium-standalone-sdk/soc/e2000/q) +zephyr_include_directories(phytium-standalone-sdk/drivers) + +zephyr_library_sources(fdrivers_port/fdrivers_port.c) +zephyr_include_directories(fdrivers_port/) +zephyr_include_directories(phytium-standalone-sdk/common) diff --git a/modules/hal/phytium/hal/fdrivers_port/fdrivers_port.c b/modules/hal/phytium/hal/fdrivers_port/fdrivers_port.c new file mode 100644 index 0000000..cfe7912 --- /dev/null +++ b/modules/hal/phytium/hal/fdrivers_port/fdrivers_port.c @@ -0,0 +1,92 @@ +// Phytium is pleased to support the open source community by making Zephyr-SDK available. + +// +// Copyright (C) 2024 Phytium Technology Co., Ltd. All rights reserved. +// +// Licensed under the Apache-2.0 License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// https://opensource.org/license/apache-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 "fdrivers_port.h" +#include +#include +#include + +/* cache */ +void FDriverDCacheRangeFlush(uintptr_t adr,size_t len) +{ + +} + +void FDriverDCacheRangeInvalidate(uintptr_t adr,size_t len) +{ + +} + + +void FDriverICacheRangeInvalidate(void) +{ + +} + + +/* time delay */ + +void FDriverUdelay(u32 usec) +{ + k_busy_wait(usec) ; +} + +void FDriverMdelay(u32 msec) +{ + k_busy_wait(msec*1000) ; +} + +void FDriverSdelay(u32 sec) +{ + k_busy_wait(sec * 1000 *1000) ; +} + +#define ELOG_LINE_BUF_SIZE 256 +static char log_buf[ELOG_LINE_BUF_SIZE] = { 0 }; + +void FtDumpLogInfo(const char *tag, u32 log_level, const char *log_tag_letter, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vsnprintf(log_buf, sizeof(log_buf), fmt, ap); + va_end(ap); + + do + { + if (strcmp(log_tag_letter, "31") == 0) + { + printf("\031[31m%s:%s\031[0m \r\n", tag, log_buf); + } + else if (strcmp(log_tag_letter, "32") == 0) + { + printf("\032[32m%s:%s\032[0m \r\n", tag, log_buf); + } + else if (strcmp(log_tag_letter, "33") == 0) + { + printf("\033[33m%s:%s\033[0m \r\n", tag, log_buf); + } + else if (strcmp(log_tag_letter, "36") == 0) + { + printf("\036[36m%s:%s\036[0m \r\n", tag, log_buf); + } + else + { + printf("\033[35m%s:%s\033[0m \r\n", tag, log_buf); + } + + }while (0); + + memset(log_buf, 0, sizeof(log_buf)); +} \ No newline at end of file diff --git a/modules/hal/phytium/hal/fdrivers_port/fdrivers_port.h b/modules/hal/phytium/hal/fdrivers_port/fdrivers_port.h new file mode 100644 index 0000000..3a380c9 --- /dev/null +++ b/modules/hal/phytium/hal/fdrivers_port/fdrivers_port.h @@ -0,0 +1,136 @@ +// Phytium is pleased to support the open source community by making Zephyr-SDK available. + +// +// Copyright (C) 2024 Phytium Technology Co., Ltd. All rights reserved. +// +// Licensed under the Apache-2.0 License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// https://opensource.org/license/apache-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 FDRIVERS_PORT_H +#define FDRIVERS_PORT_H + +#include "ftypes.h" + + +#include +#include "fkernel.h" + +/***************************** Include Files *********************************/ +#ifdef __cplusplus +extern "C" +{ +#endif + +/* cache */ +void FDriverDCacheRangeFlush(uintptr_t adr,size_t len); + +void FDriverDCacheRangeInvalidate(uintptr_t adr,size_t len); + +void FDriverICacheRangeInvalidate(void); + + +/* memory barrier */ + + +#define FDRIVER_DSB() //DSB() + +#define FDRIVER_DMB() //DMB() + +#define FDRIVER_ISB() //ISB() + + +/* time delay */ + +void FDriverUdelay(u32 usec); + +void FDriverMdelay(u32 msec); + +void FDriverSdelay(u32 sec); + + + +#define FT_LOG_NONE 0 /* No log output */ +#define FT_LOG_ERROR 1 /* Critical errors, software module can not recover on its own */ +#define FT_LOG_WARN 2 /* Error conditions from which recovery measures have been taken */ +#define FT_LOG_INFO 3 /* Information messages which describe normal flow of events */ +#define FT_LOG_DEBUG 4 /* Extra information which is not necessary for normal use (values, pointers, sizes, etc). */ +#define FT_LOG_VERBOSE 5 /* Bigger chunks of debugging information, or frequent messages which can potentially flood the output. */ + +#define LOG_COLOR_BLACK "30" +#define LOG_COLOR_RED "31" +#define LOG_COLOR_GREEN "32" +#define LOG_COLOR_BROWN "33" +#define LOG_COLOR_BLUE "34" +#define LOG_COLOR_PURPLE "35" +#define LOG_COLOR_CYAN "36" +#define LOG_COLOR(COLOR) "\033[0;" COLOR "m" +#define LOG_BOLD(COLOR) "\033[1;" COLOR "m" +#define LOG_RESET_COLOR "\033[0m" +#define LOG_COLOR_E LOG_COLOR(LOG_COLOR_RED) +#define LOG_COLOR_W LOG_COLOR(LOG_COLOR_BROWN) +#define LOG_COLOR_I LOG_COLOR(LOG_COLOR_GREEN) +#define LOG_COLOR_D LOG_COLOR(LOG_COLOR_CYAN) +#define LOG_COLOR_V LOG_COLOR(LOG_COLOR_PURPLE) + + +void FtDumpLogInfo(const char *tag, u32 log_level, const char *log_tag_letter, const char *fmt, ...) ; + +#ifndef CONFIG_HAL_STANDALONE_SDK_DEBUG +#ifndef FT_DEBUG_PRINT_I +#define FT_DEBUG_PRINT_I(TAG, format, ...) +#endif + +#ifndef FT_DEBUG_PRINT_E +#define FT_DEBUG_PRINT_E(TAG, format, ...) FtDumpLogInfo(TAG, FT_LOG_ERROR, LOG_COLOR_RED,format,##__VA_ARGS__) +#endif + +#ifndef FT_DEBUG_PRINT_D +#define FT_DEBUG_PRINT_D(TAG, format, ...) +#endif + +#ifndef FT_DEBUG_PRINT_W +#define FT_DEBUG_PRINT_W(TAG, format, ...) +#endif + +#ifndef FT_DEBUG_PRINT_V +#define FT_DEBUG_PRINT_V(TAG, format, ...) +#endif + +#else +#ifndef FT_DEBUG_PRINT_I +#define FT_DEBUG_PRINT_I(TAG, format, ...) FtDumpLogInfo(TAG, FT_LOG_INFO, LOG_COLOR_PURPLE,format,##__VA_ARGS__) +#endif + +#ifndef FT_DEBUG_PRINT_E +#define FT_DEBUG_PRINT_E(TAG, format, ...) FtDumpLogInfo(TAG, FT_LOG_ERROR, LOG_COLOR_RED,format,##__VA_ARGS__) +#endif + +#ifndef FT_DEBUG_PRINT_D +#define FT_DEBUG_PRINT_D(TAG, format, ...) FtDumpLogInfo(TAG, FT_LOG_DEBUG, LOG_COLOR_GREEN,format, ##__VA_ARGS__) +#endif + +#ifndef FT_DEBUG_PRINT_W +#define FT_DEBUG_PRINT_W(TAG, format, ...) FtDumpLogInfo(TAG, FT_LOG_WARN, LOG_COLOR_BROWN,format, ##__VA_ARGS__) +#endif + +#ifndef FT_DEBUG_PRINT_V +#define FT_DEBUG_PRINT_V(TAG, format, ...) FtDumpLogInfo(TAG, FT_LOG_VERBOSE, LOG_COLOR_BROWN,format, ##__VA_ARGS__) +#endif + +#endif + + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/modules/hal/phytium/hal/fdrivers_port/sdkconfig.h b/modules/hal/phytium/hal/fdrivers_port/sdkconfig.h new file mode 100644 index 0000000..7bb4942 --- /dev/null +++ b/modules/hal/phytium/hal/fdrivers_port/sdkconfig.h @@ -0,0 +1,14 @@ +// Phytium is pleased to support the open source community by making Zephyr-SDK available. + +// +// Copyright (C) 2024 Phytium Technology Co., Ltd. All rights reserved. +// +// Licensed under the Apache-2.0 License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// https://opensource.org/license/apache-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. diff --git a/modules/hal/phytium/zephyr/module.yml b/modules/hal/phytium/zephyr/module.yml new file mode 100644 index 0000000..a1161c7 --- /dev/null +++ b/modules/hal/phytium/zephyr/module.yml @@ -0,0 +1,4 @@ +build: + cmake: . + settings: + dts_root: . diff --git a/tools/env_test.py b/tools/env_test.py new file mode 100644 index 0000000..d9e0b54 --- /dev/null +++ b/tools/env_test.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +import subprocess + +# 执行 "sudo apt update" 命令 +update_result = subprocess.run(["sudo", "apt", "update"], capture_output=True) +if update_result.returncode == 0: + print("Package lists updated successfully.") +else: + print("Failed to update package lists.") + print("Error message:", update_result.stderr.decode()) + +# 执行 "sudo apt upgrade" 命令 +upgrade_result = subprocess.run(["sudo", "apt", "upgrade"], capture_output=True) +if upgrade_result.returncode == 0: + print("Packages upgraded successfully.") +else: + print("Failed to upgrade packages.") + print("Error message:", upgrade_result.stderr.decode()) + +# 执行 "sudo bash ./tools/kitware-archive.sh" 命令 +kitware_result = subprocess.run(["sudo", "bash", "./tools/kitware-archive.sh"], capture_output=True) +if kitware_result.returncode == 0: + print("kitware-archive.sh script executed successfully.") +else: + print("Failed to execute kitware-archive.sh script.") + print("Error message:", kitware_result.stderr.decode()) + +# 执行必备程序安装命令 +essential_packages = [ + "git", "cmake", "ninja-build", "gperf", + "ccache", "dfu-util", "device-tree-compiler", "wget", + "python3-dev", "python3-pip", "python3-setuptools", "python3-tk", "python3-wheel", "xz-utils", "file", + "make", "gcc", "gcc-multilib", "g++-multilib", "libsdl2-dev", "libmagic1" +] +install_command = ["sudo", "apt", "install", "--no-install-recommends"] + essential_packages +install_result = subprocess.run(install_command, capture_output=True) +if install_result.returncode == 0: + print("Essential packages installed successfully.") +else: + print("Failed to install essential packages.") + print("Error message:", install_result.stderr.decode()) + +# 检查安装是否成功 +check_commands = ["cmake --version", "python3 --version", "dtc --version"] +for cmd in check_commands: + check_result = subprocess.run(cmd, shell=True, capture_output=True) + if check_result.returncode == 0: + print(cmd, "executed successfully.") + else: + print("Failed to check installation of", cmd.split()[0]) + print("Error message:", check_result.stderr.decode()) + +# 安装python虚拟化环境 +venv_install_result = subprocess.run(["sudo", "apt", "install", "python3-venv"], capture_output=True) +if venv_install_result.returncode == 0: + print("python3-venv package installed successfully.") +else: + print("Failed to install python3-venv package.") + print("Error message:", venv_install_result.stderr.decode()) + diff --git a/tools/kitware-archive.sh b/tools/kitware-archive.sh new file mode 100644 index 0000000..66263cf --- /dev/null +++ b/tools/kitware-archive.sh @@ -0,0 +1,99 @@ +#!/bin/sh + +set -eu + +help() { + echo "Usage: $0 [--release ] [--rc]" > /dev/stderr +} + +doing= +rc= +release= +help= +for opt in "$@" +do + case "${doing}" in + release) + release="${opt}" + doing= + ;; + "") + case "${opt}" in + --rc) + rc=1 + ;; + --release) + doing=release + ;; + --help) + help=1 + ;; + esac + ;; + esac +done + +if [ -n "${doing}" ] +then + echo "--${doing} option given no argument." > /dev/stderr + echo > /dev/stderr + help + exit 1 +fi + +if [ -n "${help}" ] +then + help + exit +fi + +if [ -z "${release}" ] +then + unset UBUNTU_CODENAME + . /etc/os-release + + if [ -z "${UBUNTU_CODENAME+x}" ] + then + echo "This is not an Ubuntu system. Aborting." > /dev/stderr + exit 1 + fi + + release="${UBUNTU_CODENAME}" +fi + +case "${release}" in +focal|jammy) + packages= + keyring_packages="ca-certificates gpg wget" + ;; +*) + echo "Only Ubuntu Focal (20.04) and Jammy (22.04) are supported. Aborting." > /dev/stderr + exit 1 + ;; +esac + +get_keyring= +if [ ! -f /usr/share/doc/kitware-archive-keyring/copyright ] +then + packages="${packages} ${keyring_packages}" + get_keyring=1 +fi + +# Start the real work +set -x + +apt-get update +# shellcheck disable=SC2086 +apt-get install -y ${packages} + +test -n "${get_keyring}" && (wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - > /usr/share/keyrings/kitware-archive-keyring.gpg) + +echo "deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ ${release} main" > /etc/apt/sources.list.d/kitware.list +if [ -n "${rc}" ] +then + echo "deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ ${release}-rc main" >> /etc/apt/sources.list.d/kitware.list +fi + +apt-get update +test -n "${get_keyring}" && rm /usr/share/keyrings/kitware-archive-keyring.gpg +apt-get install -y kitware-archive-keyring diff --git a/tools/pull_zephyr_os.py b/tools/pull_zephyr_os.py new file mode 100644 index 0000000..66b3d4c --- /dev/null +++ b/tools/pull_zephyr_os.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +#!/usr/bin/env python +import subprocess + +# 执行 "git clone" 命令 +git_clone_command = ["git", "clone", "https://gitlab.phytium.com.cn/embedded/iot/zephyr/zephyr_kernel.git","zephyr"] +init_result = subprocess.run(git_clone_command, capture_output=True, text=True) + +if init_result.returncode == 0: + print("Code pulled successfully.") +else: + print("Failed to pull the code.") + print("Error message:", init_result.stderr) + print("Output message:", init_result.stdout) + diff --git a/tools/pull_zephyr_os.sh b/tools/pull_zephyr_os.sh new file mode 100644 index 0000000..d0cd963 --- /dev/null +++ b/tools/pull_zephyr_os.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +# 执行 "git clone" 命令 +git clone https://gitlab.phytium.com.cn/embedded/iot/zephyr/zephyr_kernel.git zephyr + +if [ $? -eq 0 ]; then + echo "Code pulled successfully." +else + echo "Failed to pull the code." + echo "Error message:" $? +fi diff --git a/tools/update.py b/tools/update.py new file mode 100644 index 0000000..e69de29 -- Gitee From edce94ec60a6c449c39f00cc5f550bc517fc5c7d Mon Sep 17 00:00:00 2001 From: liqiaozhong Date: Wed, 26 Jun 2024 11:52:25 +0800 Subject: [PATCH 2/2] new update --- README.md | 6 ++---- tools/pull_zephyr_os.py | 8 ++++++-- tools/pull_zephyr_os.sh | 7 +++++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index ca537ac..96a9e50 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ python3 -m venv ./.venv source ./.venv/bin/activate ``` -4. 在当前目录下执行以下命令初始化Zephyr OS,后续Zephyr OS 将会保存在zephyr目录下 +4. 在当前目录下执行以下命令初始化Zephyr OS,后续Zephyr OS 将会保存在zephyr目录下 ``` ./tools/pull_zephyr_os.sh @@ -236,7 +236,6 @@ clean 指令 ,主要为了清除 `/build`下的编译缓存信息,以 | E2000D/Q DEMO板 | aarch64 | 支持SMP模式 | | E2000D/Q DEMO板 | aarch32 | | - ## 5. 例程展示 ### 5.1 内核测试 @@ -251,7 +250,6 @@ clean 指令 ,主要为了清除 `/build`下的编译缓存信息,以 [telnet](./app/peripheral/net/telnet/README.md) [tf_test](./app/peripheral/sdio/tf_test/README.md) - ## 例程介绍 # FIQ @@ -270,4 +268,4 @@ Q:当执行```pip install -r /zephyr/scripts/requirements.txt```命令时出 ![1712107861173](figs/readme/1712107861173.png) -A:可以在```pip install -r /zephyr/scripts/requirements.txt```后面追加```-i https://pypi.tuna.tsinghua.edu.cn/simple```,将pip源设置为国内源 +A:可以在```pip install -r /zephyr/scripts/requirements.txt```后面追加```-i https://pypi.tuna.tsinghua.edu.cn/simple```,将pip源设置为国内源 \ No newline at end of file diff --git a/tools/pull_zephyr_os.py b/tools/pull_zephyr_os.py index 66b3d4c..cebc305 100644 --- a/tools/pull_zephyr_os.py +++ b/tools/pull_zephyr_os.py @@ -1,11 +1,11 @@ #!/usr/bin/env python3 #!/usr/bin/env python import subprocess +import os # 执行 "git clone" 命令 -git_clone_command = ["git", "clone", "https://gitlab.phytium.com.cn/embedded/iot/zephyr/zephyr_kernel.git","zephyr"] +git_clone_command = ["git", "clone", "-b", "phytium_v3.5.0", "https://gitee.com/phytium_embedded/zephyr_kernel.git","zephyr"] init_result = subprocess.run(git_clone_command, capture_output=True, text=True) - if init_result.returncode == 0: print("Code pulled successfully.") else: @@ -13,3 +13,7 @@ else: print("Error message:", init_result.stderr) print("Output message:", init_result.stdout) +origin_dir = os.getcwd() +os.chdir(f"{origin_dir}/zephyr") +os.system(f"git checkout 34f4373122b92232c36e20b08cd7dbf8ce9733d9") +os.chdir(origin_dir) \ No newline at end of file diff --git a/tools/pull_zephyr_os.sh b/tools/pull_zephyr_os.sh index d0cd963..4a9a9e5 100644 --- a/tools/pull_zephyr_os.sh +++ b/tools/pull_zephyr_os.sh @@ -1,11 +1,14 @@ #!/bin/bash # 执行 "git clone" 命令 -git clone https://gitlab.phytium.com.cn/embedded/iot/zephyr/zephyr_kernel.git zephyr +git clone -b phytium_v3.5.0 https://gitee.com/phytium_embedded/zephyr_kernel.git zephyr +cd zephyr +git checkout 34f4373122b92232c36e20b08cd7dbf8ce9733d9 +cd .. if [ $? -eq 0 ]; then echo "Code pulled successfully." else echo "Failed to pull the code." echo "Error message:" $? -fi +fi \ No newline at end of file -- Gitee