diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\343\200\220RSOC26\343\200\221\347\254\254\344\270\200\346\254\241\345\255\246\344\271\240.md" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\343\200\220RSOC26\343\200\221\347\254\254\344\270\200\346\254\241\345\255\246\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..447c768b34ce8b93cb6e5efa826af8603d445f69 --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\343\200\220RSOC26\343\200\221\347\254\254\344\270\200\346\254\241\345\255\246\344\271\240.md" @@ -0,0 +1,77 @@ +# DAY1 学习记录 + +# 一、Markdown 基本语法学习 + +今天学习了 Markdown 的常用写法,包括标题、代码块、表格、行内代码、加粗和斜体等内容,后续可以用 Typora 更方便地整理课程笔记和实验过程。 + +## 1. 标题语法 + +``` +# 一级标题 +## 二级标题 +### 三级标题 +``` + +## 2. 常用格式 + +`行内代码` +**加粗** +***斜体*** + +# 二、Git 与 Gitee 基础操作 + +今天学习了 Git 和 Gitee 的基础使用,主要包括用户信息配置、远程仓库连接、文件提交、分支创建和远程推送。 + +## 1. 基本配置与连接 + +``` +git config --global user.name "用户名" # 配置提交时显示的用户名 +git config --global user.email "邮箱" # 配置提交时显示的邮箱 +git config --list # 查看当前 Git 配置 +ssh -T git@gitee.com # 测试 SSH 是否能正常连接 Gitee +git remote -v # 查看当前远程仓库地址 +git remote set-url origin 仓库地址 # 修改当前仓库的远程地址 +``` + +## 2. 仓库同步与提交 + +``` +git init # 初始化当前目录为 Git 仓库 +git fetch origin master # 同步远程 master 分支信息到本地 +git add file/path # 添加文件到暂存区 +git commit -m "message" # 提交暂存区内容并填写提交说明 +git pull # 拉取远程内容到本地 +git push origin master # 将本地内容推送到远程仓库 +``` + +## 3. 分支操作 + +``` +git checkout -b test # 基于当前分支创建并切换到 test 分支 +``` + +# 三、RT-Thread 工程与调试 + +今天还学习了 RT-Thread Studio 中工程创建、编译、下载和调试的基本流程。 + +## 工程创建与调试 + +- 检查 ST-Link 驱动是否正常 +- 基于 RT-Thread 4.1.1 创建 STM32F407ZG 工程 +- 编译工程并生成可执行文件 +- 将程序下载到开发板 +- 使用 ST-Link 进行断点调试 + +工程调试成功后,程序可以停在 `main()` 函数中,说明工程已经正常下载并运行。 + +# 四、RT-Thread 启动流程 + +通过官网提供的启动流程图,了解了 RT-Thread 从启动文件到用户 `main()` 函数的大致执行过程。 + +- `startup_xx.S` 先执行 +- 进入编译器相关入口函数 +- 调用 `rtthread_startup()` +- 初始化硬件、定时器和调度器 +- 创建主线程、定时器线程和空闲线程 +- 启动系统调度器 +- 最后进入 `main()` 函数 \ No newline at end of file diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817112957813.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817112957813.png" new file mode 100644 index 0000000000000000000000000000000000000000..8cbefd2821fc003691fc15a62e6fc8b10e3fa467 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817112957813.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817113502159.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817113502159.png" new file mode 100644 index 0000000000000000000000000000000000000000..685d7fb5b5eeefc01cfad53b85e4cac38945469b Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817113502159.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817142648941.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817142648941.png" new file mode 100644 index 0000000000000000000000000000000000000000..4bf38e6b886dfa690e5a7d726f15856157c6115b Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817142648941.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817143835258.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817143835258.png" new file mode 100644 index 0000000000000000000000000000000000000000..2ca7c09e48ba4d65780d5a1a5792b9c101bc3ecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817143835258.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817144051657.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817144051657.png" new file mode 100644 index 0000000000000000000000000000000000000000..b3b6900b033d2ba826f94883eab89d955ede7434 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817144051657.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817150046870.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817150046870.png" new file mode 100644 index 0000000000000000000000000000000000000000..95ab187ec4ddb3bd3eb788ab13f0dea61a728a80 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817150046870.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817150446388.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817150446388.png" new file mode 100644 index 0000000000000000000000000000000000000000..c0435456a9dbaaf4aa0dbb0f6c12ccc6d3230ecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817150446388.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817151244692.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817151244692.png" new file mode 100644 index 0000000000000000000000000000000000000000..adf1c1cd27e5acbf0b9d5aa20a8ffebf8f0fbdc5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817151244692.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817152048721.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817152048721.png" new file mode 100644 index 0000000000000000000000000000000000000000..4e39cef8d61f44e369319918be0b95fc35beace8 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817152048721.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817152317118.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817152317118.png" new file mode 100644 index 0000000000000000000000000000000000000000..74f66f4df025334e505c57b42daffa5aa8db5d48 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260817152317118.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818140556194.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818140556194.png" new file mode 100644 index 0000000000000000000000000000000000000000..35ad6963fe9d9e24b90b02a92da4a88996349be1 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818140556194.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818164439722.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818164439722.png" new file mode 100644 index 0000000000000000000000000000000000000000..a7a945d850b8166e44fe27032c825f6fc4120d9e Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818164439722.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818202039012.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818202039012.png" new file mode 100644 index 0000000000000000000000000000000000000000..8aeb7b88e692feaf17ef61fcf1f8480a5987806a Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818202039012.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818210556117.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818210556117.png" new file mode 100644 index 0000000000000000000000000000000000000000..c22ddb4cc9edf0f30552b564c6c478f4de57f996 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818210556117.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818210605960.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818210605960.png" new file mode 100644 index 0000000000000000000000000000000000000000..c22ddb4cc9edf0f30552b564c6c478f4de57f996 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818210605960.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818210732275.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818210732275.png" new file mode 100644 index 0000000000000000000000000000000000000000..af7b05423b82c2281ec468ea8cd1ced2e2e4a3c5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818210732275.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818210821589.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818210821589.png" new file mode 100644 index 0000000000000000000000000000000000000000..4a0f90d7a951c426897f02ccb2eac4a0982376a5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818210821589.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818211005741.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818211005741.png" new file mode 100644 index 0000000000000000000000000000000000000000..ff0da8904baeebbbd649d90ffadf5181b08d7389 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818211005741.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818211045732.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818211045732.png" new file mode 100644 index 0000000000000000000000000000000000000000..6e56fc96a1b0a365e022e9f933be18b720ee294a Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260818211045732.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819144141632.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819144141632.png" new file mode 100644 index 0000000000000000000000000000000000000000..3ee96e6ac8528e5088c75d32c3665f0f96fd5714 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819144141632.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819150611545.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819150611545.png" new file mode 100644 index 0000000000000000000000000000000000000000..33080ef05321f65e8c45b64c205bb22af2958773 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819150611545.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819150625868.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819150625868.png" new file mode 100644 index 0000000000000000000000000000000000000000..689b648403c348a4a9675a375dbd1f5638390c15 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819150625868.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819152800741.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819152800741.png" new file mode 100644 index 0000000000000000000000000000000000000000..33080ef05321f65e8c45b64c205bb22af2958773 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819152800741.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819155711526.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819155711526.png" new file mode 100644 index 0000000000000000000000000000000000000000..fd5ff0b2aa64dd9f143979addca012c5288f82ac Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819155711526.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819165949131.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819165949131.png" new file mode 100644 index 0000000000000000000000000000000000000000..d91a94d74a42ec2dbefbeebc03c736228db8b8dd Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/image-20260819165949131.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/rtt_startup.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/rtt_startup.png" new file mode 100644 index 0000000000000000000000000000000000000000..04dbb79fed05b7463c5ceea179f5dd75c6553724 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/rtt_startup.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" new file mode 100644 index 0000000000000000000000000000000000000000..800ec298cc4dd2fa7599d475a0c8f3bf52a3eecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" new file mode 100644 index 0000000000000000000000000000000000000000..95e8ab4ef99114778b540f5d2755243bfb511a95 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" new file mode 100644 index 0000000000000000000000000000000000000000..e4fb0f0ce5fae09fda464fe2b060422cbe7ad598 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/package_demo.c" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/package_demo.c" new file mode 100644 index 0000000000000000000000000000000000000000..f673e5b3c2b689b5d639ae6c31868fc0d92608e2 --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/package_demo.c" @@ -0,0 +1,360 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-08-19 xlc the first version + */ +#include + +struct package_msg +{ + rt_uint32_t id; + rt_uint8_t region; + rt_uint16_t weight; +}; + +#define PACKAGE_QUEUE_LEN 5 +#define PACKAGE_SEND_COUNT 5 +#define PACKAGE_STACK_SIZE 1024 +#define PACKAGE_END_REGION 0xFF + +static rt_mq_t package_mq = RT_NULL; +static rt_sem_t sender_done_sem = RT_NULL; +static rt_sem_t receiver_done_sem = RT_NULL; +static rt_mutex_t stat_mutex = RT_NULL; + +static struct rt_thread sender_a_thread; +static struct rt_thread sender_b_thread; +static struct rt_thread receiver_thread; + +static rt_uint8_t sender_a_stack[PACKAGE_STACK_SIZE]; +static rt_uint8_t sender_b_stack[PACKAGE_STACK_SIZE]; +static rt_uint8_t receiver_stack[PACKAGE_STACK_SIZE]; + +static volatile rt_uint8_t demo_running = 0; + +static rt_uint32_t total_count = 0; +static rt_uint32_t east_count = 0; +static rt_uint32_t south_count = 0; +static rt_uint32_t north_count = 0; +static rt_uint32_t total_weight = 0; +static rt_uint32_t send_failed = 0; + +static const char *region_name(rt_uint8_t region) +{ + switch (region) + { + case 1: return "east"; + case 2: return "south"; + case 3: return "north"; + default: return "unknown"; + } +} + +static void stat_add(rt_uint8_t region, rt_uint16_t weight) +{ + rt_mutex_take(stat_mutex, RT_WAITING_FOREVER); + + total_count++; + total_weight += weight; + + if (region == 1) east_count++; + else if (region == 2) south_count++; + else if (region == 3) north_count++; + + rt_mutex_release(stat_mutex); +} + +static void stat_add_send_failed(void) +{ + rt_mutex_take(stat_mutex, RT_WAITING_FOREVER); + send_failed++; + rt_mutex_release(stat_mutex); +} + +static void print_stats(void) +{ + rt_uint32_t tc, ec, sc, nc, tw, sf; + + rt_mutex_take(stat_mutex, RT_WAITING_FOREVER); + tc = total_count; + ec = east_count; + sc = south_count; + nc = north_count; + tw = total_weight; + sf = send_failed; + rt_mutex_release(stat_mutex); + + rt_kprintf("total packages: %u\n", tc); + rt_kprintf("east: %u, south: %u, north: %u\n", ec, sc, nc); + rt_kprintf("total weight: %u g\n", tw); + rt_kprintf("send failed: %u\n", sf); +} + +static void send_end_message(void) +{ + struct package_msg end_msg; + + end_msg.id = 0; + end_msg.region = PACKAGE_END_REGION; + end_msg.weight = 0; + + while (rt_mq_send(package_mq, &end_msg, sizeof(end_msg)) == -RT_EFULL) + { + rt_thread_mdelay(10); + } +} + +static void sender_thread_entry(void *parameter) +{ + rt_uint32_t sender_id = (rt_uint32_t)(rt_ubase_t)parameter; + rt_uint32_t i; + struct package_msg msg; + + rt_thread_mdelay(100); + + for (i = 0; i < PACKAGE_SEND_COUNT; i++) + { + if (sender_id == 1) + { + static const rt_uint8_t regions[PACKAGE_SEND_COUNT] = {1, 2, 3, 1, 2}; + static const rt_uint16_t weights[PACKAGE_SEND_COUNT] = {1200, 850, 960, 1100, 780}; + msg.id = 1000 + i + 1; + msg.region = regions[i]; + msg.weight = weights[i]; + } + else + { + static const rt_uint8_t regions[PACKAGE_SEND_COUNT] = {2, 3, 1, 3, 2}; + static const rt_uint16_t weights[PACKAGE_SEND_COUNT] = {920, 1040, 880, 1260, 790}; + msg.id = 2000 + i + 1; + msg.region = regions[i]; + msg.weight = weights[i]; + } + + if (rt_mq_send(package_mq, &msg, sizeof(msg)) != RT_EOK) + { + stat_add_send_failed(); + rt_kprintf("sender %u send failed for package %u\n", sender_id, msg.id); + } + + rt_thread_mdelay(60 + sender_id * 20); + } + + rt_sem_release(sender_done_sem); +} + +static void receiver_thread_entry(void *parameter) +{ + struct package_msg msg; + rt_err_t result; + + RT_UNUSED(parameter); + + while (1) + { + result = rt_mq_recv(package_mq, &msg, sizeof(msg), RT_WAITING_FOREVER); + if (result == RT_EOK) + { + if (msg.id == 0 && msg.region == PACKAGE_END_REGION) + { + break; + } + + rt_kprintf("package %u -> %s, weight: %u g\n", + msg.id, region_name(msg.region), msg.weight); + stat_add(msg.region, msg.weight); + } + } + + print_stats(); + rt_sem_release(receiver_done_sem); +} + +int package_demo(int argc, char **argv) +{ + rt_err_t result; + rt_uint8_t started_sender_cnt = 0; + + RT_UNUSED(argc); + RT_UNUSED(argv); + + if (demo_running) + { + rt_kprintf("package demo is already running\n"); + return -RT_ERROR; + } + + demo_running = 1; + + package_mq = rt_mq_create("pkgmq", sizeof(struct package_msg), PACKAGE_QUEUE_LEN, RT_IPC_FLAG_PRIO); + if (package_mq == RT_NULL) + { + rt_kprintf("create package mq failed\n"); + demo_running = 0; + return -RT_ERROR; + } + + sender_done_sem = rt_sem_create("snddn", 0, RT_IPC_FLAG_PRIO); + if (sender_done_sem == RT_NULL) + { + rt_kprintf("create sender done sem failed\n"); + rt_mq_delete(package_mq); + package_mq = RT_NULL; + demo_running = 0; + return -RT_ERROR; + } + + receiver_done_sem = rt_sem_create("rcvdn", 0, RT_IPC_FLAG_PRIO); + if (receiver_done_sem == RT_NULL) + { + rt_kprintf("create receiver done sem failed\n"); + rt_sem_delete(sender_done_sem); + sender_done_sem = RT_NULL; + rt_mq_delete(package_mq); + package_mq = RT_NULL; + demo_running = 0; + return -RT_ERROR; + } + + stat_mutex = rt_mutex_create("pkgmtx", RT_IPC_FLAG_PRIO); + if (stat_mutex == RT_NULL) + { + rt_kprintf("create stat mutex failed\n"); + rt_sem_delete(receiver_done_sem); + receiver_done_sem = RT_NULL; + rt_sem_delete(sender_done_sem); + sender_done_sem = RT_NULL; + rt_mq_delete(package_mq); + package_mq = RT_NULL; + demo_running = 0; + return -RT_ERROR; + } + + total_count = 0; + east_count = 0; + south_count = 0; + north_count = 0; + total_weight = 0; + send_failed = 0; + + result = rt_thread_init(&receiver_thread, + "pkgrcv", + receiver_thread_entry, + RT_NULL, + receiver_stack, + sizeof(receiver_stack), + 20, + 10); + if (result != RT_EOK) + { + rt_kprintf("init receiver thread failed, err=%d\n", result); + goto fail; + } + + result = rt_thread_init(&sender_a_thread, + "sndA", + sender_thread_entry, + (void *)(rt_ubase_t)1, + sender_a_stack, + sizeof(sender_a_stack), + 21, + 10); + if (result != RT_EOK) + { + rt_kprintf("init sender A thread failed, err=%d\n", result); + goto fail; + } + + result = rt_thread_init(&sender_b_thread, + "sndB", + sender_thread_entry, + (void *)(rt_ubase_t)2, + sender_b_stack, + sizeof(sender_b_stack), + 21, + 10); + if (result != RT_EOK) + { + rt_kprintf("init sender B thread failed, err=%d\n", result); + goto fail; + } + + result = rt_thread_startup(&receiver_thread); + if (result != RT_EOK) + { + rt_kprintf("startup receiver thread failed, err=%d\n", result); + goto fail; + } + + result = rt_thread_startup(&sender_a_thread); + if (result == RT_EOK) + started_sender_cnt++; + else + rt_kprintf("startup sender A thread failed, err=%d\n", result); + + result = rt_thread_startup(&sender_b_thread); + if (result == RT_EOK) + started_sender_cnt++; + else + rt_kprintf("startup sender B thread failed, err=%d\n", result); + + while (started_sender_cnt > 0) + { + rt_sem_take(sender_done_sem, RT_WAITING_FOREVER); + started_sender_cnt--; + } + + send_end_message(); + rt_sem_take(receiver_done_sem, RT_WAITING_FOREVER); + + rt_mutex_delete(stat_mutex); + stat_mutex = RT_NULL; + + rt_sem_delete(receiver_done_sem); + receiver_done_sem = RT_NULL; + + rt_sem_delete(sender_done_sem); + sender_done_sem = RT_NULL; + + rt_mq_delete(package_mq); + package_mq = RT_NULL; + + demo_running = 0; + + rt_kprintf("package demo finished\n"); + return RT_EOK; + +fail: + if (stat_mutex != RT_NULL) + { + rt_mutex_delete(stat_mutex); + stat_mutex = RT_NULL; + } + + if (receiver_done_sem != RT_NULL) + { + rt_sem_delete(receiver_done_sem); + receiver_done_sem = RT_NULL; + } + + if (sender_done_sem != RT_NULL) + { + rt_sem_delete(sender_done_sem); + sender_done_sem = RT_NULL; + } + + if (package_mq != RT_NULL) + { + rt_mq_delete(package_mq); + package_mq = RT_NULL; + } + + demo_running = 0; + return result; +} + +MSH_CMD_EXPORT(package_demo, package sort demo); diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/parking_demo.c" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/parking_demo.c" new file mode 100644 index 0000000000000000000000000000000000000000..861a50643da0c8e666d03cc9e4d80cb7b54ad9ff --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/parking_demo.c" @@ -0,0 +1,212 @@ +#include + +#define CAR_COUNT 5 +#define PARKING_SPACES 3 +#define CAR_STACK_SIZE 1024 +#define MONITOR_STACK_SIZE 1024 + +static rt_sem_t parking_sem = RT_NULL; +static rt_mutex_t count_mutex = RT_NULL; + +static struct rt_thread car_threads[CAR_COUNT]; +static rt_uint8_t car_stacks[CAR_COUNT][CAR_STACK_SIZE]; + +static struct rt_thread monitor_thread; +static rt_uint8_t monitor_stack[MONITOR_STACK_SIZE]; + +static volatile rt_uint8_t demo_running = 0; +static volatile rt_uint8_t cars_ready = 0; +static volatile rt_uint8_t started_cars = 0; +static volatile rt_uint8_t finished_cars = 0; +static volatile rt_uint8_t used_spaces = 0; + +static void parking_reset_state(void) +{ + cars_ready = 0; + started_cars = 0; + finished_cars = 0; + used_spaces = 0; + demo_running = 0; +} + +static void parking_cleanup_ipc(void) +{ + if (parking_sem != RT_NULL) + { + rt_sem_delete(parking_sem); + parking_sem = RT_NULL; + } + + if (count_mutex != RT_NULL) + { + rt_mutex_delete(count_mutex); + count_mutex = RT_NULL; + } +} + +static void car_thread_entry(void *parameter) +{ + rt_uint32_t car_id = (rt_uint32_t)parameter; + rt_err_t result; + rt_tick_t timeout = rt_tick_from_millisecond(2000); + + rt_thread_mdelay(car_id * 300); + + while (1) + { + result = rt_sem_take(parking_sem, timeout); + if (result == RT_EOK) + { + rt_mutex_take(count_mutex, RT_WAITING_FOREVER); + used_spaces++; + rt_kprintf("car%d entered, used spaces: %d\n", car_id, used_spaces); + rt_mutex_release(count_mutex); + + rt_thread_mdelay(2500 + car_id * 200); + + rt_mutex_take(count_mutex, RT_WAITING_FOREVER); + if (used_spaces > 0) + used_spaces--; + rt_kprintf("car%d left, used spaces: %d\n", car_id, used_spaces); + rt_mutex_release(count_mutex); + + rt_sem_release(parking_sem); + break; + } + else if (result == -RT_ETIMEOUT) + { + rt_kprintf("car%d waiting for a space\n", car_id); + rt_thread_mdelay(500); + } + else + { + rt_kprintf("car%d failed to take parking space, err=%d\n", car_id, result); + rt_thread_mdelay(500); + } + } + + rt_mutex_take(count_mutex, RT_WAITING_FOREVER); + finished_cars++; + rt_mutex_release(count_mutex); +} + +static void monitor_thread_entry(void *parameter) +{ + RT_UNUSED(parameter); + + while (1) + { + if (!cars_ready) + { + rt_thread_mdelay(200); + continue; + } + + rt_mutex_take(count_mutex, RT_WAITING_FOREVER); + if (finished_cars >= started_cars) + { + rt_mutex_release(count_mutex); + break; + } + rt_mutex_release(count_mutex); + + rt_thread_mdelay(200); + } + + parking_reset_state(); + parking_cleanup_ipc(); + + rt_kprintf("parking demo finished\n"); +} + +int parking_demo(int argc, char **argv) +{ + rt_uint8_t i; + rt_err_t result; + + if (demo_running) + { + rt_kprintf("parking demo is already running\n"); + return -RT_ERROR; + } + + demo_running = 1; + cars_ready = 0; + started_cars = 0; + finished_cars = 0; + used_spaces = 0; + + parking_sem = rt_sem_create("parksem", PARKING_SPACES, RT_IPC_FLAG_PRIO); + if (parking_sem == RT_NULL) + { + rt_kprintf("create parking semaphore failed\n"); + parking_reset_state(); + return -RT_ERROR; + } + + count_mutex = rt_mutex_create("parkmtx", RT_IPC_FLAG_PRIO); + if (count_mutex == RT_NULL) + { + rt_kprintf("create count mutex failed\n"); + parking_cleanup_ipc(); + parking_reset_state(); + return -RT_ERROR; + } + + result = rt_thread_init(&monitor_thread, + "parkmon", + monitor_thread_entry, + RT_NULL, + monitor_stack, + sizeof(monitor_stack), + 21, + 10); + if (result != RT_EOK) + { + rt_kprintf("init monitor thread failed, err=%d\n", result); + parking_cleanup_ipc(); + parking_reset_state(); + return result; + } + + result = rt_thread_startup(&monitor_thread); + if (result != RT_EOK) + { + rt_kprintf("startup monitor thread failed, err=%d\n", result); + parking_cleanup_ipc(); + parking_reset_state(); + return result; + } + + for (i = 0; i < CAR_COUNT; i++) + { + result = rt_thread_init(&car_threads[i], + "car", + car_thread_entry, + (void *)(rt_ubase_t)(i + 1), + car_stacks[i], + sizeof(car_stacks[i]), + 20, + 10); + if (result != RT_EOK) + { + rt_kprintf("init car%d thread failed, err=%d\n", i + 1, result); + continue; + } + + result = rt_thread_startup(&car_threads[i]); + if (result != RT_EOK) + { + rt_kprintf("startup car%d thread failed, err=%d\n", i + 1, result); + continue; + } + + started_cars++; + } + + cars_ready = 1; + + return RT_EOK; +} + +MSH_CMD_EXPORT(parking_demo, parking lot semaphore demo); diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/startup_demo.c" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/startup_demo.c" new file mode 100644 index 0000000000000000000000000000000000000000..71365b84ad9b82de4645f396dcbb4477750d54ed --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/startup_demo.c" @@ -0,0 +1,327 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-08-19 xlc the first version + */ +#include + +#define EVENT_NET_READY (1U << 0) +#define EVENT_SENSOR_READY (1U << 1) +#define EVENT_STORAGE_READY (1U << 2) +#define EVENT_ALL_READY (EVENT_NET_READY | EVENT_SENSOR_READY | EVENT_STORAGE_READY) + +#define THREAD_STACK_SIZE 1024 +#define THREAD_PRIORITY 20 +#define THREAD_TIMESLICE 10 + +static rt_event_t startup_event = RT_NULL; +static rt_mutex_t state_mutex = RT_NULL; + +static rt_thread_t net_thread = RT_NULL; +static rt_thread_t sensor_thread = RT_NULL; +static rt_thread_t storage_thread = RT_NULL; +static rt_thread_t business_thread = RT_NULL; + +static rt_uint8_t net_stack[THREAD_STACK_SIZE]; +static rt_uint8_t sensor_stack[THREAD_STACK_SIZE]; +static rt_uint8_t storage_stack[THREAD_STACK_SIZE]; +static rt_uint8_t business_stack[THREAD_STACK_SIZE]; + +static struct rt_thread net_th; +static struct rt_thread sensor_th; +static struct rt_thread storage_th; +static struct rt_thread business_th; + +static volatile rt_uint8_t demo_running = 0; +static volatile rt_uint32_t ready_flags = 0; + +static void set_ready_flag(rt_uint32_t flag) +{ + rt_mutex_take(state_mutex, RT_WAITING_FOREVER); + ready_flags |= flag; + rt_mutex_release(state_mutex); +} + +static rt_uint32_t get_ready_flag(void) +{ + rt_uint32_t flags; + + rt_mutex_take(state_mutex, RT_WAITING_FOREVER); + flags = ready_flags; + rt_mutex_release(state_mutex); + + return flags; +} + +static void net_init_entry(void *parameter) +{ + RT_UNUSED(parameter); + + rt_thread_mdelay(1000); + set_ready_flag(EVENT_NET_READY); + rt_event_send(startup_event, EVENT_NET_READY); + rt_kprintf("network ready\n"); +} + +static void sensor_init_entry(void *parameter) +{ + RT_UNUSED(parameter); + + rt_thread_mdelay(2000); + set_ready_flag(EVENT_SENSOR_READY); + rt_event_send(startup_event, EVENT_SENSOR_READY); + rt_kprintf("sensor ready\n"); +} + +static void storage_init_entry(void *parameter) +{ + RT_UNUSED(parameter); + + rt_thread_mdelay(5000); + set_ready_flag(EVENT_STORAGE_READY); + rt_event_send(startup_event, EVENT_STORAGE_READY); + rt_kprintf("storage ready\n"); +} + +static void business_entry(void *parameter) +{ + rt_err_t result; + rt_uint32_t recved; + + RT_UNUSED(parameter); + + while (1) + { + result = rt_event_recv(startup_event, + EVENT_ALL_READY, + RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, + rt_tick_from_millisecond(3000), + &recved); + if (result == RT_EOK) + { + rt_kprintf("all modules are ready\n"); + rt_kprintf("business task started\n"); + break; + } + else if (result == -RT_ETIMEOUT) + { + rt_uint32_t flags = get_ready_flag(); + + rt_kprintf("wait modules timeout, "); + if ((flags & EVENT_STORAGE_READY) == 0) + { + rt_kprintf("storage is not ready"); + } + else if ((flags & EVENT_SENSOR_READY) == 0) + { + rt_kprintf("sensor is not ready"); + } + else if ((flags & EVENT_NET_READY) == 0) + { + rt_kprintf("network is not ready"); + } + else + { + rt_kprintf("modules are still not fully ready"); + } + rt_kprintf("\n"); + } + else + { + rt_kprintf("wait event failed, err=%d\n", result); + rt_thread_mdelay(200); + } + } +} + +int startup_demo(int argc, char **argv) +{ + rt_err_t result; + + RT_UNUSED(argc); + RT_UNUSED(argv); + + if (demo_running) + { + rt_kprintf("startup demo is already running\n"); + return -RT_ERROR; + } + + demo_running = 1; + ready_flags = 0; + + startup_event = rt_event_create("stpev", RT_IPC_FLAG_PRIO); + if (startup_event == RT_NULL) + { + rt_kprintf("create event failed\n"); + demo_running = 0; + return -RT_ERROR; + } + + state_mutex = rt_mutex_create("stpmtx", RT_IPC_FLAG_PRIO); + if (state_mutex == RT_NULL) + { + rt_kprintf("create mutex failed\n"); + rt_event_delete(startup_event); + startup_event = RT_NULL; + demo_running = 0; + return -RT_ERROR; + } + + result = rt_thread_init(&net_th, + "netini", + net_init_entry, + RT_NULL, + net_stack, + sizeof(net_stack), + THREAD_PRIORITY, + THREAD_TIMESLICE); + if (result != RT_EOK) + { + rt_kprintf("init network thread failed, err=%d\n", result); + rt_mutex_delete(state_mutex); + state_mutex = RT_NULL; + rt_event_delete(startup_event); + startup_event = RT_NULL; + demo_running = 0; + return result; + } + + result = rt_thread_init(&sensor_th, + "sensi", + sensor_init_entry, + RT_NULL, + sensor_stack, + sizeof(sensor_stack), + THREAD_PRIORITY, + THREAD_TIMESLICE); + if (result != RT_EOK) + { + rt_kprintf("init sensor thread failed, err=%d\n", result); + rt_mutex_delete(state_mutex); + state_mutex = RT_NULL; + rt_event_delete(startup_event); + startup_event = RT_NULL; + demo_running = 0; + return result; + } + + result = rt_thread_init(&storage_th, + "store", + storage_init_entry, + RT_NULL, + storage_stack, + sizeof(storage_stack), + THREAD_PRIORITY, + THREAD_TIMESLICE); + if (result != RT_EOK) + { + rt_kprintf("init storage thread failed, err=%d\n", result); + rt_mutex_delete(state_mutex); + state_mutex = RT_NULL; + rt_event_delete(startup_event); + startup_event = RT_NULL; + demo_running = 0; + return result; + } + + result = rt_thread_init(&business_th, + "biz", + business_entry, + RT_NULL, + business_stack, + sizeof(business_stack), + THREAD_PRIORITY - 1, + THREAD_TIMESLICE); + if (result != RT_EOK) + { + rt_kprintf("init business thread failed, err=%d\n", result); + rt_mutex_delete(state_mutex); + state_mutex = RT_NULL; + rt_event_delete(startup_event); + startup_event = RT_NULL; + demo_running = 0; + return result; + } + + result = rt_thread_startup(&net_th); + if (result != RT_EOK) + { + rt_kprintf("startup network thread failed, err=%d\n", result); + rt_mutex_delete(state_mutex); + state_mutex = RT_NULL; + rt_event_delete(startup_event); + startup_event = RT_NULL; + demo_running = 0; + return result; + } + + result = rt_thread_startup(&sensor_th); + if (result != RT_EOK) + { + rt_kprintf("startup sensor thread failed, err=%d\n", result); + rt_mutex_delete(state_mutex); + state_mutex = RT_NULL; + rt_event_delete(startup_event); + startup_event = RT_NULL; + demo_running = 0; + return result; + } + + result = rt_thread_startup(&storage_th); + if (result != RT_EOK) + { + rt_kprintf("startup storage thread failed, err=%d\n", result); + rt_mutex_delete(state_mutex); + state_mutex = RT_NULL; + rt_event_delete(startup_event); + startup_event = RT_NULL; + demo_running = 0; + return result; + } + + result = rt_thread_startup(&business_th); + if (result != RT_EOK) + { + rt_kprintf("startup business thread failed, err=%d\n", result); + rt_mutex_delete(state_mutex); + state_mutex = RT_NULL; + rt_event_delete(startup_event); + startup_event = RT_NULL; + demo_running = 0; + return result; + } + + /* + * 业务线程会在模块全部就绪后退出。 + * 为了让命令可再次启动,这里做一个简单等待, + * 等业务线程打印完结果后再释放资源。 + */ + while (1) + { + rt_uint32_t flags = get_ready_flag(); + if ((flags & EVENT_ALL_READY) == EVENT_ALL_READY) + { + break; + } + rt_thread_mdelay(200); + } + + rt_thread_mdelay(500); + + rt_event_delete(startup_event); + startup_event = RT_NULL; + + rt_mutex_delete(state_mutex); + state_mutex = RT_NULL; + + demo_running = 0; + + return RT_EOK; +} + +MSH_CMD_EXPORT(startup_demo, startup condition check demo); diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/ticket_demo.c" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/ticket_demo.c" new file mode 100644 index 0000000000000000000000000000000000000000..600f766684e6160e70ce2dd044c2ce1d961140aa --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/ticket_demo.c" @@ -0,0 +1,198 @@ +#include + +#define TICKET_USE_MUTEX 1 +#define WINDOW_STACK_SIZE 1024 + +static rt_mutex_t ticket_mutex = RT_NULL; +static rt_sem_t done_sem = RT_NULL; + +static struct rt_thread window_a_thread; +static struct rt_thread window_b_thread; +static rt_uint8_t window_a_stack[WINDOW_STACK_SIZE]; +static rt_uint8_t window_b_stack[WINDOW_STACK_SIZE]; + +static volatile rt_int32_t ticket_count = 20; +static volatile rt_uint8_t demo_running = 0; + +static void window_thread_entry(void *parameter) +{ + const char *name = (const char *)parameter; + + while (1) + { +#if TICKET_USE_MUTEX + if (ticket_mutex != RT_NULL) + { + if (rt_mutex_take(ticket_mutex, RT_WAITING_FOREVER) != RT_EOK) + { + rt_kprintf("%s failed to take mutex\n", name); + rt_thread_mdelay(10); + continue; + } + } +#endif + + if (ticket_count <= 0) + { +#if TICKET_USE_MUTEX + if (ticket_mutex != RT_NULL) + { + rt_mutex_release(ticket_mutex); + } +#endif + break; + } + +#if !TICKET_USE_MUTEX + rt_thread_mdelay(20); +#endif + + rt_kprintf("%s sold ticket %d\n", name, ticket_count); + ticket_count--; + +#if TICKET_USE_MUTEX + if (ticket_mutex != RT_NULL) + { + rt_mutex_release(ticket_mutex); + } +#endif + + rt_thread_mdelay(50); + } + + if (done_sem != RT_NULL) + { + rt_sem_release(done_sem); + } + + rt_kprintf("%s exit\n", name); +} + +int ticket_demo(int argc, char **argv) +{ + rt_err_t result; + + RT_UNUSED(argc); + RT_UNUSED(argv); + + if (demo_running) + { + rt_kprintf("ticket demo is already running\n"); + return -RT_ERROR; + } + + demo_running = 1; + ticket_count = 20; + +#if TICKET_USE_MUTEX + ticket_mutex = rt_mutex_create("tktmtx", RT_IPC_FLAG_PRIO); + if (ticket_mutex == RT_NULL) + { + rt_kprintf("create ticket mutex failed\n"); + demo_running = 0; + return -RT_ERROR; + } +#endif + + done_sem = rt_sem_create("tkdone", 0, RT_IPC_FLAG_PRIO); + if (done_sem == RT_NULL) + { + rt_kprintf("create done semaphore failed\n"); +#if TICKET_USE_MUTEX + rt_mutex_delete(ticket_mutex); + ticket_mutex = RT_NULL; +#endif + demo_running = 0; + return -RT_ERROR; + } + + result = rt_thread_init(&window_a_thread, + "winA", + window_thread_entry, + (void *)"window A", + window_a_stack, + sizeof(window_a_stack), + 20, + 10); + if (result != RT_EOK) + { + rt_kprintf("init window A thread failed, err=%d\n", result); + rt_sem_delete(done_sem); + done_sem = RT_NULL; +#if TICKET_USE_MUTEX + rt_mutex_delete(ticket_mutex); + ticket_mutex = RT_NULL; +#endif + demo_running = 0; + return result; + } + + result = rt_thread_init(&window_b_thread, + "winB", + window_thread_entry, + (void *)"window B", + window_b_stack, + sizeof(window_b_stack), + 20, + 10); + if (result != RT_EOK) + { + rt_kprintf("init window B thread failed, err=%d\n", result); + rt_sem_delete(done_sem); + done_sem = RT_NULL; +#if TICKET_USE_MUTEX + rt_mutex_delete(ticket_mutex); + ticket_mutex = RT_NULL; +#endif + demo_running = 0; + return result; + } + + result = rt_thread_startup(&window_a_thread); + if (result != RT_EOK) + { + rt_kprintf("startup window A thread failed, err=%d\n", result); + rt_sem_delete(done_sem); + done_sem = RT_NULL; +#if TICKET_USE_MUTEX + rt_mutex_delete(ticket_mutex); + ticket_mutex = RT_NULL; +#endif + demo_running = 0; + return result; + } + + result = rt_thread_startup(&window_b_thread); + if (result != RT_EOK) + { + rt_kprintf("startup window B thread failed, err=%d\n", result); + rt_sem_delete(done_sem); + done_sem = RT_NULL; +#if TICKET_USE_MUTEX + rt_mutex_delete(ticket_mutex); + ticket_mutex = RT_NULL; +#endif + demo_running = 0; + return result; + } + + rt_sem_take(done_sem, RT_WAITING_FOREVER); + rt_sem_take(done_sem, RT_WAITING_FOREVER); + + rt_sem_delete(done_sem); + done_sem = RT_NULL; + +#if TICKET_USE_MUTEX + rt_mutex_delete(ticket_mutex); + ticket_mutex = RT_NULL; +#endif + + demo_running = 0; + + rt_kprintf("all tickets sold\n"); + rt_kprintf("remaining tickets: %d\n", ticket_count); + + return RT_EOK; +} + +MSH_CMD_EXPORT(ticket_demo, ticket sale demo); diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/\345\256\236\351\252\214\346\212\245\345\221\212.md" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/\345\256\236\351\252\214\346\212\245\345\221\212.md" new file mode 100644 index 0000000000000000000000000000000000000000..5cf9492d5acd824f5c05cabb68dbe979864aa5b9 --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/\345\256\236\351\252\214\346\212\245\345\221\212.md" @@ -0,0 +1,411 @@ +# 练习一:停车场车位管理 + +本实验通过模拟停车场车位管理场景,学习计数信号量的使用方法,理解线程在竞争有限资源时的同步控制过程 + +停车场共有三个车位,同时有五辆车尝试进入,车辆只有成功申请到车位后才能进入停车场,离开时释放车位。该实验验证计数信号量可以用于管理多个同类有限资源,并保证任意时刻进入停车场的车辆数不超过资源总数 + +### 实验原理 + +停车场车位属于有限资源。由于本实验中共有 3 个车位,因此使用初始值为 3 的计数信号量表示当前可用车位数量 + +当车辆线程申请车位时,实际是对信号量执行获取操作: + +如果信号量值大于 0,表示还有空车位,车辆可以进入,信号量值减 1 + +如果信号量值为 0,表示车位已满,车辆线程需要等待; + +如果车辆在 2 秒内没有获得车位,则打印等待超时信息,并稍后重新申请 + +车辆离开停车场时释放信号量,表示空出一个车位 + +为了正确统计当前已使用车位数量,程序中使用互斥量保护 used_spaces变量,避免多个线程同时修改该变量导致统计结果错误 + +### 实验过程 + +**编写MSH命令入口** + +在程序中定义 parking_demo函数作为实验入口,并使用 MSH_CMD_EXPORT 将其导出为 MSH 命令 + +``` +int parking_demo(int argc, char **argv) +{ + ... +} + +MSH_CMD_EXPORT(parking_demo, parking lot semaphore demo); +``` + +**创建IPC对象** + +程序运行后,首先创建计数信号量和互斥量,计数信号量 parking_sem的初始值为 3,用于表示停车场可用车位数量。互斥量 count_mutex用于保护 used_spaces、finished_cars 等共享变量,防止多个线程同时修改造成数据错误 + +**创建车辆线程** + +程序创建 5 个车辆线程,每个线程表示一辆车。车辆线程执行流程如下: + +1. 延时一段时间,模拟不同车辆到达停车场的时间不同 +2. 调用 rt_sem_take申请车位 +3. 如果 2 秒内申请成功,则进入停车场 +4. 修改并打印当前已使用车位数量 +5. 停车一段时间 +6. 离开停车场 +7. 调用 rt_sem_release释放车位 +8. 线程结束前更新完成车辆数量 + +**创建监控线程** + +程序创建一个监控线程,用于判断所有车辆线程是否已经执行结束。所有车辆线程结束后,监控线程释放信号量和互斥量资源,并将运行状态标志清除,保证后续可以再次执行 parking_demo命令 + +**实验结果** + +在MSH提示符后输入 :praking_demo + +串口终端输出结果 + +![image-20260819144141632](D:\TYPORA\figures\image-20260819144141632.png) + +实际运行时,线程调度顺序可能略有不同,但应满足以下条件: + +1. used spaces最大值不超过 3 +2. 当 3 个车位已被占用时,后续车辆会等待 +3. 有车辆离开后,等待车辆可以重新进入 +4. 所有车辆最终都能离开 +5. 程序结束后打印 parking demo finished + +**实验结果分析** + +从运行结果可以看到,前三辆车进入停车场后,used spaces达到 3。此时停车场车位已满,后续车辆无法立即进入,因此会出现等待信息当已有车辆离开后,程序调用 rt_sem_release 释放信号量,表示空出一个车位。等待车辆随后重新申请车位并进入停车场。整个运行过程中,used spaces没有超过 3,说明计数信号量成功限制了同时进入停车场的车辆数量。该实验验证了计数信号量适合用于管理多个同类有限资源 + +### 思考题 + +**为什么这里使用计数信号量,而不是互斥量?** + +因为本实验要管理的是3个停车位,属于多个同类有限资源,计数信号量可以用计数值表示剩余资源数量。初始值为3,车辆进入时技术值减少1,车辆离开时计数值增加1. + +互斥量主要用于保护临界区,适合解决同一时刻只允许一个线程访问共享资源的问题。如果使用互斥量,只能表示“是否有线程正在访问”,不能自然表示“当前还有几个车位”。因此,本实验应使用计数信号量来控制车位数量,同时使用互斥量保护共享变量统计 + + + +# 练习二:多窗口售票系统 + +本实验通过模拟两个售票窗口同时出售同一批车票的场景,学习互斥量的使用方法,理解多线程并发访问共享变量时可能产生的竞态问题 + +两个售票线程共同出售20张票,每次收票都需要检查余票、记录票号并修改剩余票数,通过对比是否使用互斥量,观察共享变量在并发访问时的安全性差异 + +### 实验原理 + +车票数量ticket_count是两个售票线程共同访问的全局变量。每个窗口售票时都需要执行以下操作: + +1.判断是否还有余票 + +2.读取当前票号 + +3.将剩余票数减少1 + +4.打印售票结果 + +这些操作应当作为一个完整的临界区处理,如果没有互斥保护,两个线程可能同时读取到相同的余票值,从而导致重复售票、余票统计错误等问题。因此,实验中使用互斥量ticket_mutex保护完整售票过程,保证同一时刻只有一个窗口线程能够修改ticket_count + +### 实验过程 + +**编写MSH命令入口** + +在程序中定义 ticket_demo 函数作为实验入口,并使用 MSH_CMD_EXPORT导出命令: + +``` +MSH_CMD_EXPORT(ticket_demo, ticket sale demo); +``` + +程序下载后,在串口 MSH 终端输入以下命令启动实验: + +``` +ticket_demo +``` + +**创建互斥量** + +正式实验中,将宏设置为: + +``` +#define TICKET_USE_MUTEX 1 +``` + +程序运行后创建互斥量 ticket_mutex,用于保护售票临界区 + +**创建售票线程** + +程序创建两个售票线程:window A,window B + +两个线程共同访问全局变量ticket_count,模拟两个窗口同时售票 + +**执行售票过程** + +每个售票线程循环执行以下流程: + +1.获取互斥量 + +2.判断是否还有余票 + +3.读取当前票号 + +4.将ticket_count减少1 + +5.打印售票窗口和票号 + +6.释放互斥量 + +7.延时后继续下一轮售票 + +当ticket_count<=0时,线程退出 + +**等待线程结束** + +程序中使用完成信号量等待两个售票线程结束,两个窗口线程都退出后,主命令函数删除互斥量和完成信号量,并打印最终结果 + +**对比实验** + +为了观察不使用互斥量时的风险,将宏修改为: + +``` +#define TICKET_USE_MUTEX 0 +``` + +重新编译并下载程序,再次输入: + +``` +ticket_demo +``` + +观察不加互斥量时的运行结果 + +**实验结果** + +**使用互斥量的运行结果**:TICKET_USE_MUTEX设置为1 + +![](D:\TYPORA\figures\image-20260819150611545.png) + +从结果可以看出,20张票全部售出,票号从20到1,没有重复票号,最终剩余票数为0 + +**不使用互斥量的运行结果**:TICKET_USE_MUTEX设置为0 + +![image-20260819150625868](D:\TYPORA\figures\image-20260819150625868.png) + +不加互斥量运行时,串口输出中暂时没有观察到重复票号或余票小于0的现象。但这只能说明本次线程调度下没有触发错误,不能证明程序是线程安全的 + +**结果分析** + +在使用互斥量的正式实验中,两个售票线程在访问ticket_count前必须先获取ticket_mutex。因此,同一时刻只有一个线程能够执行检查余票、读取票号和修改余票的完整售票过程,避免了两个线程同时修改共享变量造成的数据错误 + +在不适用互斥量的对比实验中,虽然本次运行没有出现模型错误,但从程序逻辑上看,ticket_count的读取、判断和修改并不是一个原子操作。如果两个线程在相近时间读取到同一个票数,就可能出现重复售票或余票统计错误。因此,不加互斥量的程序存在竞争条件,只是本次运行没有复现 + +### 思考题 + +**为什么只给 `ticket_count--` 加锁仍可能不安全?** + +因为售票过程不只是 ticket_count--这一条语句,还包括检查是否有票、读取当前票号、修改剩余票数和打印售票结果 + +如果只对 ticket_count-- 加锁,而没有保护完整流程,可能出现以下情况: + +1. 线程 A 判断还有余票 +2. 线程 B 也判断还有余票 +3. 两个线程读取到相同票号 +4. 虽然后续减票操作加锁了,但重复票号已经产生 + +因此,必须将“检查余票、读取票号、修改余票”作为一个完整临界区进行保护,而不是只保护单独的减 1 操作 + + + +# 练习三:系统启动条件检查 + +本实验通过模拟设备启动前的模块初始化过程,学习事件集的使用方法,理解多个线程分别完成不同任务后,如何由主业务线程统一等待全部条件满足 + +要求网络模块、传感器模块和存储模块分别完成初始化,只有三个模块全部就绪后,主业务线程才能启动。通过该实验验证事件集适合用于多个事件条件的同步等待 + +### 实验原理 + +事件集是一种线程间同步机制,可以用若干个事件位表示不同状态。每个初始化线程完成后,向事件集发送对应的就绪事件;主业务线程则等待多个事件全部到达 + +本实验定义三个事件位:EVENT_NET_READY/EVENT_SENSOR_READY/EVENT_STORAGE_READY + +主业务线程使用AND模式等待三个事件位全部置位。这样只有当网络、传感器和存储模块都准备完成后,业务线程才会继续执行。为了实现超时检测,主业务线程设置3秒等待时间。如果存储模块初始化时间过长,主业务线程会先超时返回,并打印尚未完成的模块;随后继续等待,直到所有模块全部就绪 + +### 实验过程 + +**编写MSH命令入口** + +在程序中定义startup_demo函数作为实验入口,并使用MSH_CMD_EXPORT到处命令: + +``` +MSH_CMD_EXPORT(startup_demo,startup confition check demo); +``` + +程序下载后,在串口MSH终端输入以下命令启动实验: + +``` +startup_demo +``` + +**创建事件集和互斥量** + +程序启动后先创建事件集startup_event,用于保护各模块的就绪状态。同时创建互斥量state_mutex,用于保护共享变量ready_flags,避免多个线程同时读写状态时出现错误 + +**创建初始化线程** + +程序创建三个初始化线程,分别模拟三个独立模块的初始化过程: +网络初始化线程:延时1秒后发送网络就绪事件 + +传感器初始化线程:延时2秒后发送传感器就绪事件 + +存储初始化线程:延时5秒后发送存储就绪事件 + +每个线程在完成初始化后,先记录本模块就绪状态,再向事件集发送对应事件位 + +**创建主业务线程** + +主业务线程使用rt_event_recv的AND模块等待三个事件全部到达,并设置3秒超时。当等待超时时,主业务线程会检查当前已完成的模块,并打印尚未完成的模块名称,当三个事件全部到达时,主业务线程打印: + +``` +all modules are ready +business task strated +``` + +**实验结果** + +串口终端输出如下: + +![image-20260819155711526](D:\TYPORA\figures\image-20260819155711526.png) + +从结果可以看出: + +1.网络模块先完成初始化 + +2.传感器模块随后完成初始化 + +3.主业务线程在3秒内未等到存储模块,因此发生超时 + +4.存储模块最终完成初始化 + +5.三个模块全部就绪后,主业务线程继续执行 + +**结果分析** + +本实验中,三个初始化线程分别模拟三个独立模块的启动过程 + +主业务线程不依赖单个模块完成,而是等待三个事件全部到达,者体现了事件集在多条件同步中的作用 + +实验中设置了存储模块5秒延时,而主业务线程只等待3秒,英雌第一次等待会超时。超时后,程序打印尚未完成的模块,便于观察启动状态。待存储模块完成初始化后,事件集中的三个事件位全部置位,主业务线程成功继续执行 + +### 思考题 + +**如果用三个独立信号实现这个功能,与使用事件集相比有什么区别** + +如果使用三个独立信号量,也可以实现等待三个模块完成初始化,但实现方式更复杂。 + +区别主要有: + +**1.表达能力不同** + +事件集可以用一个对象同时表示多个事件状态,适合“多个条件同时满足”的等待场景;信号量更适合表示资源数量或单一同步事件 + +**2.状态查询不同** + +事件集支持按位组合,可以直接判断哪些模块已就绪;独立信号量只能一个一个等待,难以直接统一判断整体状态 + +**3.使用方式不同** + +事件集更适合本实验这种“多个模块全部完成后再启动业务”的场景;三个信号量虽然也能实现,但代码更分散,逻辑不如事件集集中 + + + +# 四、快递分拣中心 + +本实验通过模拟快递分拣中心的收件和分拣过程,学习消息队列的使用方法,理解线程之间如何传递结构体类型的数据 + +实验要求两个发件线程不断产生快递信息,一个分拣线程从消息队列中接收快递消息,并按照目的地区域进行统计。通过实验验证消息队列适合用于线程间传递数据信息 + +### 实验原理 + +消息队列是一种线程间通信机制,可以在线程之间传递固定大小的数据块。本实验中,每条快递信息使用结构体package_msg表示: + +``` +struct package_msg +{ + rt_uint32_t id; + rt_uint8_t region; + rt_uint16_t weight; +}; +``` + +其中,id表示快递编号,region表示目的地区域,weight表示快递重量 + +两个发送线程分别产生快递消息,并通过rt_mg_send将消息发送到消息队列中。分拣线程通过rt_mg_recv从消息队列中接收消息,根据区域统计数量,并累计总重量 + +为了同质分拣线程停止接收,发送线程收到结束消息后,打印统计结果并退出 + +### 实验过程 + +**定义消息结构体** + +在程序中定义快递消息结构体: + +``` +struct package_msg +{ + rt_uint32_t id; + rt_uint8_t region; + rt_uint16_t weight; +}; +``` + +**创建消息队列** + +重新创建两个发件线程: + +发送线程A:产生编号1001到1005的快递 + +发送线程B:产生编号2001到2005的快递 + +每个发件线程产生5条消息,并调用rt_mg_send发送到消息队列;如果队列已满,rt_mg_send会返回失败,程序记录发送失败次数,并打印发送失败信息 + +**创建分拣线程** + +程序创建一个分拣线程,分拣线程不断调用rt_mg_recv接收消息队列中的快递消息。每收到一条普通快递消息,分拣线程就打印快递编号、区域和重量,并更新统计数据 + +区域对应关系如下: + +region=1:east + +region=2:south + +region=3:north + +**发送结束消息** + +两个发件线程都完成后,程序向消息队列发送一条结束消息。结束消息的编号为0,区域标志为PACKAGE_END_REGION。分拣线程收到该结束消息后不再继续接收快递,转而打印统计结果并退出 + +**实验结果** + +![image-20260819165949131](D:\TYPORA\figures\image-20260819165949131.png) + +从结果可以看出: + +1.共接收到10条快递消息 + +2.快递编号从1001到1005、2001到2005,没有重复 + +3.华东区域3件,华南区域4件,华北区域3件 + +4.总重量为9780g + +5.本次运行中消息发送失败次数为0 + +6.分拣线程完成统计后正常退出 + +**结果分析** + +本实验中,两个发件线程同时向消息队列发送快递信息,分拣线程从消息队列中接收并处理。消息队列在这里起到了线程间数据传递的作用,使发件线程和分拣线程之间不需要直接共享复杂数据 + +由于消息队列容量为 5,当发送速度快于接收速度时,理论上可能出现队列已满导致发送失败的情况。因此程序中对 rt_mq_send 的返回值进行了判断,并统计发送失败次数。本次运行中 send failed为 0,说明消息队列在本次调度下没有发生满队列发送失败 + +实验结果中,快递消息的输出顺序可能与发送顺序不完全一致,这是因为两个发件线程并发运行,线程调度顺序会影响消息进入队列的先后顺序。但最终统计总数、区域数量和总重量均正确,说明分拣线程正确接收并处理了消息队列中的数据 + diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817112957813.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817112957813.png" new file mode 100644 index 0000000000000000000000000000000000000000..8cbefd2821fc003691fc15a62e6fc8b10e3fa467 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817112957813.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817113502159.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817113502159.png" new file mode 100644 index 0000000000000000000000000000000000000000..685d7fb5b5eeefc01cfad53b85e4cac38945469b Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817113502159.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817142648941.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817142648941.png" new file mode 100644 index 0000000000000000000000000000000000000000..4bf38e6b886dfa690e5a7d726f15856157c6115b Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817142648941.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817143835258.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817143835258.png" new file mode 100644 index 0000000000000000000000000000000000000000..2ca7c09e48ba4d65780d5a1a5792b9c101bc3ecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817143835258.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817144051657.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817144051657.png" new file mode 100644 index 0000000000000000000000000000000000000000..b3b6900b033d2ba826f94883eab89d955ede7434 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817144051657.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817150046870.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817150046870.png" new file mode 100644 index 0000000000000000000000000000000000000000..95ab187ec4ddb3bd3eb788ab13f0dea61a728a80 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817150046870.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817150446388.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817150446388.png" new file mode 100644 index 0000000000000000000000000000000000000000..c0435456a9dbaaf4aa0dbb0f6c12ccc6d3230ecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817150446388.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817151244692.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817151244692.png" new file mode 100644 index 0000000000000000000000000000000000000000..adf1c1cd27e5acbf0b9d5aa20a8ffebf8f0fbdc5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817151244692.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817152048721.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817152048721.png" new file mode 100644 index 0000000000000000000000000000000000000000..4e39cef8d61f44e369319918be0b95fc35beace8 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817152048721.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817152317118.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817152317118.png" new file mode 100644 index 0000000000000000000000000000000000000000..74f66f4df025334e505c57b42daffa5aa8db5d48 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260817152317118.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818140556194.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818140556194.png" new file mode 100644 index 0000000000000000000000000000000000000000..35ad6963fe9d9e24b90b02a92da4a88996349be1 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818140556194.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818164439722.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818164439722.png" new file mode 100644 index 0000000000000000000000000000000000000000..a7a945d850b8166e44fe27032c825f6fc4120d9e Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818164439722.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818202039012.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818202039012.png" new file mode 100644 index 0000000000000000000000000000000000000000..8aeb7b88e692feaf17ef61fcf1f8480a5987806a Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818202039012.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818210556117.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818210556117.png" new file mode 100644 index 0000000000000000000000000000000000000000..c22ddb4cc9edf0f30552b564c6c478f4de57f996 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818210556117.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818210605960.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818210605960.png" new file mode 100644 index 0000000000000000000000000000000000000000..c22ddb4cc9edf0f30552b564c6c478f4de57f996 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818210605960.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818210732275.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818210732275.png" new file mode 100644 index 0000000000000000000000000000000000000000..af7b05423b82c2281ec468ea8cd1ced2e2e4a3c5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818210732275.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818210821589.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818210821589.png" new file mode 100644 index 0000000000000000000000000000000000000000..4a0f90d7a951c426897f02ccb2eac4a0982376a5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818210821589.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818211005741.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818211005741.png" new file mode 100644 index 0000000000000000000000000000000000000000..ff0da8904baeebbbd649d90ffadf5181b08d7389 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818211005741.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818211045732.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818211045732.png" new file mode 100644 index 0000000000000000000000000000000000000000..6e56fc96a1b0a365e022e9f933be18b720ee294a Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/image-20260818211045732.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/rtt_startup.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/rtt_startup.png" new file mode 100644 index 0000000000000000000000000000000000000000..04dbb79fed05b7463c5ceea179f5dd75c6553724 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/rtt_startup.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" new file mode 100644 index 0000000000000000000000000000000000000000..800ec298cc4dd2fa7599d475a0c8f3bf52a3eecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" new file mode 100644 index 0000000000000000000000000000000000000000..95e8ab4ef99114778b540f5d2755243bfb511a95 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" new file mode 100644 index 0000000000000000000000000000000000000000..e4fb0f0ce5fae09fda464fe2b060422cbe7ad598 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/thread_study.c" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/thread_study.c" new file mode 100644 index 0000000000000000000000000000000000000000..ef71e55e786bbf27c1df1351f2dfb425a9ebdc66 --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/thread_study.c" @@ -0,0 +1,252 @@ +#include +#include +#include + +#define LED_R_PIN GET_PIN(F, 12) +#define LED_B_PIN GET_PIN(F, 11) + +/* Spark-1: LEFT key = PC0, pressed = low level */ +#define KEY_LEFT_PIN GET_PIN(C, 0) + +#define LED_ON PIN_LOW +#define LED_OFF PIN_HIGH + +static rt_thread_t th_led1 = RT_NULL; +static rt_thread_t th_monitor = RT_NULL; + +static struct rt_thread th_led2; +static rt_uint8_t th_led2_stack[1024]; + +static struct rt_semaphore led1_sem; +static struct rt_semaphore key_sem; + +static volatile rt_bool_t led1_pause_requested = RT_FALSE; +static volatile rt_bool_t led1_waiting = RT_FALSE; + +static rt_tick_t key_last_tick = 0; + +static const char *thread_state_name(rt_uint8_t stat) +{ + switch (stat & RT_THREAD_STAT_MASK) + { + case RT_THREAD_INIT: return "INIT"; + case RT_THREAD_READY: return "READY"; + case RT_THREAD_RUNNING: return "RUNNING"; + case RT_THREAD_SUSPEND: return "SUSPEND"; + case RT_THREAD_CLOSE: return "CLOSE"; + default: return "UNKNOWN"; + } +} + +static rt_uint32_t get_stack_free(rt_thread_t thread) +{ + rt_uint32_t i = 0; + rt_uint8_t *stack; + + if (thread == RT_NULL || thread->stack_addr == RT_NULL || thread->stack_size == 0) + { + return 0; + } + + stack = (rt_uint8_t *)thread->stack_addr; + + while (i < thread->stack_size && stack[i] == '#') + { + i++; + } + + return i; +} + +static void key_irq_cb(void *args) +{ + RT_UNUSED(args); + + rt_sem_release(&key_sem); +} + +static void led1_entry(void *parameter) +{ + rt_uint32_t count = 0; + rt_uint8_t led_state = LED_OFF; + + RT_UNUSED(parameter); + + while (1) + { + if (led1_pause_requested) + { + rt_pin_write(LED_R_PIN, LED_OFF); + led1_waiting = RT_TRUE; + + // rt_kprintf("[th_led1] wait semaphore, LED_R paused\r\n"); + + rt_sem_take(&led1_sem, RT_WAITING_FOREVER); + + led1_waiting = RT_FALSE; + led1_pause_requested = RT_FALSE; + + // rt_kprintf("[th_led1] semaphore released, LED_R resume\r\n"); + } + + led_state = (led_state == LED_OFF) ? LED_ON : LED_OFF; + rt_pin_write(LED_R_PIN, led_state); + + count++; + // rt_kprintf("[th_led1] count=%u tick=%lu\r\n", + // count, + // (unsigned long)rt_tick_get()); + + rt_thread_mdelay(500); + } +} + +static void led2_entry(void *parameter) +{ + rt_uint32_t count = 0; + rt_uint8_t led_state = LED_OFF; + + RT_UNUSED(parameter); + + while (1) + { + led_state = (led_state == LED_OFF) ? LED_ON : LED_OFF; + rt_pin_write(LED_B_PIN, led_state); + + count++; + // rt_kprintf("[th_led2] count=%u\r\n", count); + + rt_thread_mdelay(500); + } +} + +static void thread_dump_one(const char *name, rt_thread_t thread) +{ + if (thread == RT_NULL) + { + rt_kprintf("[%s] NULL\r\n", name); + return; + } + + rt_kprintf("[%s] stat=%s(0x%02x) stack_free=%u stack_size=%u\r\n", + name, + thread_state_name(thread->stat), + thread->stat & RT_THREAD_STAT_MASK, + get_stack_free(thread), + thread->stack_size); +} + +static void handle_key_event(void) +{ + rt_tick_t now = rt_tick_get(); + + if ((now - key_last_tick) < rt_tick_from_millisecond(200)) + { + return; + } + key_last_tick = now; + + if (!led1_pause_requested && !led1_waiting) + { + led1_pause_requested = RT_TRUE; + rt_kprintf("[key] LEFT pressed, request pause th_led1\r\n"); + } + else if (led1_waiting) + { + rt_sem_release(&led1_sem); + rt_kprintf("[key] LEFT pressed, release semaphore for th_led1\r\n"); + } + else + { + rt_kprintf("[key] LEFT pressed, th_led1 is preparing to pause\r\n"); + } +} + +static void monitor_entry(void *parameter) +{ + RT_UNUSED(parameter); + + while (1) + { + if (rt_sem_take(&key_sem, rt_tick_from_millisecond(2000)) == RT_EOK) + { + handle_key_event(); + } + + thread_dump_one("th_led1", th_led1); + thread_dump_one("th_led2", (rt_thread_t)&th_led2); + thread_dump_one("th_monitor", th_monitor); + } +} + +static int thread_dump(int argc, char **argv) +{ + RT_UNUSED(argc); + RT_UNUSED(argv); + + rt_kprintf("===== thread dump =====\r\n"); + thread_dump_one("th_led1", th_led1); + thread_dump_one("th_led2", (rt_thread_t)&th_led2); + thread_dump_one("th_monitor", th_monitor); + rt_kprintf("=======================\r\n"); + + return 0; +} +MSH_CMD_EXPORT(thread_dump, show thread status and stack space); + +static int thread_study_init(void) +{ + rt_pin_mode(LED_R_PIN, PIN_MODE_OUTPUT); + rt_pin_mode(LED_B_PIN, PIN_MODE_OUTPUT); + rt_pin_write(LED_R_PIN, LED_OFF); + rt_pin_write(LED_B_PIN, LED_OFF); + + rt_sem_init(&led1_sem, "led1sem", 0, RT_IPC_FLAG_FIFO); + rt_sem_init(&key_sem, "keysem", 0, RT_IPC_FLAG_FIFO); + + rt_pin_mode(KEY_LEFT_PIN, PIN_MODE_INPUT_PULLUP); + rt_pin_attach_irq(KEY_LEFT_PIN, PIN_IRQ_MODE_FALLING, key_irq_cb, RT_NULL); + rt_pin_irq_enable(KEY_LEFT_PIN, PIN_IRQ_ENABLE); + + th_led1 = rt_thread_create("th_led1", + led1_entry, + RT_NULL, + 1024, + 16, + 5); + if (th_led1 == RT_NULL) + { + rt_kprintf("th_led1 create failed\r\n"); + return -RT_ERROR; + } + + rt_thread_init(&th_led2, + "th_led2", + led2_entry, + RT_NULL, + th_led2_stack, + sizeof(th_led2_stack), + 16, + 5); + + th_monitor = rt_thread_create("th_monitor", + monitor_entry, + RT_NULL, + 1024, + 10, + 5); + if (th_monitor == RT_NULL) + { + rt_kprintf("th_monitor create failed\r\n"); + return -RT_ERROR; + } + + rt_thread_startup(th_led1); + rt_thread_startup(&th_led2); + rt_thread_startup(th_monitor); + + rt_kprintf("thread study init done, press LEFT key to pause/resume th_led1\r\n"); + + return RT_EOK; +} +INIT_APP_EXPORT(thread_study_init); diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/\345\256\236\351\252\214\346\212\245\345\221\212.md" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/\345\256\236\351\252\214\346\212\245\345\221\212.md" new file mode 100644 index 0000000000000000000000000000000000000000..57b9e5520a90540a76b3622611cfbce7b1796731 --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/\345\256\236\351\252\214\346\212\245\345\221\212.md" @@ -0,0 +1,156 @@ +# 一、实验目的 + +基于RT-Thread操作系统和STM32F407星火一号开发板,完成多线程创建、线程调度、线程状态查看、按键控制 + +# 二、实验任务 + +本实验主要实现三个线程 + +| 线程名称 | 创建方式 | 优先级 | 时间片 | 栈大小 | 功能 | +| ---------- | ---------- | ------ | ------ | --------- | ----------------------------------------------- | +| th_led1 | 动态创建 | 16 | 5ticks | 1024Bytes | 翻转LED_R,并打印计数和系统tick | +| th_led2 | 静态初始化 | 16 | 5ticks | 1024Bytes | 翻转LED_B,并打印计数 | +| th_monitor | 动态创建 | 10 | 5ticks | 1024Bytes | 检测按键,控制th_led1暂停和恢复,并查看线程状态 | + +其中,th_monitor的优先级为10,高于两个LED工作线程的优先级16,因此当按键时间发生时,监控线程能够优先响应 + +# 三、程序设计思路 + +### 3.1动态线程th_led1 + +th_led1使用rt_thread_create()动态创建,线程栈由系统动态分配。该线程循环翻转LED_R,每次翻转后打印当前计数值和rt_tick_get()获取到的系统tick值 + +当按键触发暂停请求后,th_led1会主动关闭LED_R,并调用rt_sem_take()等信号量。此时线程进入等待状态,不再继续翻转LED_R + +### 3.2静态线程th_led2 + +th_led2使用rt_thread_init()静态初始化,线程控制块和线程栈均定义为全局变量。该线程循环翻转LED_B,并在串口中打印当前计数值 + +与动态线程不同,静态线程的TCB和栈空间在编译阶段已经确定,不需要运行时动态申请内存,因此更适合一些对稳定性要求较高的场景 + +### 3.3监控线程th_monitor + +th_monitor使用rt_thread_create()动态创建,优先级设置为10.该线程负责检测LEFT按键触发时间,并根据当前状态控制th_led1暂停或恢复 + +在本次实验中,原本任务要求中提到使用rt_thread_suspend()和rt_thread_resume()控制线程。但是在当前版本中源码说明rt_thread_suspend()只能用于挂起当前线程自身,即: + +``` +rt_thread_suspend(rt_thread_self()); +``` + +因此本实验没有让监控线程直接挂起th_led1,而是采用信号量方式实现控制: + +第一次按下LEFT按键:设置暂停请求,th_led1自身进入信号量等待状态 + +第二次按下LEFT按键:释放信号量,使th_led1从等待状态恢复运行 + +这种方式符合当前 RT-Thread 版本的使用限制,也能实现按键控制线程暂停和恢复的实验效果 + +### 4.4 自动初始化与命令导出 + +本实验使用 INIT_APP_EXPORT(thread_study_init) 将实验初始化函数注册到 RT-Thread 自动初始化流程中。系统启动后会自动执行该初始化函数,不需要在 main.c 中手动调用。 + +同时,实验使用 MSH_CMD_EXPORT() 导出了线程查看命令,例如: + +``` +MSH_CMD_EXPORT(thread_dump, show thread status and stack space); +``` + +通过 FinSH/MSH 输入 thread_dump,可以查看当前线程状态、优先级、栈大小、栈使用情况等信息 + +## 5. 实验现象 + +### 5.1 程序运行初始现象 + +程序烧录运行后,`th_led1` 和 `th_led2` 同时启动。两个 LED 工作线程优先级相同,时间片相同,因此可以看到两个 LED 以相近频率闪烁。 + +![image-20260818210605960](D:\TYPORA\figures\image-20260818210605960.png) + +图中可以看到开发板上两个 LED 同时处于闪烁工作状态,说明动态创建的 `th_led1` 和静态初始化的 `th_led2` 都已经正常运行 + +### 5.2 按下 LEFT 按键后的现象 + +第一次按下 LEFT 按键后,串口输出: + +``` +[key] LEFT pressed, request pause th_led1 +[th_led1] wait semaphore, LED_R paused +``` + +此时 th_led1接收到暂停请求后进入信号量等待状态,LED_R 停止闪烁;th_led2不受影响,继续翻转 LED_B + +![image-20260818210732275](D:\TYPORA\figures\image-20260818210732275.png) + +该现象说明按键中断能够正常触发,监控线程能够正确处理按键事件,并通过信号量机制控制 th_led1 暂停 + +### 5.3 再次按下 LEFT 按键后的现 + +再次按下 LEFT 按键后,串口输出: + +``` +[key] LEFT pressed, release semaphore for th_led1 +[th_led1] semaphore released, LED_R resume +``` + +此时 th_monitor 释放信号量,th_led1从等待状态恢复运行,LED_R 重新开始闪烁 + +该现象说明信号量释放后,等待中的线程能够被唤醒,线程恢复执行 + +## 6. 串口输出分析 + +![image-20260818210821589](D:\TYPORA\figures\image-20260818210821589.png) + +从串口输出可以看到: + +``` +[th_led1] count=10 tick=7121 +[th_led2] count=16 +``` + +其中,count表示线程循环执行次数,也可以理解为 LED 翻转次数的计数。tick表示系统当前 tick 值,由 rt_tick_get() 获取,用于观察系统运行时间 + +串口中还输出了线程状态和栈空间信息,例如: + +``` +[th_led1] stat=SUSPEND(0x02) stack_free=780 stack_size=1024 +[th_led2] stat=SUSPEND(0x02) stack_free=776 stack_size=1024 +[th_monitor] stat=RUNNING(0x03) stack_free=756 stack_size=1024 +``` + +其中: + +stat表示线程当前状态 + +stack_size表示线程栈总大小 + +stack_free 表示线程当前剩余栈空间 + +stack_free可用于判断线程栈是否足够,避免线程栈溢出 + +例如 th_led1 的 stack_size=1024,stack_free=780,说明该线程大约使用了 1024 - 780 = 244字节栈空间,栈空间仍然比较充足 + +## 7. 线程状态查看 + +![image-20260818211005741](D:\TYPORA\figures\image-20260818211005741.png) + +![image-20260818211045732](D:\TYPORA\figures\image-20260818211045732.png) + +可以查看当前系统中的线程信息,包括线程名、优先级、状态、栈大小、最大栈使用率、剩余 tick 等 + +截图中可以看到 th_led1、th_led2、th_monitor 等线程已经创建成功。其中 th_led1 和 th_led2 多数情况下显示为 suspend,这是正常现象。原因是两个 LED 线程每次翻转 LED 后都会调用 rt_thread_mdelay() 进行延时,因此在查看线程状态的瞬间,线程大概率处于延时等待状态 + +当第一次按下 LEFT 按键后,th_led1会等待信号量,因此保持在挂起状态;再次按下 LEFT 按键后,信号量被释放,th_led1恢复运行,然后继续周期性闪烁 + +## 8. 实验结果总结 + +本实验完成了 RT-Thread 多线程编程的基本要求: + +1. 使用 rt_thread_create()动态创建了 th_led1线程 +2. 使用 rt_thread_init()静态初始化了 th_led2线程 +3. 使用动态线程 th_monitor实现按键检测和线程控制 +4. 使用信号量实现了 th_led1的暂停与恢复 +5. 使用 INIT_APP_EXPORT()实现模块自动初始化 +6. 使用 MSH_CMD_EXPORT()导出了自定义线程查看命令 +7. 通过串口输出和开发板 LED 现象验证了程序运行结果 + +实验结果表明,RT-Thread 可以通过线程优先级、时间片和 IPC 机制实现多个任务的并发运行和同步控制。在 STM32F407 单核处理器上,同一时刻只有一个线程真正占用 CPU,但由于系统调度器能够快速切换线程,因此从现象上可以看到多个 LED 任务同时运行 \ No newline at end of file diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232.md" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..1291047c4dbbb1b427d41b65c9ef7db6670726d8 --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232.md" @@ -0,0 +1,362 @@ +# 一、STM32F407启动流程 + +### 1.启动文件进入RT-Thread + +启动文件startup_xx.s根据不同编译器进入不同函数: + +``` +MDK:$Sub$$main() +IAR:_low_level_init() +GCC:entry() +``` + +这些函数最终都会进入 rtthread_startup() + +``` +上电复位 -> 启动文件 -> 编译器相关入口 -> rtthread_startup() +``` + +### 2.关闭中断, 进入系统启动阶段 + +进入rtthread_startup()后,系统首先执行 + +``` +rt_hw_interrupt_disable(); +``` + +作用是暂时关闭中断,防止系统初始化过程中被中断打断,之后开始执行板级初始化和RT-Thread内核初始化 + +### 3.板级硬件初始化 + +主要执行: + +``` +rt_hw_board_init(); +``` + +这个函数负责初始化与具体硬件平台有关的内容,例如:系统时钟、串口、SysTick、GPIO、堆内存、中断控制器、板级外设。 + +接着执行: + +``` +rt_components_board_init(); +``` + +该函数会调用通过INIT_BOARD_EXPORT()注册的板级初始化函数 + +### 4.RT-Thread内核基础初始化 + +板级初始化完成后,系统会继续执行: + +``` +rt_show_version() #显示RT-Thread版本信息 +rt_system_timer_init() #初始化系统定时器 +rt_system_scheduler_init() #初始化线程调度器 +rt_system_signal_init() #初始化信号机制 +``` + +### 5.创建main线程 + +接下来执行: + +``` +rt_application_init(); +``` + +该函数内部会初始化main线程: + +``` +rt_thread_init(main_thread,main_thread_entry,...); +``` + +此时系统并不是直接执行用户写的main()函数,而是先创建一个名为main_thread的RT-Thread线程。main_thread_entry()是RT-Thread对用户main()函数的封装 + +### 6.创建定时器线程和空闲线程 + +系统随后创建两个重要的系统线程 + +**定时器线程** + +``` +rt_system_timer_thread_init(); +``` + +内部初始化 + +``` +rt_thread_init(rt_thread_timer_entry); +``` + +定时器线程用于处理系统中的软件定时器和线程延时等功能 + +**空闲线程** + +``` +rt_thread_idle_init(); +``` + +内部初始化 + +``` +rt_thread_init(rt_thread_idle_entry); +``` + +空闲线程在系统没有其他就绪线程时运行,通常用于:处理空闲任务,执行空闲钩子函数,进行资源回收。进入低功耗模式 + +### 7.启动调度器并选择线程 + +完成各类线程初始化后,系统执行: + +``` +rt_system_scheduler_start(); +``` + +这一步表示正式启动RT-Thread调度器 + +调度器会根据线程的优先级和时间片选择需要运行的线程,可能运行: + +``` +main_thread_entry() +rt_thread_timer_entry() +rt_thread_idle_entry() +其他用户线程 +``` + +需要注意: + +``` +rt_system_scheduler_init() #是初始化调度器 +rt_system_scheduler_start() #是真正的启动调度器 +``` + +### 8.执行组件初始化并进入main() + +调度器启动后,系统首先可能运行main_thread_entry() + +在main_thread_entry()中,通常会执行: + +``` +rt_components_init(); +``` + +该函数会按照初始化顺序执行自动注册的初始化函数 + +对应的初始化宏主要包括: + +``` +INIT_PREV_EXPORT() +INIT_DEVICE_EXPORT() +INIT_COMPONENT_EXPORT() +INIT_ENV_EXPORT() +INIT_APP_EXPORT() +``` + +组件初始化完成后,才会进入用户编写的main(),然后开始执行应用程序。例如: + +``` +int main(void) +{ + while(1) + { + //用户应用任务 + } +} +``` + + + +**RT-Thread的核心启动流程可以概括为:** + +``` +rtthread_startup() +{ + rt_hw_board_init(); # 板级硬件初始化 + + rt_system_timer_init(); # 系统定时器初始化 + rt_system_scheduler_init(); # 调度器初始化 + + rt_application_init(); # 创建 main 线程 + + rt_system_timer_thread_init(); # 定时器线程初始化 + rt_thread_idle_init(); # 空闲线程初始化 + + rt_system_scheduler_start(); # 启动调度器 +} +``` + +启动调度器以后,系统会根据线程优先级选择需要运行的线程,对于单核STM32F407,同一时刻实际只有一个线程占用CPU,但系统通过快速的上下文切换实现多线程并发执行的效果 + + + +# 二、RT-Thread引导机制 + +RT-Thread 的引导机制核心是“自动初始化”。也就是说,系统启动时不需要在 main() 里手动逐个调用各模块初始化函数,而是通过初始化宏把函数注册到对应的初始化表中,系统在启动过程中按顺序自动执行。 + +### 1. 自动初始化的基本思想 + +RT-Thread 将不同阶段的初始化函数分成多个层次,例如:板级初始化、设备初始化、组件初始化、环境初始化、应用初始化 + +这样做的好处是:各模块职责清晰、初始化顺序明确、不需要在main()中手动堆叠大量初始化代码、便于移植和维护 + +### 2.常见自动初始化宏 + +``` +INIT_BOARD_EXPORT() +INIT_PREV_EXPORT() +INIT_DEVICE_EXPORT() +INIT_COMPONENT_EXPORT() +INIT_ENV_EXPORT() +INIT_APP_EXPORT() +``` + +这些宏的作用是把对应的初始化函数注册到指定的初始化段中,系统启动后统一扫描并执行 + +### 3.INIT_BOARD_EXPORT()的使用 + +INIT_BOARD_EXPORT()用于板级初始化阶段,通常在内核完成启动之前执行,适合放置:时钟初始化、串口初始化、GPIO初始化、板载外设初始化。这类初始化和具体硬件平台关系最密切,因此放在最早阶段执行 + +### 4.INIT_APP_EXPORT()的使用 + +INIT_APP_EXPORT()用于应用初始化阶段。它通常在系统线程已经建立、调度器已经启动之后执行,适合放置:用户功能模块初始化、测试任务初始化、应用线程创建、业务逻辑入口 + +### 5.自动初始化原理 + +自动初始化的本质是: + +5.1使用宏把初始化函数转换成函数指针 + +5.2将函数指针放入指定链接段 + +5.3系统启动时遍历这些链接段 + +5.4依次调用对应初始化函数 + +因此,自动初始化不是“自动寻找函数”,而是“启动时遍历预先注册好的函数表” + + + +# 三、内核基础与对象模型 + +### 1.RT-Thread的对象化设计 + +RT-Thread虽然主要使用C语言编写,但它采用了类似面向对象的设计思想。线程、信号量、互斥量、事件、邮箱、消息队列、定时器等,都被抽象成统一管理的内核对象,这种设计的优点是:统一管理、便于调试、便于扩展、对不同内核对象使用相似的管理机制 + +### 2.线程控制块 + +线程在RT-Thread中由线程控制块struct rt_thread描述,它保存了线程运行所需的关键状态信息,例如: + +| 成员 | 作用 | +| ---------------- | ------------------------ | +| stat | 表示线程当前状态 | +| current_priority | 表示线程当前优先级 | +| init_tick | 表示线程初始化时的时间片 | +| sp | 保存线程当前栈指针 | +| stack_addr | 线程栈起始地址 | +| stack_size | 线程栈大小 | +| entry | 线程入口函数 | +| parameter | 线程入口参数 | + +其中,sp最重要。线程切换时,系统通过保存和恢复栈指针来完成上下文切换 + +### 3.内存分配方式 + +**静态线程rt_thread_init()** + +静态线程的控制块和栈空间在编译期就已经分配好,通常定义在全局区或静态区 + +优点:内存分配确定,不依赖动态堆,运行更稳定,适合高可靠场景 + +缺点:不够灵活,占用的资源在编译时就固定下来 + +**动态线程rt_thread_create()** + +动态线程由系统从堆中分配控制块和栈空间 + +优点:使用灵活,线程可以按需创建和删除,适合功能变化较多的场景 + +缺点:依赖动态内存,可能出现申请失败,长期运行可能引入内存碎片 + +### 4.高可靠场景常用静态线程 + +4.1避免运行时内存申请失败 + +4.2减少内存碎片 + +4.3资源占用可提前估算 + +4.4系统行为更可控 + +4.5更容易通过可靠性测试 + + + +# 四、线程状态机与调度算法 + +### 1.线程五态 + +RT-Thread线程通常由五种状态: + +| 状态 | 含义 | +| ------ | -------------------------- | +| 初始态 | 线程已创建,但尚未启动 | +| 就绪态 | 线程已经准备好运行 | +| 运行态 | 当前正在占用CPU | +| 挂起态 | 线程在等待资源、延时或事件 | +| 关闭态 | 线程已经结束或被删除 | + +**触发线程状态转换的典型API** + +线程状态会随着线程创建、启动、延时、挂起、恢复和删除等操作发生变化 + +| 状态转换 | 典型API或触发条件 | 说明 | +| ------------------------ | -------------------------------------------------------- | ------------------------------------------------------------ | +| 无状态->初始态 | rt_thread_init()、rt_thread_create() | 初始化或创建线程,此时线程还没有参与调度 | +| 初始态->就绪态 | rt_thread_startup() | 启动线程,并将线程加入就绪队列 | +| 就绪态->运行态 | 调度器选择 | 由调度器选择优先级最高的就绪线程运行,不是由普通应用API直接完成 | +| 运行态->就绪态 | 时间片耗尽、被高优先级线程抢占、rt_thread_yield() | 当前线程暂时让出CPU,但仍然可以参与调度 | +| 运行态->挂起态 | rt_thread_delay()、rt_thread_mdelay()、rt_thread_sleep() | 线程主动延时,延时期间不参与调度 | +| 运行态->挂起态 | rt_thread_suspend() | 主动挂起指定线程 | +| 运行态->挂起态 | 等待信号量、互斥量、事件或消息 | 当资源暂时不可用时,线程阻塞等待 | +| 挂起态->就绪态 | rt_thread_resume() | 将被挂起的线程恢复,并重新加入就绪队列 | +| 挂起态->就绪态 | 延时结束或等待的资源可用 | 线程等待条件满足后重新进入就绪态 | +| 运行态或就绪态->关闭态 | rt_thread_delete()、线程入口函数返回 | 删除线程,或者线程执行结束 | +| 非运行态静态线程->关闭态 | rt_thread_detach() | 将静态线程从系统对象管理中脱离,不释放其静态分配的栈和控制块 | + +线程状态转换可以简化表示为 + +![image-20260818202039012](D:\TYPORA\figures\image-20260818202039012.png) + +需要注意: + +1.1rt_thread_startup()的作用是将初始态线程启动,并放入就绪队列 + +1.2就绪态进入运行态,主要由调度器决定 + +1.3rt_thread_delay()、rt_thread_mdelay()会使当前线程进入挂起状态 + +1.4rt_thread_suspend()用于主动挂起线程,rt_thread_resume()用于恢复线程 + +1.5rt_thread_yield()通常不会使线程进入挂起态,线程让出CPU后仍然处于就绪状态 + +1.6当线程等待信号量、互斥量、事件、邮箱或消息队列时,如果资源暂时不可用,也会进入挂起状态 + +1.7rt_thread_delete()用于删除动态线程,静态线程通常使用rt_thread_detach()脱离系统管理 + +### 2.抢占式调度 + +RT-Thread采用基于优先级的抢占式调度,优先级越小优先级越高 + +当高优先级线程变为就绪态时,调度器会优先让它运行,从而抢占低优先级线程 + +### 3.时间片轮转 + +当多个线程优先级相同,并且都处于就绪态时,系统会根据时间片轮流运行这些线程。例如两个优先级都为16的线程,各自时间片为5ticks: + +线程A运行5ticks->切换到线程B->线程B运行5ticks->再切回到线程A + + + + + + + diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/aht10_ex.c" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/aht10_ex.c" new file mode 100644 index 0000000000000000000000000000000000000000..2c210eed831369b8abf0d40b7cf03e22ae4c0c7a --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/aht10_ex.c" @@ -0,0 +1,239 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mqttclient.h" + +#define DBG_TAG "aht10_mqtt" +#define DBG_LVL DBG_LOG +#include + +#define AHT10_I2C_BUS "i2c3" + +#define MQTT_HOST "broker.emqx.io" +#define MQTT_PORT "1883" +#define MQTT_CLIENT_ID "spark1_001_board" +#define MQTT_TOPIC_UP "rsoc/spark1_001/device/up" +#define MQTT_TOPIC_DOWN "rsoc/spark1_001/device/down" + +#define THREAD_STACK_SIZE 4096 +#define THREAD_PRIORITY 20 +#define THREAD_TIMESLICE 10 + +#define LED_PIN GET_PIN(F, 12) +#define FONT_PARTITION_NAME "font" +#define FONT_MOUNT_POINT "/fal/font" +#define FONT_DATA_FILE "/fal/font/Data.txt" + +static aht10_device_t g_aht10 = RT_NULL; +static mqtt_client_t *g_mqtt = RT_NULL; +static rt_thread_t g_thread = RT_NULL; +static rt_uint32_t g_count = 0; +static struct rt_device *g_font_blk = RT_NULL; + +static int font_fs_prepare(void) +{ + int ret; + + if (g_font_blk != RT_NULL) + return RT_EOK; + + if (mkdir(FONT_MOUNT_POINT, 0) < 0) + { + /* 目录已存在时忽略 */ + } + + fal_init(); + g_font_blk = fal_blk_device_create(FONT_PARTITION_NAME); + if (g_font_blk == RT_NULL) + { + rt_kprintf("font block device create failed\n"); + return -RT_ERROR; + } + + ret = dfs_mount(g_font_blk->parent.name, FONT_MOUNT_POINT, "elm", 0, 0); + if (ret != RT_EOK) + { + rt_kprintf("font mount failed, please mkfs manually first\n"); + return -RT_ERROR; + } + + rt_kprintf("font partition mounted on %s\n", FONT_MOUNT_POINT); + return RT_EOK; +} + +static void save_sample_to_file(float temp, float humi, rt_uint32_t count) +{ + int fd; + char line[128]; + int len; + + fd = open(FONT_DATA_FILE, O_WRONLY | O_CREAT | O_APPEND, 0666); + if (fd < 0) + { + rt_kprintf("open %s failed\n", FONT_DATA_FILE); + return; + } + + len = rt_snprintf(line, sizeof(line), + "Temp:%d.%02d ; Humi:%d.%02d ; Count: %u\r\n", + (int)temp, (int)(temp * 100) % 100, + (int)humi, (int)(humi * 100) % 100, + count); + if (len > 0) + { + write(fd, line, len); + } + + close(fd); +} + +static void mqtt_down_cb(void *client, message_data_t *msg) +{ + char buf[32] = {0}; + size_t len = msg->message->payloadlen; + + (void)client; + + if (len >= sizeof(buf)) + len = sizeof(buf) - 1; + + memcpy(buf, msg->message->payload, len); + buf[len] = '\0'; + + rt_kprintf("recv topic: %s\n", msg->topic_name); + rt_kprintf("recv payload: %s\n", buf); + + if (!strcmp(buf, "toggle")) + { + rt_pin_write(LED_PIN, !rt_pin_read(LED_PIN)); + } + else if (!strcmp(buf, "on")) + { + rt_pin_write(LED_PIN, PIN_LOW); + } + else if (!strcmp(buf, "off")) + { + rt_pin_write(LED_PIN, PIN_HIGH); + } +} + +static int mqtt_connect_emqx(void) +{ + g_mqtt = mqtt_lease(); + if (g_mqtt == RT_NULL) + return -1; + + mqtt_set_host(g_mqtt, MQTT_HOST); + mqtt_set_port(g_mqtt, MQTT_PORT); + mqtt_set_client_id(g_mqtt, MQTT_CLIENT_ID); + mqtt_set_clean_session(g_mqtt, 1); + mqtt_set_version(g_mqtt, 4); + mqtt_set_keep_alive_interval(g_mqtt, 60); + mqtt_set_cmd_timeout(g_mqtt, 4000); + mqtt_set_read_buf_size(g_mqtt, 1024); + mqtt_set_write_buf_size(g_mqtt, 1024); + + if (mqtt_connect(g_mqtt) != 0) + { + rt_kprintf("mqtt connect failed\n"); + mqtt_release(g_mqtt); + g_mqtt = RT_NULL; + return -2; + } + + if (mqtt_subscribe(g_mqtt, MQTT_TOPIC_DOWN, QOS0, mqtt_down_cb) != 0) + { + rt_kprintf("mqtt subscribe failed\n"); + } + + rt_kprintf("mqtt connected\n"); + return 0; +} + +static void aht10_mqtt_entry(void *parameter) +{ + float temp = 0; + float humi = 0; + char payload[128]; + mqtt_message_t msg; + + (void)parameter; + + rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); + rt_pin_write(LED_PIN, PIN_HIGH); + + if (font_fs_prepare() != RT_EOK) + { + rt_kprintf("font filesystem init failed\n"); + return; + } + + g_aht10 = aht10_init(AHT10_I2C_BUS); + if (g_aht10 == RT_NULL) + { + rt_kprintf("AHT10 init failed, check i2c bus name\n"); + return; + } + + while (mqtt_connect_emqx() != 0) + { + rt_thread_mdelay(3000); + } + + while (1) + { + temp = aht10_read_temperature(g_aht10); + humi = aht10_read_humidity(g_aht10); + g_count++; + + rt_snprintf(payload, sizeof(payload), + "{\"temperature\":%d.%02d,\"humidity\":%d.%02d,\"count\":%u}", + (int)temp, (int)(temp * 100) % 100, + (int)humi, (int)(humi * 100) % 100, + g_count); + + memset(&msg, 0, sizeof(msg)); + msg.qos = QOS0; + msg.payload = payload; + msg.payloadlen = strlen(payload); + + if (mqtt_publish(g_mqtt, MQTT_TOPIC_UP, &msg) != 0) + { + rt_kprintf("mqtt publish failed\n"); + } + else + { + rt_kprintf("pub: %s\n", payload); + } + + save_sample_to_file(temp, humi, g_count); + mqtt_keep_alive(g_mqtt); + rt_thread_mdelay(1000); + } +} + +int aht10_mqtt_start(void) +{ + g_thread = rt_thread_create("ahtmqtt", + aht10_mqtt_entry, + RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, + THREAD_TIMESLICE); + if (g_thread == RT_NULL) + { + rt_kprintf("thread create failed\n"); + return -RT_ERROR; + } + + rt_thread_startup(g_thread); + return RT_EOK; +} + +MSH_CMD_EXPORT(aht10_mqtt_start, start AHT10 and publish to EMQX); diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817112957813.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817112957813.png" new file mode 100644 index 0000000000000000000000000000000000000000..8cbefd2821fc003691fc15a62e6fc8b10e3fa467 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817112957813.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817113502159.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817113502159.png" new file mode 100644 index 0000000000000000000000000000000000000000..685d7fb5b5eeefc01cfad53b85e4cac38945469b Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817113502159.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817142648941.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817142648941.png" new file mode 100644 index 0000000000000000000000000000000000000000..4bf38e6b886dfa690e5a7d726f15856157c6115b Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817142648941.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817143835258.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817143835258.png" new file mode 100644 index 0000000000000000000000000000000000000000..2ca7c09e48ba4d65780d5a1a5792b9c101bc3ecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817143835258.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817144051657.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817144051657.png" new file mode 100644 index 0000000000000000000000000000000000000000..b3b6900b033d2ba826f94883eab89d955ede7434 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817144051657.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817150046870.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817150046870.png" new file mode 100644 index 0000000000000000000000000000000000000000..95ab187ec4ddb3bd3eb788ab13f0dea61a728a80 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817150046870.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817150446388.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817150446388.png" new file mode 100644 index 0000000000000000000000000000000000000000..c0435456a9dbaaf4aa0dbb0f6c12ccc6d3230ecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817150446388.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817151244692.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817151244692.png" new file mode 100644 index 0000000000000000000000000000000000000000..adf1c1cd27e5acbf0b9d5aa20a8ffebf8f0fbdc5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817151244692.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817152048721.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817152048721.png" new file mode 100644 index 0000000000000000000000000000000000000000..4e39cef8d61f44e369319918be0b95fc35beace8 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817152048721.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817152317118.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817152317118.png" new file mode 100644 index 0000000000000000000000000000000000000000..74f66f4df025334e505c57b42daffa5aa8db5d48 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260817152317118.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818140556194.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818140556194.png" new file mode 100644 index 0000000000000000000000000000000000000000..35ad6963fe9d9e24b90b02a92da4a88996349be1 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818140556194.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818164439722.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818164439722.png" new file mode 100644 index 0000000000000000000000000000000000000000..a7a945d850b8166e44fe27032c825f6fc4120d9e Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818164439722.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818202039012.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818202039012.png" new file mode 100644 index 0000000000000000000000000000000000000000..8aeb7b88e692feaf17ef61fcf1f8480a5987806a Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818202039012.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818210556117.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818210556117.png" new file mode 100644 index 0000000000000000000000000000000000000000..c22ddb4cc9edf0f30552b564c6c478f4de57f996 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818210556117.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818210605960.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818210605960.png" new file mode 100644 index 0000000000000000000000000000000000000000..c22ddb4cc9edf0f30552b564c6c478f4de57f996 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818210605960.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818210732275.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818210732275.png" new file mode 100644 index 0000000000000000000000000000000000000000..af7b05423b82c2281ec468ea8cd1ced2e2e4a3c5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818210732275.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818210821589.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818210821589.png" new file mode 100644 index 0000000000000000000000000000000000000000..4a0f90d7a951c426897f02ccb2eac4a0982376a5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818210821589.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818211005741.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818211005741.png" new file mode 100644 index 0000000000000000000000000000000000000000..ff0da8904baeebbbd649d90ffadf5181b08d7389 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818211005741.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818211045732.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818211045732.png" new file mode 100644 index 0000000000000000000000000000000000000000..6e56fc96a1b0a365e022e9f933be18b720ee294a Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260818211045732.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819144141632.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819144141632.png" new file mode 100644 index 0000000000000000000000000000000000000000..3ee96e6ac8528e5088c75d32c3665f0f96fd5714 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819144141632.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819150611545.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819150611545.png" new file mode 100644 index 0000000000000000000000000000000000000000..33080ef05321f65e8c45b64c205bb22af2958773 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819150611545.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819150625868.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819150625868.png" new file mode 100644 index 0000000000000000000000000000000000000000..689b648403c348a4a9675a375dbd1f5638390c15 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819150625868.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819152800741.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819152800741.png" new file mode 100644 index 0000000000000000000000000000000000000000..33080ef05321f65e8c45b64c205bb22af2958773 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819152800741.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819155711526.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819155711526.png" new file mode 100644 index 0000000000000000000000000000000000000000..fd5ff0b2aa64dd9f143979addca012c5288f82ac Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819155711526.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819165949131.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819165949131.png" new file mode 100644 index 0000000000000000000000000000000000000000..d91a94d74a42ec2dbefbeebc03c736228db8b8dd Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260819165949131.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260822145548675.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260822145548675.png" new file mode 100644 index 0000000000000000000000000000000000000000..7bb5708ae778c7d52b349a0c3de3bdcc4f441a44 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260822145548675.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260822145554303.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260822145554303.png" new file mode 100644 index 0000000000000000000000000000000000000000..7bb5708ae778c7d52b349a0c3de3bdcc4f441a44 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260822145554303.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260822145612979.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260822145612979.png" new file mode 100644 index 0000000000000000000000000000000000000000..3b23aefc9b52fd5ba2c150c460f58a7cd512812f Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260822145612979.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260822154735492.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260822154735492.png" new file mode 100644 index 0000000000000000000000000000000000000000..b2629eb7e7461f257f7f76b57f9374ee1e92a64f Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260822154735492.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260822203644521.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260822203644521.png" new file mode 100644 index 0000000000000000000000000000000000000000..ee3c3d853d9ab0a69e437505a24d856beb119b05 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260822203644521.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823142520360.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823142520360.png" new file mode 100644 index 0000000000000000000000000000000000000000..7b799dd2d54dc9cad33e84702224139ce1428f97 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823142520360.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823145424252.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823145424252.png" new file mode 100644 index 0000000000000000000000000000000000000000..521192b2d36580df412633e55b5fd8fd0dd0e1a7 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823145424252.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823145610355.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823145610355.png" new file mode 100644 index 0000000000000000000000000000000000000000..2f9bff82e59a9c61f50f8d7ffe8e2673a82059eb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823145610355.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823150634994.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823150634994.png" new file mode 100644 index 0000000000000000000000000000000000000000..44dadd3b711e514421413d3c5f13f415ac241d98 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823150634994.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823151127311.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823151127311.png" new file mode 100644 index 0000000000000000000000000000000000000000..ec881066e5bd494b08f7dd0c4f217f77bd6ea444 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823151127311.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823154631154.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823154631154.png" new file mode 100644 index 0000000000000000000000000000000000000000..0cbb2e1f9e63631762e2fca8a8c46723731d309d Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823154631154.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823180827031.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823180827031.png" new file mode 100644 index 0000000000000000000000000000000000000000..305d617d4ced0ea7ec001483bf82a2a43a0a58d2 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823180827031.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823180914037.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823180914037.png" new file mode 100644 index 0000000000000000000000000000000000000000..1cec986751089fc603c34c66d7882a886edf8623 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823180914037.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823181133178.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823181133178.png" new file mode 100644 index 0000000000000000000000000000000000000000..6028d858cf0f4627cd303c7a81ad0fb65f166f3b Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823181133178.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823192551698.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823192551698.png" new file mode 100644 index 0000000000000000000000000000000000000000..6739e49b52bf1fc123fea06b6645b6c552cd9465 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/image-20260823192551698.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/rtt_startup.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/rtt_startup.png" new file mode 100644 index 0000000000000000000000000000000000000000..04dbb79fed05b7463c5ceea179f5dd75c6553724 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/rtt_startup.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" new file mode 100644 index 0000000000000000000000000000000000000000..800ec298cc4dd2fa7599d475a0c8f3bf52a3eecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" new file mode 100644 index 0000000000000000000000000000000000000000..95e8ab4ef99114778b540f5d2755243bfb511a95 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" new file mode 100644 index 0000000000000000000000000000000000000000..e4fb0f0ce5fae09fda464fe2b060422cbe7ad598 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/mqtt_led.c" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/mqtt_led.c" new file mode 100644 index 0000000000000000000000000000000000000000..e839d5a44f689f4f1dc0b67b1bb57c035f188b4e --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/mqtt_led.c" @@ -0,0 +1,129 @@ +#include +#include +#include +#include +#include "mqttclient.h" + +#define DBG_TAG "mqtt_led" +#define DBG_LVL DBG_LOG +#include + +#define LED_PIN GET_PIN(F, 11) +#define MQTT_HOST "broker.emqx.io" +#define MQTT_PORT "1883" +#define MQTT_CLIENT_ID "spark1_001_led" +#define MQTT_TOPIC_DOWN "rsoc/spark1_001/device/down" + +#define THREAD_STACK_SIZE 2048 +#define THREAD_PRIORITY 20 +#define THREAD_TIMESLICE 10 + +static mqtt_client_t *g_mqtt = RT_NULL; +static rt_thread_t g_thread = RT_NULL; + +static void led_set(rt_bool_t on) +{ + rt_pin_write(LED_PIN, on ? PIN_LOW : PIN_HIGH); +} + +static void mqtt_down_cb(void *client, message_data_t *msg) +{ + char buf[32] = {0}; + size_t len = msg->message->payloadlen; + + (void)client; + + if (len >= sizeof(buf)) + len = sizeof(buf) - 1; + + memcpy(buf, msg->message->payload, len); + buf[len] = '\0'; + + rt_kprintf("recv topic: %s\n", msg->topic_name); + rt_kprintf("recv payload: %s\n", buf); + + if (strstr(buf, "toggle") != RT_NULL) + { + rt_pin_write(LED_PIN, !rt_pin_read(LED_PIN)); + } + else if (strstr(buf, "on") != RT_NULL) + { + led_set(RT_TRUE); + } + else if (strstr(buf, "off") != RT_NULL) + { + led_set(RT_FALSE); + } +} + +static int mqtt_connect_emqx(void) +{ + g_mqtt = mqtt_lease(); + if (g_mqtt == RT_NULL) + return -1; + + mqtt_set_host(g_mqtt, MQTT_HOST); + mqtt_set_port(g_mqtt, MQTT_PORT); + mqtt_set_client_id(g_mqtt, MQTT_CLIENT_ID); + mqtt_set_clean_session(g_mqtt, 1); + mqtt_set_version(g_mqtt, 4); + mqtt_set_keep_alive_interval(g_mqtt, 60); + mqtt_set_cmd_timeout(g_mqtt, 4000); + mqtt_set_read_buf_size(g_mqtt, 1024); + mqtt_set_write_buf_size(g_mqtt, 1024); + + if (mqtt_connect(g_mqtt) != 0) + { + rt_kprintf("mqtt connect failed\n"); + mqtt_release(g_mqtt); + g_mqtt = RT_NULL; + return -2; + } + + if (mqtt_subscribe(g_mqtt, MQTT_TOPIC_DOWN, QOS0, mqtt_down_cb) != 0) + { + rt_kprintf("mqtt subscribe failed\n"); + } + + rt_kprintf("mqtt connected\n"); + return 0; +} + +static void mqtt_led_entry(void *parameter) +{ + (void)parameter; + + rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); + led_set(RT_FALSE); + + while (mqtt_connect_emqx() != 0) + { + rt_thread_mdelay(3000); + } + + while (1) + { + mqtt_keep_alive(g_mqtt); + rt_thread_mdelay(1000); + } +} + +int mqtt_led_start(void) +{ + g_thread = rt_thread_create("mqttled", + mqtt_led_entry, + RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, + THREAD_TIMESLICE); + if (g_thread == RT_NULL) + { + rt_kprintf("thread create failed\n"); + return -RT_ERROR; + } + + rt_thread_startup(g_thread); + return RT_EOK; +} + +MSH_CMD_EXPORT(mqtt_led_start, start MQTT LED control); diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/\345\256\236\351\252\214\346\212\245\345\221\212.md" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/\345\256\236\351\252\214\346\212\245\345\221\212.md" new file mode 100644 index 0000000000000000000000000000000000000000..b91216d334d0071d63c8f6391d4c28de5435d9df --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/\345\256\236\351\252\214\346\212\245\345\221\212.md" @@ -0,0 +1,11 @@ + + + + + + +![image-20260823181133178](D:\TYPORA\figures\image-20260823181133178.png) + +![image-20260823180914037](D:\TYPORA\figures\image-20260823180914037.png) + +![image-20260823180827031](D:\TYPORA\figures\image-20260823180827031.png) \ No newline at end of file diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/DAY4.md" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/DAY4.md" new file mode 100644 index 0000000000000000000000000000000000000000..3c30046a27393abcd516ec5dbd149436d670d349 --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/DAY4.md" @@ -0,0 +1,205 @@ +# 设备驱动 + +### 一、RT-Thread I/O设备框架概念 + +**SPI**:驱动和设备分离,提供统一的API + +更换MCU只需要改变对应的对接驱动;重新驱动设备,只需要重新编写设备驱动相关代码;同一API接口,学习成本低;分离后设备驱动可以入库,供公司其他项目使用,减少碎片化开发,防止反复造轮子;代码框架会变复杂 + +I/O提供一套接口open write read control close + +SPI I2C GPIO RTC WDG特定API + +**字符设备**:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。此类设备支持按字节/字符来读写数据 + +**块设备**:应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。不支持基于字符的寻址 + +**字符设备只能顺序读取,块设备可以随机读取** + +### 二、RT-Thread I/O API + +**创建/销毁设备** + +``` +rt_device_t rt_device_create(int type,int attach_size); +void rt_device_destroy(rt_device_t device); +``` + +**注册/注销** + +``` +rt_err_t rt_device_register(rt_device_t dev,const char* name,rt_uint8_t flags); +rt_err_t rt_device_unregister(rt_device_t dev); +``` + +**注册字符设备** + +![image-20260822145612979](D:\TYPORA\figures\image-20260822145612979.png) + +![image-20260822145554303](D:\TYPORA\figures\image-20260822145554303.png) + +**查找设备/初始化设备** + +``` +rt_device_t rt_device_find(const char* name); +rt_err_t rt_device_init(rt_device_t dev); +``` + +**打开和关闭设备** + +``` +rt_err_t rt_device_open(rt_device_t dev,rt_uint16_t oflags); +rt_err_t rt_device_close(rt_device_t dev); +``` + +**控制设备** + +``` +rt_err_t rt_device_control(rt_device_t dev,rt_uint8_t cmd,void* arg); +``` + +**读取设备** + +``` +rt_size_t rt_device_read(rt_device_t dev,rt_off_t pos,void* buffer,rt_size_t size); +rt_size_t rt_device_write(rt_device_t dev,rt_off_t pos,const void* buffer,rt_size_t size); +``` + +**数据接收回调** + +``` +rt_err_t rt_device_set_rx_indicate(rt_device_t dev,rt_err_t(*rx_ind)(rt_device_t dev,rt_size_t size)); +``` + +**数据发送回调** + +``` +rt_err_t rt_device_set_tx_complete(rt_device_t dev,rt_err_t (*tx_done)(rt_device_t dev,void *buffer)); +``` + +### 三、RT-Thread GPIO 外设开发 + +芯片上的引脚一般分为:电源、时钟、控制、I/O + +**可编程控制中断**:上升沿触发、下降沿触发、高电平触发、低电平触发、双边沿触发 + +**相关接口** + +rt_pin_mode():设置引脚模式 + +rt_pin_write():设置引脚电平 + +rt_pin_read() :读取引脚电平 + +rt_pin_attach_irq() :绑定引脚中断回调函数 + +rt_pin_irq_enable() 使能引脚中断 + +rt_pin_detach_irq() :脱离引脚中断回调函数 + +**配置GPIO引脚模式** + +``` +void rt_pin_mode(rt_base_t pin,rt_base_t mode); +``` + +**输出电平** + +``` +void rt_pin_write(rt_base_t pin,rt_base_t value); +``` + +value可取:PIN_LOW低电平,PIN_HIGH高电平 + +**读取引脚电平** + +``` +int rt_pin_read(rt_base_t pin); +``` + + + +### 四、RT-Thread I2C 外设开发 + +常见的I2C总线: + +低速模式:10Kbit/s + +标准模式:100Kbit/s + +快速模式:400Kbit/s + +高速模式:3.4Mbit/s + +**起始位(S)**:在SCL为高电平时,SDA由高电平变为低电平 + +**结束位(P)**:在SCL为高电平时,SDA由低电平变为高电平 + +![image-20260822154735492](D:\TYPORA\figures\image-20260822154735492.png) + +**应答(ACK)**:拉低SDA线,并在SCL为高电平期间保持SDA线位低电平 + +**非应答(NOACK)**:不要拉低SDA线(此时SDA线位高电平),并在SCL为高电平期间保持SDA线为高电平 + +**查找设备** + +``` +rt_device_t rt_device_find(const char* name); +``` + +``` +struct rt_i2c_bus_device *i2c_bus; +i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(name); +``` + +**传输** + +``` +rt_size_t rt_i2c_transfer(struct rt_i2c_bus_device *bus,struct rt_i2c_msg msgs[],rt_uint32_t num); +struct rt_i2c_msg +{ + rt_uint16_t addr; + rt_uint16_t flags; + rt_uint16_t len; + rt_uint8_t *buf; +} +``` + +**消息数据类型**:从机地址、读写标志、读写数据字节数、读写缓冲区指针 + +**I2C使用思路**:查找I2C总线设备;构造msgs消息;启动transfer传输;处理结果 + +### 五、RT-Thread SPI 外设开发 + +**SPI串行外设接口**:是一种高速、全双工、同步通信总线,常用语短距离通讯,主要应用于EEPROM、FLASH、实时时钟、AD转换器、还有数字信号处理器和数字信号解码器之间 + +**挂载SPI设备** + +``` +rt_err_t rt_spi_bus_attach_device(struct rt_spi_device *device,const char *name,const char *bus_name,void *user_data) +``` + +**查找设备** + +``` +rt_device_t rt_device_find(const char* name); +``` + +**传输数据(一次通信)** + +``` +rt_size_t rt_spi_transfer(struct rt_spi_device *device,const void *send_buf,void *recv_buf,rt_size_t length); +``` + +**接收一次数据** + +``` +rt_size_t rt_spi_recv(struct rt_spi_device *device,void *recv_bif,rt_size_t length); +``` + +**连续两次发送数据** + +``` +rt_err_t rt_spi_send_then_send(struct rt_spi_device *device,const void *send_buf1,rt_size_t send_length1,const void *send_buf2,rt_size_t send_length2); +``` + diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817112957813.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817112957813.png" new file mode 100644 index 0000000000000000000000000000000000000000..8cbefd2821fc003691fc15a62e6fc8b10e3fa467 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817112957813.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817113502159.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817113502159.png" new file mode 100644 index 0000000000000000000000000000000000000000..685d7fb5b5eeefc01cfad53b85e4cac38945469b Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817113502159.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817142648941.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817142648941.png" new file mode 100644 index 0000000000000000000000000000000000000000..4bf38e6b886dfa690e5a7d726f15856157c6115b Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817142648941.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817143835258.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817143835258.png" new file mode 100644 index 0000000000000000000000000000000000000000..2ca7c09e48ba4d65780d5a1a5792b9c101bc3ecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817143835258.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817144051657.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817144051657.png" new file mode 100644 index 0000000000000000000000000000000000000000..b3b6900b033d2ba826f94883eab89d955ede7434 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817144051657.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817150046870.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817150046870.png" new file mode 100644 index 0000000000000000000000000000000000000000..95ab187ec4ddb3bd3eb788ab13f0dea61a728a80 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817150046870.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817150446388.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817150446388.png" new file mode 100644 index 0000000000000000000000000000000000000000..c0435456a9dbaaf4aa0dbb0f6c12ccc6d3230ecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817150446388.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817151244692.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817151244692.png" new file mode 100644 index 0000000000000000000000000000000000000000..adf1c1cd27e5acbf0b9d5aa20a8ffebf8f0fbdc5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817151244692.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817152048721.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817152048721.png" new file mode 100644 index 0000000000000000000000000000000000000000..4e39cef8d61f44e369319918be0b95fc35beace8 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817152048721.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817152317118.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817152317118.png" new file mode 100644 index 0000000000000000000000000000000000000000..74f66f4df025334e505c57b42daffa5aa8db5d48 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260817152317118.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818140556194.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818140556194.png" new file mode 100644 index 0000000000000000000000000000000000000000..35ad6963fe9d9e24b90b02a92da4a88996349be1 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818140556194.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818164439722.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818164439722.png" new file mode 100644 index 0000000000000000000000000000000000000000..a7a945d850b8166e44fe27032c825f6fc4120d9e Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818164439722.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818202039012.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818202039012.png" new file mode 100644 index 0000000000000000000000000000000000000000..8aeb7b88e692feaf17ef61fcf1f8480a5987806a Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818202039012.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818210556117.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818210556117.png" new file mode 100644 index 0000000000000000000000000000000000000000..c22ddb4cc9edf0f30552b564c6c478f4de57f996 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818210556117.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818210605960.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818210605960.png" new file mode 100644 index 0000000000000000000000000000000000000000..c22ddb4cc9edf0f30552b564c6c478f4de57f996 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818210605960.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818210732275.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818210732275.png" new file mode 100644 index 0000000000000000000000000000000000000000..af7b05423b82c2281ec468ea8cd1ced2e2e4a3c5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818210732275.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818210821589.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818210821589.png" new file mode 100644 index 0000000000000000000000000000000000000000..4a0f90d7a951c426897f02ccb2eac4a0982376a5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818210821589.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818211005741.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818211005741.png" new file mode 100644 index 0000000000000000000000000000000000000000..ff0da8904baeebbbd649d90ffadf5181b08d7389 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818211005741.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818211045732.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818211045732.png" new file mode 100644 index 0000000000000000000000000000000000000000..6e56fc96a1b0a365e022e9f933be18b720ee294a Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260818211045732.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819144141632.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819144141632.png" new file mode 100644 index 0000000000000000000000000000000000000000..3ee96e6ac8528e5088c75d32c3665f0f96fd5714 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819144141632.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819150611545.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819150611545.png" new file mode 100644 index 0000000000000000000000000000000000000000..33080ef05321f65e8c45b64c205bb22af2958773 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819150611545.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819150625868.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819150625868.png" new file mode 100644 index 0000000000000000000000000000000000000000..689b648403c348a4a9675a375dbd1f5638390c15 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819150625868.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819152800741.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819152800741.png" new file mode 100644 index 0000000000000000000000000000000000000000..33080ef05321f65e8c45b64c205bb22af2958773 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819152800741.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819155711526.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819155711526.png" new file mode 100644 index 0000000000000000000000000000000000000000..fd5ff0b2aa64dd9f143979addca012c5288f82ac Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819155711526.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819165949131.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819165949131.png" new file mode 100644 index 0000000000000000000000000000000000000000..d91a94d74a42ec2dbefbeebc03c736228db8b8dd Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260819165949131.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260822145548675.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260822145548675.png" new file mode 100644 index 0000000000000000000000000000000000000000..7bb5708ae778c7d52b349a0c3de3bdcc4f441a44 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260822145548675.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260822145554303.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260822145554303.png" new file mode 100644 index 0000000000000000000000000000000000000000..7bb5708ae778c7d52b349a0c3de3bdcc4f441a44 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260822145554303.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260822145612979.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260822145612979.png" new file mode 100644 index 0000000000000000000000000000000000000000..3b23aefc9b52fd5ba2c150c460f58a7cd512812f Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260822145612979.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260822154735492.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260822154735492.png" new file mode 100644 index 0000000000000000000000000000000000000000..b2629eb7e7461f257f7f76b57f9374ee1e92a64f Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260822154735492.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260822203644521.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260822203644521.png" new file mode 100644 index 0000000000000000000000000000000000000000..ee3c3d853d9ab0a69e437505a24d856beb119b05 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260822203644521.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823142520360.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823142520360.png" new file mode 100644 index 0000000000000000000000000000000000000000..7b799dd2d54dc9cad33e84702224139ce1428f97 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823142520360.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823145424252.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823145424252.png" new file mode 100644 index 0000000000000000000000000000000000000000..521192b2d36580df412633e55b5fd8fd0dd0e1a7 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823145424252.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823145610355.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823145610355.png" new file mode 100644 index 0000000000000000000000000000000000000000..2f9bff82e59a9c61f50f8d7ffe8e2673a82059eb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823145610355.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823150634994.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823150634994.png" new file mode 100644 index 0000000000000000000000000000000000000000..44dadd3b711e514421413d3c5f13f415ac241d98 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823150634994.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823151127311.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823151127311.png" new file mode 100644 index 0000000000000000000000000000000000000000..ec881066e5bd494b08f7dd0c4f217f77bd6ea444 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823151127311.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823154631154.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823154631154.png" new file mode 100644 index 0000000000000000000000000000000000000000..0cbb2e1f9e63631762e2fca8a8c46723731d309d Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/image-20260823154631154.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/rtt_startup.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/rtt_startup.png" new file mode 100644 index 0000000000000000000000000000000000000000..04dbb79fed05b7463c5ceea179f5dd75c6553724 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/rtt_startup.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" new file mode 100644 index 0000000000000000000000000000000000000000..800ec298cc4dd2fa7599d475a0c8f3bf52a3eecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" new file mode 100644 index 0000000000000000000000000000000000000000..95e8ab4ef99114778b540f5d2755243bfb511a95 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" new file mode 100644 index 0000000000000000000000000000000000000000..e4fb0f0ce5fae09fda464fe2b060422cbe7ad598 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/test_dev.c" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/test_dev.c" new file mode 100644 index 0000000000000000000000000000000000000000..aaa51a25ce533ba0a452256f95231d3beac57a98 --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/test_dev.c" @@ -0,0 +1,193 @@ +#include +#include +#include + +#define TEST_DEV_NAME "test_dev" +#define TEST_DEV_BUF_SIZE 128 + +enum test_dev_cmd +{ + TEST_DEV_CMD_CLEAR = 0x10, + TEST_DEV_CMD_GET_STATS, +}; + +struct test_dev_stats +{ + rt_uint32_t open_cnt; + rt_uint32_t read_cnt; + rt_uint32_t write_cnt; + rt_uint32_t ctrl_cnt; + rt_size_t cache_len; +}; + +struct test_dev_priv +{ + rt_uint8_t opened; + struct test_dev_stats stats; + char cache[TEST_DEV_BUF_SIZE]; +}; + +static struct test_dev_priv g_test_dev; + +static rt_err_t test_dev_init(rt_device_t dev) +{ + rt_memset(&g_test_dev, 0, sizeof(g_test_dev)); + dev->user_data = &g_test_dev; + rt_kprintf("test_dev init\n"); + return RT_EOK; +} + +static rt_err_t test_dev_open(rt_device_t dev, rt_uint16_t oflag) +{ + struct test_dev_priv *priv = (struct test_dev_priv *)dev->user_data; + priv->opened = 1; + priv->stats.open_cnt++; + rt_kprintf("test_dev open, oflag=%d\n", oflag); + return RT_EOK; +} + +static rt_err_t test_dev_close(rt_device_t dev) +{ + struct test_dev_priv *priv = (struct test_dev_priv *)dev->user_data; + priv->opened = 0; + rt_kprintf("test_dev close\n"); + return RT_EOK; +} + +static rt_size_t test_dev_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + struct test_dev_priv *priv = (struct test_dev_priv *)dev->user_data; + rt_size_t copy_len; + + if (buffer == RT_NULL || size == 0) + return 0; + + if (pos < 0 || (rt_size_t)pos >= priv->stats.cache_len) + return 0; + + copy_len = size; + if (copy_len > priv->stats.cache_len - pos) + copy_len = priv->stats.cache_len - pos; + + rt_memcpy(buffer, priv->cache + pos, copy_len); + priv->stats.read_cnt++; + + rt_kprintf("test_dev read, pos=%d, size=%d\n", pos, size); + return copy_len; +} + +static rt_size_t test_dev_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + struct test_dev_priv *priv = (struct test_dev_priv *)dev->user_data; + rt_size_t copy_len; + + if (buffer == RT_NULL || size == 0) + return 0; + + if (pos < 0 || (rt_size_t)pos >= TEST_DEV_BUF_SIZE) + return 0; + + copy_len = size; + if (copy_len > TEST_DEV_BUF_SIZE - pos) + copy_len = TEST_DEV_BUF_SIZE - pos; + + rt_memcpy(priv->cache + pos, buffer, copy_len); + if (priv->stats.cache_len < (rt_size_t)(pos + copy_len)) + priv->stats.cache_len = pos + copy_len; + + priv->stats.write_cnt++; + + rt_kprintf("test_dev write, pos=%d, size=%d\n", pos, size); + return copy_len; +} + +static rt_err_t test_dev_control(rt_device_t dev, int cmd, void *args) +{ + struct test_dev_priv *priv = (struct test_dev_priv *)dev->user_data; + priv->stats.ctrl_cnt++; + + switch (cmd) + { + case TEST_DEV_CMD_CLEAR: + rt_memset(priv->cache, 0, sizeof(priv->cache)); + priv->stats.cache_len = 0; + rt_kprintf("test_dev control: clear\n"); + return RT_EOK; + + case TEST_DEV_CMD_GET_STATS: + if (args == RT_NULL) + return -RT_EINVAL; + rt_memcpy(args, &priv->stats, sizeof(priv->stats)); + rt_kprintf("test_dev control: get stats\n"); + return RT_EOK; + + default: + rt_kprintf("test_dev control: unknown cmd=%d\n", cmd); + return -RT_EINVAL; + } +} + +int rt_test_dev_init(void) +{ + rt_device_t dev = rt_device_create(RT_Device_Class_Char, 0); + if (dev == RT_NULL) + { + rt_kprintf("test_dev create failed\n"); + return -RT_ERROR; + } + + dev->init = test_dev_init; + dev->open = test_dev_open; + dev->close = test_dev_close; + dev->read = test_dev_read; + dev->write = test_dev_write; + dev->control = test_dev_control; + + if (rt_device_register(dev, TEST_DEV_NAME, RT_DEVICE_FLAG_RDWR) != RT_EOK) + { + rt_kprintf("test_dev register failed\n"); + return -RT_ERROR; + } + + return RT_EOK; +} +INIT_BOARD_EXPORT(rt_test_dev_init); + +static int test_dev_demo(void) +{ + rt_device_t dev; + char buf[TEST_DEV_BUF_SIZE + 1]; + struct test_dev_stats stats; + const char *msg = "hello test_dev"; + + dev = rt_device_find(TEST_DEV_NAME); + if (dev == RT_NULL) + { + rt_kprintf("find %s failed\n", TEST_DEV_NAME); + return -RT_ERROR; + } + + if (rt_device_open(dev, RT_DEVICE_OFLAG_RDWR) != RT_EOK) + { + rt_kprintf("open %s failed\n", TEST_DEV_NAME); + return -RT_ERROR; + } + + rt_device_write(dev, 0, msg, rt_strlen(msg)); + + rt_memset(buf, 0, sizeof(buf)); + rt_device_read(dev, 0, buf, sizeof(buf) - 1); + rt_kprintf("read buffer: %s\n", buf); + + rt_memset(&stats, 0, sizeof(stats)); + rt_device_control(dev, TEST_DEV_CMD_GET_STATS, &stats); + rt_kprintf("stats: open=%u read=%u write=%u ctrl=%u len=%u\n", + stats.open_cnt, stats.read_cnt, stats.write_cnt, + stats.ctrl_cnt, (unsigned int)stats.cache_len); + + rt_device_control(dev, TEST_DEV_CMD_CLEAR, RT_NULL); + rt_device_close(dev); + + return RT_EOK; +} +MSH_CMD_EXPORT(test_dev_demo, test_dev_demo); diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/\345\256\236\351\252\214\346\212\245\345\221\212.md" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/\345\256\236\351\252\214\346\212\245\345\221\212.md" new file mode 100644 index 0000000000000000000000000000000000000000..0c20ea76ca610d1e98115e93e6950dec602c96d9 --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/\345\256\236\351\252\214\346\212\245\345\221\212.md" @@ -0,0 +1,74 @@ +# 虚拟设备驱动框架层 + +本实验通过设计一个不依赖真实硬件的虚拟字符设备 test_dev,学习 RT-Thread 设备驱动框架的基本接入方法,理解设备的创建、注册、查找、打开、读写、控制和关闭流程。实验重点不是实现具体硬件功能,而是完成一个可以正常挂接到设备框架中的虚拟驱动,并通过串口命令验证其工作过程 + +### 实验原理 + +RT-Thread 的设备驱动框架将底层硬件抽象为统一的设备对象。应用层不直接访问寄存器,而是通过设备名查找目标设备,再调用标准接口完成操作。对于字符设备而言,通常需要实现初始化、打开、关闭、读、写和控制等接口 + +本实验设计的 test_dev 属于虚拟字符设备,它内部不依赖真实外设,而是使用一块缓存区模拟设备数据。写操作将数据保存到缓存区,读操作从缓存区取出数据,控制操作用于完成清空缓存、获取统计信息等功能。通过这种方式,可以完整验证 RT-Thread 设备框架的接入流程 + +### 实验过程 + +**实现设备接口** + +在 test_dev.c 中实现设备的标准接口,包括: + +1. 初始化接口 `test_dev_init` +2. 打开接口 `test_dev_open` +3. 关闭接口 `test_dev_close` +4. 读接口 `test_dev_read` +5. 写接口 `test_dev_write` +6. 控制接口 `test_dev_control` + +其中,读写接口通过缓存区模拟数据传输,控制接口用于清空缓存和获取设备运行统计信息 + +**创建设备并注册** + +程序启动时调用初始化函数,先创建一个字符设备对象,再将上述接口绑定到设备对象上,最后将设备注册为 test_dev。注册成功后,设备就可以被系统通过名字查找 + +**编写测试命令** + +为了验证设备是否接入成功,程序中编写了测试命令 test_dev_demo,并通过 MSH 导出。测试命令执行流程如下: + +1. 通过 test_dev 名称查找设备 +2. 打开设备 +3. 向设备写入测试字符串 +4. 从设备中读取数据 +5. 通过控制命令获取统计信息并清空缓存 +6. 关闭设备 + +程序下载后,在串口 MSH 终端输入以下命令启动实验: + +``` +test_dev_demo +``` + +### 实验结果 + +程序启动后,先在 list_device 中查看设备列表,可以看到 test_dev已经出现在系统设备中,说明设备注册成功 + +执行 test_dev_demo 后,串口输出如下: + +- `test_dev init` +- `test_dev open, oflag=3` +- `test_dev write, pos=0, size=14` +- `test_dev read, pos=0, size=128` +- `read buffer: hello test_dev` +- `test_dev control: get stats` +- `stats: open=1 read=1 write=1 ctrl=1 len=14` +- `test_dev control: clear` +- `test_dev close` + +从结果可以看出,设备初始化、打开、写入、读取、控制和关闭流程均正常执行,读回的数据与写入数据一致,说明虚拟设备工作正常 + +![image-20260822203644521](D:\TYPORA\figures\image-20260822203644521.png) + +### 实验结果分析 + +本实验中,test_dev并不对应真实硬件,而是通过 RT-Thread 设备框架构造出的一个虚拟字符设备。其核心作用是验证设备对象能否被正确创建并注册到系统中,以及上层应用是否能够通过统一接口完成访问 + +实验结果表明,设备注册后可以被 list_device 正常识别,说明设备框架已成功接入。执行测试命令后,设备的各个标准接口依次被调用,并且读回内容与写入内容一致,说明缓存区模拟机制有效。控制命令能够返回统计信息并完成清空缓存操作,进一步说明设备框架的调用链路完整 + + + diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/figures/image-20260817102132970.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/figures/image-20260817102132970.png" new file mode 100644 index 0000000000000000000000000000000000000000..4369ded29da9b35e1339f89e44ac757c79456223 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/figures/image-20260817102132970.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/figures/image-20260817102444975.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/figures/image-20260817102444975.png" new file mode 100644 index 0000000000000000000000000000000000000000..60e53d69c822875d0bfc8dda640bb79c8cd6e212 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/figures/image-20260817102444975.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/figures/image-20260817104355851.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/figures/image-20260817104355851.png" new file mode 100644 index 0000000000000000000000000000000000000000..2bb302a75ff56c1e24b477b6df61d5a703cd4345 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/figures/image-20260817104355851.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/figures/\345\276\256\344\277\241\345\233\276\347\211\207_20260316172256_206_7-1786932429552-2.jpg" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/figures/\345\276\256\344\277\241\345\233\276\347\211\207_20260316172256_206_7-1786932429552-2.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..feb5e38e4e3e7253129043bac72a88b489ef1ce1 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/figures/\345\276\256\344\277\241\345\233\276\347\211\207_20260316172256_206_7-1786932429552-2.jpg" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/markdown\350\257\255\346\263\225\345\255\246\344\271\240.md" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/markdown\350\257\255\346\263\225\345\255\246\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..0f324dd6c62e61b8e469dcc3fc1d055714d2d97e --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/markdown\350\257\255\346\263\225\345\255\246\344\271\240.md" @@ -0,0 +1,28 @@ +# 一级标题 # + +## 二级标题 ## + +### 三级标题 ### + +## `code`代码 + +~~~c +#include +~~~ + +## |~|~|表格 + +| DAY1 | DAY2 | +| ---- | ---- | +| | | + +`高亮` + +**加粗** + +***斜体*** + + + + + diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/\345\210\233\345\273\272\345\267\245\347\250\213\344\270\216\350\260\203\350\257\225.md" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/\345\210\233\345\273\272\345\267\245\347\250\213\344\270\216\350\260\203\350\257\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..8e221bd28974988f5b032d6ad40afac7f557b5c6 --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\200\345\244\251\347\254\224\350\256\260/\345\210\233\345\273\272\345\267\245\347\250\213\344\270\216\350\260\203\350\257\225.md" @@ -0,0 +1,80 @@ +# 一、今日目标 + +``` +1.1安装并检查ST-Link驱动 + +1.2基于RT-Thread 4.1.1创建STM32F407ZG工程 + +1.3编译工程并下载到开发板 + +1.4使用ST-Link进入断点调试 + +1.5理解RT-Thread从启动文件到main()的执行流程 +``` + +# 二、工程创建 + +![屏幕截图 2026-08-17 102048](D:\TYPORA\figures\屏幕截图 2026-08-17 102048.png) + +## ST-Link驱动检查 + +![屏幕截图 2026-08-17 102442](D:\TYPORA\figures\屏幕截图 2026-08-17 102442.png) + +## 基于RT-Thread 4.1.1版本新建stm32f407zg芯片工程 + +![屏幕截图 2026-08-17 104304](D:\TYPORA\figures\屏幕截图 2026-08-17 104304.png) + +## 调试 + +### 使用ST-Link进入断点调试,程序停在main函数处 + +![image-20260817112957813](D:\TYPORA\figures\image-20260817112957813.png) + +![image-20260817113502159](D:\TYPORA\figures\image-20260817113502159.png) + +# 三、gitee的使用 + +### 配置提交者姓名、邮箱,查看git配置 + +![image-20260817142648941](D:\TYPORA\figures\image-20260817142648941.png) + +![image-20260817143835258](D:\TYPORA\figures\image-20260817143835258.png) + +![image-20260817144051657](D:\TYPORA\figures\image-20260817144051657.png) + +### 常用指令 + +**git init:初始化当前目录为git仓库** + +**git pull origin master:拉取远程master分支** + +**git add file/path:添加file/path到git暂存区** + +**git commit "message":本次git提交日志为“message”** + +**git push origin master:将本地git分支最新内容同步/推送到远端** + +**git pull:远端->本地** + +**git push:本地->远端** + +**git remote set-url origin 仓库名称:设置当前git仓库URL** + +**git fetch origin master:同步远端分支到本地** + +**git remote -v:查看仓库远端分支情况** + +**git checkout -b test:基于当前分支切出的一个名为test的新分支** + +![image-20260817150046870](D:\TYPORA\figures\image-20260817150046870.png) + +![image-20260817150446388](D:\TYPORA\figures\image-20260817150446388.png) + +![image-20260817151244692](D:\TYPORA\figures\image-20260817151244692.png) + +## 分支与PR操作 + +![image-20260817152048721](D:\TYPORA\figures\image-20260817152048721.png) + +![image-20260817152317118](D:\TYPORA\figures\image-20260817152317118.png) + diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817112957813.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817112957813.png" new file mode 100644 index 0000000000000000000000000000000000000000..8cbefd2821fc003691fc15a62e6fc8b10e3fa467 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817112957813.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817113502159.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817113502159.png" new file mode 100644 index 0000000000000000000000000000000000000000..685d7fb5b5eeefc01cfad53b85e4cac38945469b Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817113502159.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817142648941.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817142648941.png" new file mode 100644 index 0000000000000000000000000000000000000000..4bf38e6b886dfa690e5a7d726f15856157c6115b Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817142648941.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817143835258.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817143835258.png" new file mode 100644 index 0000000000000000000000000000000000000000..2ca7c09e48ba4d65780d5a1a5792b9c101bc3ecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817143835258.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817144051657.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817144051657.png" new file mode 100644 index 0000000000000000000000000000000000000000..b3b6900b033d2ba826f94883eab89d955ede7434 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817144051657.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817150046870.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817150046870.png" new file mode 100644 index 0000000000000000000000000000000000000000..95ab187ec4ddb3bd3eb788ab13f0dea61a728a80 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817150046870.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817150446388.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817150446388.png" new file mode 100644 index 0000000000000000000000000000000000000000..c0435456a9dbaaf4aa0dbb0f6c12ccc6d3230ecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817150446388.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817151244692.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817151244692.png" new file mode 100644 index 0000000000000000000000000000000000000000..adf1c1cd27e5acbf0b9d5aa20a8ffebf8f0fbdc5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817151244692.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817152048721.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817152048721.png" new file mode 100644 index 0000000000000000000000000000000000000000..4e39cef8d61f44e369319918be0b95fc35beace8 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817152048721.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817152317118.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817152317118.png" new file mode 100644 index 0000000000000000000000000000000000000000..74f66f4df025334e505c57b42daffa5aa8db5d48 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260817152317118.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818140556194.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818140556194.png" new file mode 100644 index 0000000000000000000000000000000000000000..35ad6963fe9d9e24b90b02a92da4a88996349be1 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818140556194.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818164439722.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818164439722.png" new file mode 100644 index 0000000000000000000000000000000000000000..a7a945d850b8166e44fe27032c825f6fc4120d9e Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818164439722.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818202039012.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818202039012.png" new file mode 100644 index 0000000000000000000000000000000000000000..8aeb7b88e692feaf17ef61fcf1f8480a5987806a Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818202039012.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818210556117.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818210556117.png" new file mode 100644 index 0000000000000000000000000000000000000000..c22ddb4cc9edf0f30552b564c6c478f4de57f996 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818210556117.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818210605960.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818210605960.png" new file mode 100644 index 0000000000000000000000000000000000000000..c22ddb4cc9edf0f30552b564c6c478f4de57f996 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818210605960.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818210732275.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818210732275.png" new file mode 100644 index 0000000000000000000000000000000000000000..af7b05423b82c2281ec468ea8cd1ced2e2e4a3c5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818210732275.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818210821589.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818210821589.png" new file mode 100644 index 0000000000000000000000000000000000000000..4a0f90d7a951c426897f02ccb2eac4a0982376a5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818210821589.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818211005741.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818211005741.png" new file mode 100644 index 0000000000000000000000000000000000000000..ff0da8904baeebbbd649d90ffadf5181b08d7389 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818211005741.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818211045732.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818211045732.png" new file mode 100644 index 0000000000000000000000000000000000000000..6e56fc96a1b0a365e022e9f933be18b720ee294a Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260818211045732.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819144141632.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819144141632.png" new file mode 100644 index 0000000000000000000000000000000000000000..3ee96e6ac8528e5088c75d32c3665f0f96fd5714 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819144141632.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819150611545.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819150611545.png" new file mode 100644 index 0000000000000000000000000000000000000000..33080ef05321f65e8c45b64c205bb22af2958773 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819150611545.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819150625868.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819150625868.png" new file mode 100644 index 0000000000000000000000000000000000000000..689b648403c348a4a9675a375dbd1f5638390c15 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819150625868.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819152800741.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819152800741.png" new file mode 100644 index 0000000000000000000000000000000000000000..33080ef05321f65e8c45b64c205bb22af2958773 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819152800741.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819155711526.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819155711526.png" new file mode 100644 index 0000000000000000000000000000000000000000..fd5ff0b2aa64dd9f143979addca012c5288f82ac Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819155711526.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819165949131.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819165949131.png" new file mode 100644 index 0000000000000000000000000000000000000000..d91a94d74a42ec2dbefbeebc03c736228db8b8dd Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/image-20260819165949131.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/rtt_startup.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/rtt_startup.png" new file mode 100644 index 0000000000000000000000000000000000000000..04dbb79fed05b7463c5ceea179f5dd75c6553724 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/rtt_startup.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" new file mode 100644 index 0000000000000000000000000000000000000000..800ec298cc4dd2fa7599d475a0c8f3bf52a3eecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" new file mode 100644 index 0000000000000000000000000000000000000000..95e8ab4ef99114778b540f5d2755243bfb511a95 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" new file mode 100644 index 0000000000000000000000000000000000000000..e4fb0f0ce5fae09fda464fe2b060422cbe7ad598 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251.md" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251.md" new file mode 100644 index 0000000000000000000000000000000000000000..fc305cf69712bd233595724f533ca37754edfaa2 --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260/\347\254\254\344\270\211\345\244\251.md" @@ -0,0 +1,377 @@ + + +# 一、线程间同步 + +**信号量**:互斥信号量/二值信号量(初始值为0不可获取;到达同步点释放信号量,值变为1,可获得)/计数信号量(被初始化为n,n为非负整数,n是共享资源的数量;信号量大于0时,可获得;信号量等于0,不可获得,挂起状态) + +信号量控制块结构体 + +```c +struct rt_semaphore +{ + struct rt_ipc_object parent; /* 继承自 ipc_object 类 */ + rt_uint16_t value; /* 信号量的值 */ + rt_uint16_t max_value; /* 信号量的最大值 */ + struct rt_spinlock spinlock; /* 自旋锁 */ +}; +/* rt_sem_t 是指向 semaphore 结构体的指针类型 */ +typedef struct rt_semaphore* rt_sem_t; +``` + +**创建信号量** + +```c + rt_sem_t rt_sem_create(const char *name, + rt_uint32_t value, + rt_uint8_t flag); +``` + +FIFO(先进先出)/PRIO(优先级等待) + +**删除信号量** + +```c +rt_err_t rt_sem_delete(rt_sem_t sem); +``` + +**初始化信号量** + +```c +rt_err_t rt_sem_init(rt_sem_t sem, + const char *name, + rt_uint32_t value, + rt_uint8_t flag) +``` + +**脱离信号量**:让信号量对象从内核对象管理器中脱离,适用于静态初始化的信号量 + +```c +rt_err_t rt_sem_detach(rt_sem_t sem); +``` + +**获取信号量**:当信号量值大于零时,线程将获得信号量,并且相应的信号量值会减 1 + +```c +rt_err_t rt_sem_take (rt_sem_t sem, rt_int32_t timeout); +``` + +**无等待获取信号量** + +```c +rt_err_t rt_sem_trytake(rt_sem_t sem); +``` + +**释放信号量** + +```c +rt_err_t rt_sem_release(rt_sem_t sem); +``` + +**互斥量** + +当线程持有它,互斥量处于闭锁状态,由这个线程获得它的所有权;当这个线程释放它时,将对互斥量进行开锁,失去它的所有权 + +当一个线程持有互斥量时,其他线程将不能对它进行开锁或持有它 + +**注:在获得互斥量后,请尽快释放互斥量,并且在持有互斥量的过程中,不得再行更改持有互斥量线程的优先级,否则可能人为引入无界优先级反转的问题。** + +**互斥量控制块结构体** + +```c +struct rt_mutex +{ + struct rt_ipc_object parent; /* 继承自 ipc_object 类 */ + + rt_uint8_t ceiling_priority; /* 优先级天花板 */ + rt_uint8_t priority; /* 等待线程中的最高优先级 */ + rt_uint8_t hold; /* 持有线程的持有次数 */ + rt_uint8_t reserved; /* 保留字段 */ + + struct rt_thread *owner; /* 当前拥有互斥量的线程 */ + rt_list_t taken_list; /* 线程持有的对象链表 */ + struct rt_spinlock spinlock; /* 自旋锁 */ +}; +/* rt_mutex_t 为指向互斥量结构体的指针类型 */ +typedef struct rt_mutex* rt_mutex_t; +``` + +**创建互斥量** + +```c +rt_mutex_t rt_mutex_create (const char* name, rt_uint8_t flag); +``` + +**删除互斥量** + +```c +rt_err_t rt_mutex_delete (rt_mutex_t mutex); +``` + + **初始化互斥量** + +```c +rt_err_t rt_mutex_init (rt_mutex_t mutex, const char* name, rt_uint8_t flag); +``` + +**脱离互斥量** + +```c +rt_err_t rt_mutex_detach (rt_mutex_t mutex); +``` + +**获取互斥量** + +```c +rt_err_t rt_mutex_take (rt_mutex_t mutex, rt_int32_t timeout); +``` + +**无等待获取互斥量** + +```c +rt_err_t rt_mutex_trytake(rt_mutex_t mutex); +``` + +**释放互斥量** + +```c +rt_err_t rt_mutex_release(rt_mutex_t mutex); +``` + + + +**互斥量和信号量不同的是:拥有互斥量的线程拥有互斥量的所有权,互斥量支持递归访问且能防止线程优先级翻转;并且互斥量只能由持有线程释放,而信号量则可以由任何线程释放。** + + + +**事件集** + +可以实现一对多、多对多的同步 + +这种多个事件的集合可以用一个 32 位无符号整型变量来表示,变量的每一位代表一个事件,线程通过 “逻辑与” 或“逻辑或”将一个或多个事件关联起来,形成事件组合。 + +每一个线程可拥有32个事件标志,事件仅用于同步,不提供数据传输功能 + +**事件集控制块结构体** + +```c +struct rt_event +{ + struct rt_ipc_object parent; /* 继承自 ipc_object 类 */ + + /* 事件集合,每一 bit 表示 1 个事件,bit 位的值可以标记某事件是否发生 */ + rt_uint32_t set; + struct rt_spinlock spinlock; +}; +/* rt_event_t 是指向事件结构体的指针类型 */ +typedef struct rt_event* rt_event_t; +``` + +**创建事件集** + +```c +rt_event_t rt_event_create(const char* name, rt_uint8_t flag); +``` + +**删除事件集** + +```c +rt_err_t rt_event_delete(rt_event_t event); +``` + +**初始化事件集** + +```c +rt_err_t rt_event_init(rt_event_t event, const char* name, rt_uint8_t flag); +``` + +**脱离事件集** + +```c +rt_err_t rt_event_detach(rt_event_t event); +``` + +**发送事件** + +```c +rt_err_t rt_event_send(rt_event_t event, rt_uint32_t set); +``` + +**接收事件** + +```c +rt_err_t rt_event_recv(rt_event_t event, + rt_uint32_t set, + rt_uint8_t opt, + rt_int32_t timeout, + rt_uint32_t* recved); +``` + + + +# 二、线程间通信 + +**邮箱** + +开销低、效率高 + +**邮箱控制块结构体** + +```c +struct rt_mailbox +{ + struct rt_ipc_object parent; + + rt_uint32_t* msg_pool; /* 邮箱缓冲区的开始地址 */ + rt_uint16_t size; /* 邮箱缓冲区的大小 */ + + rt_uint16_t entry; /* 邮箱中邮件的数目 */ + rt_uint16_t in_offset, out_offset; /* 邮箱缓冲的进出指针 */ + rt_list_t suspend_sender_thread; /* 发送线程的挂起等待队列 */ + struct rt_spinlock spinlock; /* 自旋锁 */ +}; +typedef struct rt_mailbox* rt_mailbox_t; +``` + + + +**动态创建邮箱** + +```c +rt_mailbox_t rt_mb_create (const char* name, rt_size_t size, rt_uint8_t flag); +``` + +**删除邮箱** + +```c +rt_err_t rt_mb_delete (rt_mailbox_t mb); +``` + +**初始化邮箱** + +```c + rt_err_t rt_mb_init(rt_mailbox_t mb, + const char* name, + void* msgpool, + rt_size_t size, + rt_uint8_t flag) +``` + +**脱离邮箱** + +```c +rt_err_t rt_mb_detach(rt_mailbox_t mb); +``` + +**发送邮件**:线程或者中断服务程序可以通过邮箱给其他线程发送邮件 + +```c +rt_err_t rt_mb_send (rt_mailbox_t mb, rt_ubase_t value); +``` + +**等待方式发送邮件**:用户向指定邮箱发送邮件 + +```c +rt_err_t rt_mb_send_wait (rt_mailbox_t mb, + rt_ubase_t value, + rt_int32_t timeout); +``` + +**发送紧急邮件** + +```c +rt_err_t rt_mb_urgent (rt_mailbox_t mb, rt_ubase_t value); +``` + +**接收邮件** + +```c +rt_err_t rt_mb_recv (rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout); +``` + + + +**消息队列** + +线程间的消息交换、使用串口接收**不定长数据** + +**消息队列控制块结构体** + +```c +struct rt_messagequeue +{ + struct rt_ipc_object parent; + + void* msg_pool; /* 指向存放消息的缓冲区的指针 */ + + rt_uint16_t msg_size; /* 每个消息的长度 */ + rt_uint16_t max_msgs; /* 最大能够容纳的消息数 */ + + rt_uint16_t entry; /* 队列中已有的消息数 */ + + void* msg_queue_head; /* 消息链表头 */ + void* msg_queue_tail; /* 消息链表尾 */ + void* msg_queue_free; /* 空闲消息链表 */ + + rt_list_t suspend_sender_thread; /* 发送线程的挂起等待队列 */ + struct rt_spinlock spinlock; /* 自旋锁 */ +}; +typedef struct rt_messagequeue* rt_mq_t; +``` + +**创建消息队列** + +```c +rt_mq_t rt_mq_create(const char* name, rt_size_t msg_size, + rt_size_t max_msgs, rt_uint8_t flag); +``` + +**删除消息队列** + +```c +rt_err_t rt_mq_delete(rt_mq_t mq); +``` + +**初始化消息队列** + +```c +rt_err_t rt_mq_init(rt_mq_t mq, const char* name, + void *msgpool, rt_size_t msg_size, + rt_size_t pool_size, rt_uint8_t flag); +``` + +**脱离消息队列** + +```c +rt_err_t rt_mq_detach(rt_mq_t mq); +``` + +**发送消息** + +```c +rt_err_t rt_mq_send (rt_mq_t mq, const void *buffer, rt_size_t size); +``` + +**等待方式发送消息** + +```c +rt_err_t rt_mq_send_wait(rt_mq_t mq, + const void *buffer, + rt_size_t size, + rt_int32_t timeout); +``` + +**发送紧急消息** + +```c +rt_err_t rt_mq_urgent(rt_mq_t mq, const void *buffer, rt_size_t size); +``` + +**接收消息** + +```c +rt_ssize_t rt_mq_recv(rt_mq_t mq, + void *buffer, + rt_size_t size, + rt_int32_t timeout); +``` + diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\214\345\244\251\347\254\224\350\256\260/\347\272\277\347\250\213\347\256\241\347\220\206.md" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\214\345\244\251\347\254\224\350\256\260/\347\272\277\347\250\213\347\256\241\347\220\206.md" new file mode 100644 index 0000000000000000000000000000000000000000..161c5835a6d0b59de530c0be9fb63ba8c925ec1e --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\214\345\244\251\347\254\224\350\256\260/\347\272\277\347\250\213\347\256\241\347\220\206.md" @@ -0,0 +1,100 @@ +# 一、嵌入式实时操作系统 + +裸机模式缺陷:并发性、实时性、可维护性、可重用性 + +### 任务的实体:线程(“分而治之”) + +### RTOS精髓:多任务系统(并不是真正的同时进行多个任务,只是每个任务之间的间隔时间很短,在看起来就是多个任务同时进行) + +![启动流程](D:\TYPORA\figures\rtt_startup.png) + +board函数:初始化串口 + +main()函数优先级为10(timer可设置为4),idle函数的优先级最低(31) + +### 线程控制块(管理线程的顺序) + +线程:线程控制块+入口函数 + +结构体继承自基类:rt_object + +## 线程属性 + +线程栈:线程具有独立的栈空间 + +线程状态:初始状态、就绪状态、运行状态、挂起状态、关闭状态 + +从运行到挂起:delay延时,信号量、互斥量的获取; + +从挂起到运行的回复:信号量的释放; + +创建线程可以动态创建rt_thread_create(),也可以静态创建rt_thread_init() + +优先级:最大支持256个线程优先级(0-255),数值越小优先级越高,最低优先级默认分配给空闲线程使用(idle) + +时间片:优先级相同时,时间片起作用(仅对优先级相同的就绪态起作用) + +入口函数:void(*entry)(void * parameter) + +空闲线程(idle):优先级最低,线程状态永远为就绪态。通常是一个死循环,永远不能被挂起。主要用于:资源回收,提供钩子函数(钩入功耗管理、看门狗喂狗等工作) + +## 主线程:main() + +# 线程管理API + +### 线程初始化 + +静态线程创建(静态数组)rt_thread_init():用户提供的首地址需要对齐 + +动态线程创建rt_thread_create() + +### 线程启动 + +rt_err_t rt_thread_stratup() + +### 线程延时——让出CPU使用权 + +![image-20260818140556194](D:\TYPORA\figures\image-20260818140556194.png) + + + +# 二、SCons构建系统 + +SCons是RT-Thread常见的构建工具,主要用于管理工程编译过程,基于Python脚本描述工程结构,能够自动完成源文件扫描、编译、链接和工程生成 + +### 1.SCons的作用 + +1.1管理工程源文件 + +1.2配置编译器和链接器 + +1.3设置头文件路径 + +1.4设置宏定义和编译选项 + +1.5执行增量编译 + +1.6生成目标文件和工程文件 + +### 2.常见文件 + +RT-Thread工程中常见的构建文件包括:SConstruct、SConscript、rtconfig.py、Kconfig + +### 3.构建流程 + +读取SConstruct->解析各目录下的SConscript->收集源文件和依赖关系->调用编译器->调用链接器->生成ELF/HEX/BIN文件 + +### 4.常见命令 + +``` +scons #编译工程 +``` + +``` +scons -j4 #使用4个并行任务编译 +``` + +``` +scons --target=mdk5 #生成Keil MDK5工程 +``` + diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/DAY5.md" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/DAY5.md" new file mode 100644 index 0000000000000000000000000000000000000000..3436ee9d8bbf351327780a938cd590f9228116a6 --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/DAY5.md" @@ -0,0 +1,107 @@ +# 软件包 + +软件包是通过env下面的packages目录引入的 + +![image-20260823142520360](D:\TYPORA\figures\image-20260823142520360.png) + +![image-20260823145610355](D:\TYPORA\figures\image-20260823145610355.png) + +![image-20260823150634994](D:\TYPORA\figures\image-20260823150634994.png) + +![image-20260823151127311](D:\TYPORA\figures\image-20260823151127311.png) + +# 虚拟文件系统 + +文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型 (Abstract data type),是一种用于向用户提供底层数据访问的机制。文件系统通常存储的基本单位是文件,即数据是按照一个个文件的方式进行组织。当文件比较多时,将导致文件繁多,不易分类、重名的问题。 + +**DFS设备虚拟文件系统** + +### 文件管理 + +**打开或创建文件** + +```c +int open(const char *file, int flags, ...); +``` + +**关闭文件** + +``` +int close(int fd); +``` + +**读取文件内容** + +``` +int read(int fd, void *buf, size_t len); +``` + +**向文件写入数据** + +``` +int write(int fd, const void *buf, size_t len); +``` + +**重命名文件** + +``` +int rename(const char *old, const char *new); +``` + +**获取文件状态** + +``` +int stat(const char *file, struct stat *buf); +``` + +**删除文件** + +``` +int unlink(const char *pathname); +``` + +**同步文件数据** + +```c +int fsync(int fildes); +``` + +**查询文件系统相关信息** + +```c +int statfs(const char *path, struct statfs *buf); +``` + +### 目录管理 + +**创建目录** + +```c +int mkdir(const char *path, mode_t mode); +``` + +**删除目录** + +```c +int rmdir(const char *pathname); +``` + +**打开目录** + +```c +DIR* opendir(const char* name); +``` + +**关闭目录** + +```c +int closedir(DIR* d); +``` + +**读取目录** + +```c +struct dirent* readdir(DIR *d); +``` + +![image-20260823154631154](D:\TYPORA\figures\image-20260823154631154.png) \ No newline at end of file diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817112957813.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817112957813.png" new file mode 100644 index 0000000000000000000000000000000000000000..8cbefd2821fc003691fc15a62e6fc8b10e3fa467 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817112957813.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817113502159.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817113502159.png" new file mode 100644 index 0000000000000000000000000000000000000000..685d7fb5b5eeefc01cfad53b85e4cac38945469b Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817113502159.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817142648941.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817142648941.png" new file mode 100644 index 0000000000000000000000000000000000000000..4bf38e6b886dfa690e5a7d726f15856157c6115b Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817142648941.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817143835258.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817143835258.png" new file mode 100644 index 0000000000000000000000000000000000000000..2ca7c09e48ba4d65780d5a1a5792b9c101bc3ecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817143835258.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817144051657.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817144051657.png" new file mode 100644 index 0000000000000000000000000000000000000000..b3b6900b033d2ba826f94883eab89d955ede7434 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817144051657.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817150046870.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817150046870.png" new file mode 100644 index 0000000000000000000000000000000000000000..95ab187ec4ddb3bd3eb788ab13f0dea61a728a80 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817150046870.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817150446388.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817150446388.png" new file mode 100644 index 0000000000000000000000000000000000000000..c0435456a9dbaaf4aa0dbb0f6c12ccc6d3230ecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817150446388.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817151244692.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817151244692.png" new file mode 100644 index 0000000000000000000000000000000000000000..adf1c1cd27e5acbf0b9d5aa20a8ffebf8f0fbdc5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817151244692.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817152048721.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817152048721.png" new file mode 100644 index 0000000000000000000000000000000000000000..4e39cef8d61f44e369319918be0b95fc35beace8 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817152048721.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817152317118.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817152317118.png" new file mode 100644 index 0000000000000000000000000000000000000000..74f66f4df025334e505c57b42daffa5aa8db5d48 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260817152317118.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818140556194.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818140556194.png" new file mode 100644 index 0000000000000000000000000000000000000000..35ad6963fe9d9e24b90b02a92da4a88996349be1 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818140556194.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818164439722.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818164439722.png" new file mode 100644 index 0000000000000000000000000000000000000000..a7a945d850b8166e44fe27032c825f6fc4120d9e Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818164439722.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818202039012.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818202039012.png" new file mode 100644 index 0000000000000000000000000000000000000000..8aeb7b88e692feaf17ef61fcf1f8480a5987806a Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818202039012.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818210556117.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818210556117.png" new file mode 100644 index 0000000000000000000000000000000000000000..c22ddb4cc9edf0f30552b564c6c478f4de57f996 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818210556117.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818210605960.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818210605960.png" new file mode 100644 index 0000000000000000000000000000000000000000..c22ddb4cc9edf0f30552b564c6c478f4de57f996 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818210605960.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818210732275.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818210732275.png" new file mode 100644 index 0000000000000000000000000000000000000000..af7b05423b82c2281ec468ea8cd1ced2e2e4a3c5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818210732275.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818210821589.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818210821589.png" new file mode 100644 index 0000000000000000000000000000000000000000..4a0f90d7a951c426897f02ccb2eac4a0982376a5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818210821589.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818211005741.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818211005741.png" new file mode 100644 index 0000000000000000000000000000000000000000..ff0da8904baeebbbd649d90ffadf5181b08d7389 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818211005741.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818211045732.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818211045732.png" new file mode 100644 index 0000000000000000000000000000000000000000..6e56fc96a1b0a365e022e9f933be18b720ee294a Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260818211045732.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819144141632.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819144141632.png" new file mode 100644 index 0000000000000000000000000000000000000000..3ee96e6ac8528e5088c75d32c3665f0f96fd5714 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819144141632.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819150611545.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819150611545.png" new file mode 100644 index 0000000000000000000000000000000000000000..33080ef05321f65e8c45b64c205bb22af2958773 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819150611545.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819150625868.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819150625868.png" new file mode 100644 index 0000000000000000000000000000000000000000..689b648403c348a4a9675a375dbd1f5638390c15 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819150625868.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819152800741.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819152800741.png" new file mode 100644 index 0000000000000000000000000000000000000000..33080ef05321f65e8c45b64c205bb22af2958773 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819152800741.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819155711526.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819155711526.png" new file mode 100644 index 0000000000000000000000000000000000000000..fd5ff0b2aa64dd9f143979addca012c5288f82ac Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819155711526.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819165949131.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819165949131.png" new file mode 100644 index 0000000000000000000000000000000000000000..d91a94d74a42ec2dbefbeebc03c736228db8b8dd Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260819165949131.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260822145548675.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260822145548675.png" new file mode 100644 index 0000000000000000000000000000000000000000..7bb5708ae778c7d52b349a0c3de3bdcc4f441a44 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260822145548675.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260822145554303.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260822145554303.png" new file mode 100644 index 0000000000000000000000000000000000000000..7bb5708ae778c7d52b349a0c3de3bdcc4f441a44 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260822145554303.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260822145612979.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260822145612979.png" new file mode 100644 index 0000000000000000000000000000000000000000..3b23aefc9b52fd5ba2c150c460f58a7cd512812f Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260822145612979.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260822154735492.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260822154735492.png" new file mode 100644 index 0000000000000000000000000000000000000000..b2629eb7e7461f257f7f76b57f9374ee1e92a64f Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260822154735492.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260822203644521.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260822203644521.png" new file mode 100644 index 0000000000000000000000000000000000000000..ee3c3d853d9ab0a69e437505a24d856beb119b05 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260822203644521.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823142520360.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823142520360.png" new file mode 100644 index 0000000000000000000000000000000000000000..7b799dd2d54dc9cad33e84702224139ce1428f97 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823142520360.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823145424252.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823145424252.png" new file mode 100644 index 0000000000000000000000000000000000000000..521192b2d36580df412633e55b5fd8fd0dd0e1a7 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823145424252.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823145610355.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823145610355.png" new file mode 100644 index 0000000000000000000000000000000000000000..2f9bff82e59a9c61f50f8d7ffe8e2673a82059eb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823145610355.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823150634994.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823150634994.png" new file mode 100644 index 0000000000000000000000000000000000000000..44dadd3b711e514421413d3c5f13f415ac241d98 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823150634994.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823151127311.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823151127311.png" new file mode 100644 index 0000000000000000000000000000000000000000..ec881066e5bd494b08f7dd0c4f217f77bd6ea444 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823151127311.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823154631154.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823154631154.png" new file mode 100644 index 0000000000000000000000000000000000000000..0cbb2e1f9e63631762e2fca8a8c46723731d309d Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823154631154.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823180827031.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823180827031.png" new file mode 100644 index 0000000000000000000000000000000000000000..305d617d4ced0ea7ec001483bf82a2a43a0a58d2 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823180827031.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823180914037.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823180914037.png" new file mode 100644 index 0000000000000000000000000000000000000000..1cec986751089fc603c34c66d7882a886edf8623 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823180914037.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823181133178.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823181133178.png" new file mode 100644 index 0000000000000000000000000000000000000000..6028d858cf0f4627cd303c7a81ad0fb65f166f3b Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823181133178.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823192551698.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823192551698.png" new file mode 100644 index 0000000000000000000000000000000000000000..6739e49b52bf1fc123fea06b6645b6c552cd9465 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/image-20260823192551698.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/rtt_startup.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/rtt_startup.png" new file mode 100644 index 0000000000000000000000000000000000000000..04dbb79fed05b7463c5ceea179f5dd75c6553724 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/rtt_startup.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" new file mode 100644 index 0000000000000000000000000000000000000000..800ec298cc4dd2fa7599d475a0c8f3bf52a3eecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" new file mode 100644 index 0000000000000000000000000000000000000000..95e8ab4ef99114778b540f5d2755243bfb511a95 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" new file mode 100644 index 0000000000000000000000000000000000000000..e4fb0f0ce5fae09fda464fe2b060422cbe7ad598 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\344\272\224\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/DAY4.md" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/DAY4.md" new file mode 100644 index 0000000000000000000000000000000000000000..3c30046a27393abcd516ec5dbd149436d670d349 --- /dev/null +++ "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/DAY4.md" @@ -0,0 +1,205 @@ +# 设备驱动 + +### 一、RT-Thread I/O设备框架概念 + +**SPI**:驱动和设备分离,提供统一的API + +更换MCU只需要改变对应的对接驱动;重新驱动设备,只需要重新编写设备驱动相关代码;同一API接口,学习成本低;分离后设备驱动可以入库,供公司其他项目使用,减少碎片化开发,防止反复造轮子;代码框架会变复杂 + +I/O提供一套接口open write read control close + +SPI I2C GPIO RTC WDG特定API + +**字符设备**:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。此类设备支持按字节/字符来读写数据 + +**块设备**:应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。不支持基于字符的寻址 + +**字符设备只能顺序读取,块设备可以随机读取** + +### 二、RT-Thread I/O API + +**创建/销毁设备** + +``` +rt_device_t rt_device_create(int type,int attach_size); +void rt_device_destroy(rt_device_t device); +``` + +**注册/注销** + +``` +rt_err_t rt_device_register(rt_device_t dev,const char* name,rt_uint8_t flags); +rt_err_t rt_device_unregister(rt_device_t dev); +``` + +**注册字符设备** + +![image-20260822145612979](D:\TYPORA\figures\image-20260822145612979.png) + +![image-20260822145554303](D:\TYPORA\figures\image-20260822145554303.png) + +**查找设备/初始化设备** + +``` +rt_device_t rt_device_find(const char* name); +rt_err_t rt_device_init(rt_device_t dev); +``` + +**打开和关闭设备** + +``` +rt_err_t rt_device_open(rt_device_t dev,rt_uint16_t oflags); +rt_err_t rt_device_close(rt_device_t dev); +``` + +**控制设备** + +``` +rt_err_t rt_device_control(rt_device_t dev,rt_uint8_t cmd,void* arg); +``` + +**读取设备** + +``` +rt_size_t rt_device_read(rt_device_t dev,rt_off_t pos,void* buffer,rt_size_t size); +rt_size_t rt_device_write(rt_device_t dev,rt_off_t pos,const void* buffer,rt_size_t size); +``` + +**数据接收回调** + +``` +rt_err_t rt_device_set_rx_indicate(rt_device_t dev,rt_err_t(*rx_ind)(rt_device_t dev,rt_size_t size)); +``` + +**数据发送回调** + +``` +rt_err_t rt_device_set_tx_complete(rt_device_t dev,rt_err_t (*tx_done)(rt_device_t dev,void *buffer)); +``` + +### 三、RT-Thread GPIO 外设开发 + +芯片上的引脚一般分为:电源、时钟、控制、I/O + +**可编程控制中断**:上升沿触发、下降沿触发、高电平触发、低电平触发、双边沿触发 + +**相关接口** + +rt_pin_mode():设置引脚模式 + +rt_pin_write():设置引脚电平 + +rt_pin_read() :读取引脚电平 + +rt_pin_attach_irq() :绑定引脚中断回调函数 + +rt_pin_irq_enable() 使能引脚中断 + +rt_pin_detach_irq() :脱离引脚中断回调函数 + +**配置GPIO引脚模式** + +``` +void rt_pin_mode(rt_base_t pin,rt_base_t mode); +``` + +**输出电平** + +``` +void rt_pin_write(rt_base_t pin,rt_base_t value); +``` + +value可取:PIN_LOW低电平,PIN_HIGH高电平 + +**读取引脚电平** + +``` +int rt_pin_read(rt_base_t pin); +``` + + + +### 四、RT-Thread I2C 外设开发 + +常见的I2C总线: + +低速模式:10Kbit/s + +标准模式:100Kbit/s + +快速模式:400Kbit/s + +高速模式:3.4Mbit/s + +**起始位(S)**:在SCL为高电平时,SDA由高电平变为低电平 + +**结束位(P)**:在SCL为高电平时,SDA由低电平变为高电平 + +![image-20260822154735492](D:\TYPORA\figures\image-20260822154735492.png) + +**应答(ACK)**:拉低SDA线,并在SCL为高电平期间保持SDA线位低电平 + +**非应答(NOACK)**:不要拉低SDA线(此时SDA线位高电平),并在SCL为高电平期间保持SDA线为高电平 + +**查找设备** + +``` +rt_device_t rt_device_find(const char* name); +``` + +``` +struct rt_i2c_bus_device *i2c_bus; +i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(name); +``` + +**传输** + +``` +rt_size_t rt_i2c_transfer(struct rt_i2c_bus_device *bus,struct rt_i2c_msg msgs[],rt_uint32_t num); +struct rt_i2c_msg +{ + rt_uint16_t addr; + rt_uint16_t flags; + rt_uint16_t len; + rt_uint8_t *buf; +} +``` + +**消息数据类型**:从机地址、读写标志、读写数据字节数、读写缓冲区指针 + +**I2C使用思路**:查找I2C总线设备;构造msgs消息;启动transfer传输;处理结果 + +### 五、RT-Thread SPI 外设开发 + +**SPI串行外设接口**:是一种高速、全双工、同步通信总线,常用语短距离通讯,主要应用于EEPROM、FLASH、实时时钟、AD转换器、还有数字信号处理器和数字信号解码器之间 + +**挂载SPI设备** + +``` +rt_err_t rt_spi_bus_attach_device(struct rt_spi_device *device,const char *name,const char *bus_name,void *user_data) +``` + +**查找设备** + +``` +rt_device_t rt_device_find(const char* name); +``` + +**传输数据(一次通信)** + +``` +rt_size_t rt_spi_transfer(struct rt_spi_device *device,const void *send_buf,void *recv_buf,rt_size_t length); +``` + +**接收一次数据** + +``` +rt_size_t rt_spi_recv(struct rt_spi_device *device,void *recv_bif,rt_size_t length); +``` + +**连续两次发送数据** + +``` +rt_err_t rt_spi_send_then_send(struct rt_spi_device *device,const void *send_buf1,rt_size_t send_length1,const void *send_buf2,rt_size_t send_length2); +``` + diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817112957813.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817112957813.png" new file mode 100644 index 0000000000000000000000000000000000000000..8cbefd2821fc003691fc15a62e6fc8b10e3fa467 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817112957813.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817113502159.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817113502159.png" new file mode 100644 index 0000000000000000000000000000000000000000..685d7fb5b5eeefc01cfad53b85e4cac38945469b Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817113502159.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817142648941.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817142648941.png" new file mode 100644 index 0000000000000000000000000000000000000000..4bf38e6b886dfa690e5a7d726f15856157c6115b Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817142648941.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817143835258.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817143835258.png" new file mode 100644 index 0000000000000000000000000000000000000000..2ca7c09e48ba4d65780d5a1a5792b9c101bc3ecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817143835258.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817144051657.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817144051657.png" new file mode 100644 index 0000000000000000000000000000000000000000..b3b6900b033d2ba826f94883eab89d955ede7434 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817144051657.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817150046870.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817150046870.png" new file mode 100644 index 0000000000000000000000000000000000000000..95ab187ec4ddb3bd3eb788ab13f0dea61a728a80 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817150046870.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817150446388.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817150446388.png" new file mode 100644 index 0000000000000000000000000000000000000000..c0435456a9dbaaf4aa0dbb0f6c12ccc6d3230ecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817150446388.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817151244692.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817151244692.png" new file mode 100644 index 0000000000000000000000000000000000000000..adf1c1cd27e5acbf0b9d5aa20a8ffebf8f0fbdc5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817151244692.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817152048721.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817152048721.png" new file mode 100644 index 0000000000000000000000000000000000000000..4e39cef8d61f44e369319918be0b95fc35beace8 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817152048721.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817152317118.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817152317118.png" new file mode 100644 index 0000000000000000000000000000000000000000..74f66f4df025334e505c57b42daffa5aa8db5d48 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260817152317118.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818140556194.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818140556194.png" new file mode 100644 index 0000000000000000000000000000000000000000..35ad6963fe9d9e24b90b02a92da4a88996349be1 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818140556194.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818164439722.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818164439722.png" new file mode 100644 index 0000000000000000000000000000000000000000..a7a945d850b8166e44fe27032c825f6fc4120d9e Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818164439722.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818202039012.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818202039012.png" new file mode 100644 index 0000000000000000000000000000000000000000..8aeb7b88e692feaf17ef61fcf1f8480a5987806a Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818202039012.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818210556117.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818210556117.png" new file mode 100644 index 0000000000000000000000000000000000000000..c22ddb4cc9edf0f30552b564c6c478f4de57f996 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818210556117.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818210605960.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818210605960.png" new file mode 100644 index 0000000000000000000000000000000000000000..c22ddb4cc9edf0f30552b564c6c478f4de57f996 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818210605960.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818210732275.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818210732275.png" new file mode 100644 index 0000000000000000000000000000000000000000..af7b05423b82c2281ec468ea8cd1ced2e2e4a3c5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818210732275.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818210821589.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818210821589.png" new file mode 100644 index 0000000000000000000000000000000000000000..4a0f90d7a951c426897f02ccb2eac4a0982376a5 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818210821589.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818211005741.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818211005741.png" new file mode 100644 index 0000000000000000000000000000000000000000..ff0da8904baeebbbd649d90ffadf5181b08d7389 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818211005741.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818211045732.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818211045732.png" new file mode 100644 index 0000000000000000000000000000000000000000..6e56fc96a1b0a365e022e9f933be18b720ee294a Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260818211045732.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819144141632.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819144141632.png" new file mode 100644 index 0000000000000000000000000000000000000000..3ee96e6ac8528e5088c75d32c3665f0f96fd5714 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819144141632.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819150611545.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819150611545.png" new file mode 100644 index 0000000000000000000000000000000000000000..33080ef05321f65e8c45b64c205bb22af2958773 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819150611545.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819150625868.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819150625868.png" new file mode 100644 index 0000000000000000000000000000000000000000..689b648403c348a4a9675a375dbd1f5638390c15 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819150625868.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819152800741.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819152800741.png" new file mode 100644 index 0000000000000000000000000000000000000000..33080ef05321f65e8c45b64c205bb22af2958773 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819152800741.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819155711526.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819155711526.png" new file mode 100644 index 0000000000000000000000000000000000000000..fd5ff0b2aa64dd9f143979addca012c5288f82ac Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819155711526.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819165949131.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819165949131.png" new file mode 100644 index 0000000000000000000000000000000000000000..d91a94d74a42ec2dbefbeebc03c736228db8b8dd Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260819165949131.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260822145548675.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260822145548675.png" new file mode 100644 index 0000000000000000000000000000000000000000..7bb5708ae778c7d52b349a0c3de3bdcc4f441a44 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260822145548675.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260822145554303.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260822145554303.png" new file mode 100644 index 0000000000000000000000000000000000000000..7bb5708ae778c7d52b349a0c3de3bdcc4f441a44 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260822145554303.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260822145612979.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260822145612979.png" new file mode 100644 index 0000000000000000000000000000000000000000..3b23aefc9b52fd5ba2c150c460f58a7cd512812f Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260822145612979.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260822154735492.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260822154735492.png" new file mode 100644 index 0000000000000000000000000000000000000000..b2629eb7e7461f257f7f76b57f9374ee1e92a64f Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260822154735492.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260822203644521.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260822203644521.png" new file mode 100644 index 0000000000000000000000000000000000000000..ee3c3d853d9ab0a69e437505a24d856beb119b05 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260822203644521.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823142520360.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823142520360.png" new file mode 100644 index 0000000000000000000000000000000000000000..7b799dd2d54dc9cad33e84702224139ce1428f97 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823142520360.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823145424252.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823145424252.png" new file mode 100644 index 0000000000000000000000000000000000000000..521192b2d36580df412633e55b5fd8fd0dd0e1a7 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823145424252.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823145610355.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823145610355.png" new file mode 100644 index 0000000000000000000000000000000000000000..2f9bff82e59a9c61f50f8d7ffe8e2673a82059eb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823145610355.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823150634994.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823150634994.png" new file mode 100644 index 0000000000000000000000000000000000000000..44dadd3b711e514421413d3c5f13f415ac241d98 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823150634994.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823151127311.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823151127311.png" new file mode 100644 index 0000000000000000000000000000000000000000..ec881066e5bd494b08f7dd0c4f217f77bd6ea444 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823151127311.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823154631154.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823154631154.png" new file mode 100644 index 0000000000000000000000000000000000000000..0cbb2e1f9e63631762e2fca8a8c46723731d309d Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/image-20260823154631154.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/rtt_startup.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/rtt_startup.png" new file mode 100644 index 0000000000000000000000000000000000000000..04dbb79fed05b7463c5ceea179f5dd75c6553724 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/rtt_startup.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" new file mode 100644 index 0000000000000000000000000000000000000000..800ec298cc4dd2fa7599d475a0c8f3bf52a3eecb Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102048.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" new file mode 100644 index 0000000000000000000000000000000000000000..95e8ab4ef99114778b540f5d2755243bfb511a95 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 102442.png" differ diff --git "a/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" new file mode 100644 index 0000000000000000000000000000000000000000..e4fb0f0ce5fae09fda464fe2b060422cbe7ad598 Binary files /dev/null and "b/2026/\347\254\2542\347\273\204/\346\275\230\351\234\236/\347\254\224\350\256\260/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2026-08-17 104304.png" differ