From e5de3825d60b3d7395a7d91ceb29cb0da21a9749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AB=AF=E6=9C=A8=E6=B0=B8=E4=B9=90?= Date: Mon, 21 Jul 2025 15:37:12 +0800 Subject: [PATCH 1/8] dm_test --- .../\344\275\234\344\270\232/test" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/test" diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/test" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/test" new file mode 100644 index 0000000..e69de29 -- Gitee From c9d3f9a8bfca13baf25111b5b94f16b19b04b6ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AB=AF=E6=9C=A8=E6=B0=B8=E4=B9=90?= Date: Mon, 21 Jul 2025 15:43:28 +0800 Subject: [PATCH 2/8] test_day1 --- .../\344\275\234\344\270\232/DAY1_homework" | 0 .../\347\254\224\350\256\260/DAY1_note" | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/test" => "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/DAY1_homework" (100%) create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/DAY1_note" diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/test" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/DAY1_homework" similarity index 100% rename from "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/test" rename to "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/DAY1_homework" diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/DAY1_note" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/DAY1_note" new file mode 100644 index 0000000..e69de29 -- Gitee From c0e9dbb20979ac0a051e9df4e72898c45fcb685d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AB=AF=E6=9C=A8=E6=B0=B8=E4=B9=90?= Date: Mon, 21 Jul 2025 16:28:35 +0800 Subject: [PATCH 3/8] day1_dm_note --- .../\344\275\234\344\270\232/DAY1_homework" | 0 ...\2541\345\244\251\344\275\234\344\270\232" | 2 + .../\347\254\224\350\256\260/DAY1_note" | 0 ...41\345\244\251\347\254\224\350\256\260.md" | 279 ++++++++++++++++++ 4 files changed, 281 insertions(+) delete mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/DAY1_homework" create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2541\345\244\251\344\275\234\344\270\232" delete mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/DAY1_note" create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2541\345\244\251\347\254\224\350\256\260.md" diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/DAY1_homework" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/DAY1_homework" deleted file mode 100644 index e69de29..0000000 diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2541\345\244\251\344\275\234\344\270\232" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2541\345\244\251\344\275\234\344\270\232" new file mode 100644 index 0000000..02e8995 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2541\345\244\251\344\275\234\344\270\232" @@ -0,0 +1,2 @@ +笔记已提交 +PR链接已填写 diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/DAY1_note" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/DAY1_note" deleted file mode 100644 index e69de29..0000000 diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2541\345\244\251\347\254\224\350\256\260.md" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2541\345\244\251\347\254\224\350\256\260.md" new file mode 100644 index 0000000..de5f85d --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2541\345\244\251\347\254\224\350\256\260.md" @@ -0,0 +1,279 @@ +# 2025RT-Thread夏令营笔记 +## 一、环境搭建 +### 上午 +下载env、rt-thread源码 + +在运行env.bat文件进行安装env环境 +打开env 选择setting选项 创建右键入口 + +打开rt-thread源码,在bsp板载支持包中选择qume -a9 + +右键进入env 先进行一次menuconfig操作 得到config文件 然后退出 + +scons -j4编译 + +qemu-nographic.bat 运行编译好的文件 + +在env环境中进入menuconfig 安装lvgl软件包 + +pkgs --update 更新的当前工程 + +scons -j4编译 + +qemu 跑lvgl的demo + +在VSCODE中打开qemu -a9文件夹 appliaction中main.c进行代码编写 + +回到env进行scons -j4编译 + +qemu-nographic.bat 运行编译好的文件 + +## git的使用 +### 下午 +在vscode中安装Git Graph插件 + +Fork 2025RTT笔记 通过SSH的方式拉去到本地 + +按照要求创建自己的笔记和作业 + +git checkout -b test 创建自己的分支 + +提交到test分支上 + +在gitee上进行PR请求 +### 常用的git命令 +# 初始化GIT + +1.查看当前git 版本 + +Terminal终端或者git bash下: + +git --version + +2.使用git之前 先配置自己的用户名和邮箱 + +git config --global user.name "DMYL" + + git config --global user.email HPU_DMYL@163.com + +其中global 表示对所有仓库都有效 设置为DMYL + +保存用户名和邮箱 避免重复输入 + + git config --global credential.helper store + +git config --global --list + +# 初始化仓库 + +首先创建一个本地仓库(放置在本地文件夹内) +mkdir learn_git + +cd learn_git + +仓库初始化 git_init + +PS E:\learn_git> git init +返回:Initialized empty Git repository in E:/learn_git/.git/ + +查看当前仓库所有文件夹 +ls -a + +查看本地仓库的所有内容 + +ls -ltr +## 创建仓库 + + +除了在文件夹下 git init使当前文件夹成为一个git仓库 还可以使用git clone "仓库网址" 来实现 +或者是git init 仓库名字 表明在当前目录下创建一个仓库并初始化 + +# GIT的工作区域与文件状态 + +## GIT主要分为三个区 + +1.工作区:也就是自己本地磁盘中的文件夹 + +2.暂存区:临时保存的区域,用于保存即将提交到git仓库的修改内容 版本控制重要区域 + +3.本地仓库:git init创建的本地仓库 git存储代码与各种修改信息 + +工作区--> git add -->暂存区 --> git commit -->本地仓库 + +## GIT文件状态 + +1.未跟踪:我们新创建还没被git管理的文件 + +2.未修改:被git管理的文件但是没有进行修改 + +3.已修改:修改了文件没添加到暂存区 + +4.已暂存:随时可以递交到仓库的文件 +![[GIT文件管理层级关系.png]] + +# 添加与提交文件 + +git init 创建仓库 + +git status 查看仓库的状态 + +git add 添加到暂存区 + +git commit 提交 + +git log 查看提交记录 + +git reflog 查看git命令的所有操作记录 + + +将未跟踪的文件进入暂存区 git add 文件名 撤销此操作使用git rm --cached 文件名 + +也可以使用通配符批量操作文件 git add ****txt (以txt结尾的文件加入) git add . (当前目录下所有文件加入暂存区) + +将暂存区的文件提交 git commit -m “需要记录的信息” + +# GIT RESET/GIT DIFF/GIT RM 操作 +git reset 三种模式: +![[git reset 三种模式.png]] +git diff 查看工作区、暂存区、本地仓库之间的差异 + +git diff 不加参数 默认比较工作区和暂存区的 + +git diff HEAD 比较工作区与版本库的差异 HEADh的意思是 当前分支的最新提交版本 也可以使用git diff 版本号1 版本号2进行差异比较 HEAD~x HEAD 表示查看HEAD之前的x个版本的差异 +git diff 文件名 查看这个文件的差异内容 + +git diff --cached 比较暂存区和版本库的差异 + +![[git diff总结.png]] + +rm 文件名 在本地磁盘删除文件 git add file再暂存删除内容 + +git ls-files 查看暂存区的文件 + +git rm 文件名 在暂存区删除文件 + +git rm --cached 文件名 文件从暂存区删除 但仍然保留在工作区中 + +git rm -r* 递归删除某个目录下的所有子目录和文件 + +删除操作完成后 进行 git commit -m "记录信息" + +# GIT IGNORE 操作 + +对于: +1.系统或软件自动生成的文件 +2.编译产生的中间文件和结果文件 +3.运行时生成的日志文件、缓冲文件 +4.涉及身份、密码、口令、密钥等敏感信息的文件 +这些文件不需要进行放入版本库 + +首先创建一个.gitignore的文件 + +echo "内容" > .gitignore + +在.gitignore文件中 编写需要忽略的文件 + +使用命令 vi .gitignore 改变忽略的内容 + +实例: +![[gitignore规则.png]] +![[ignore实例.png]] + +# GITHUB远程仓库 + +Duanmu123@ gmail + +1.首先在github上创建一个仓库 + +2.复制SSH连接操作 + +3.创建自己的SSH密钥 + +cd 到根目录 在根目录下执行 + +ssh-keygen -t rsa -b 4096 + +cd .ssh 查看私钥和公钥 公钥上传github + +4.git clone 第二部的复制操作 + +5.修改更新文件后 add commit 到本地仓库 + +6.git push 提交到远程仓库 + git remote add origin git@github.com:YongleDuanmu/remote-repo.git (本地仓库与远程仓库关联) + origin指的是远程仓库的别名 + +git branch -M main +指定分支的名称为main + +git push -u origin main:main +本地仓库与别名为origin的仓库关联起来 本地的main分支推送给远程的main分支 + +成功上传到github + +![[Pasted image 20250512131624.png]] +git pull (远程仓库的别名) (分支名称) + +git pull origin main + +git remote -v 查看当前仓库所关联的远程仓库 + +code . 当前目录在vscode打开 + +![[VSCODE中有关git的操作.png]] + +# 分支简介与操作 + + git branch 查看当前仓库的所有分支 + + git branch new-branch-name 创建新的分支 + + git checkout branch-name 切换的指定分支上 + + git switch branch-name + + git merge branch-name 把branch-name分支合并到当前分支 (首先要切换到当前分支) + 执行之后会自动产生一次提交 + + git log --graph --oneline --decorate --all 查看分支图 + git branch -d branch-name 删除已经合并之后的分支 + git branch -D branch-name 强制删除一个分支 +总结: +![[分支命令.png]] + +## 解决分支冲突: + +手动查看冲突文件 git diff + +然后打开冲突的文件 进行手工修改 + +最后 git add . git commit -m “提交信息” +![[合并冲突解决.png]] + +## Rebase 与 回退操作 + +Rebase + git switch branch-name1 + git rebase branch-name2 + 从分叉点把整个分支branch-name2都移动到目标分支branch-name1的最新提交记录后面 + +恢复 + git checkout -b branch-name ID号 + +Rebase 与 Merge的区别: + +Merge: +优点:不会破坏原分支节点的提交历史,方便回溯与查看 +缺点:会产生额外的提交节点,分支图比较复杂 + +Rebase: +优点:不会新增额外的提交记录,形成线性历史,比较直观和干净 +缺点:会改变提交历史,改变了当前分支最新提交的节点 避免在共享分支使用 + +# 分支管理与工作流模型 + +GITHUB FLOW Model +![[GITHUB FLOW.png]] + +建议: +![[Pasted image 20250512154339.png]] -- Gitee From d377fe9f1dee3086ece05eb744f0546406c7eb3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AB=AF=E6=9C=A8=E6=B0=B8=E4=B9=90?= Date: Tue, 22 Jul 2025 18:15:11 +0800 Subject: [PATCH 4/8] day2_dm --- ...41\345\244\251\344\275\234\344\270\232.md" | 2 + ...542\345\244\251\344\275\234\344\270\232.c" | 58 +++++++++ ...42\345\244\251\347\254\224\350\256\260.md" | 121 ++++++++++++++++++ 3 files changed, 181 insertions(+) create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2541\345\244\251\344\275\234\344\270\232.md" create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2542\345\244\251\344\275\234\344\270\232.c" create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2542\345\244\251\347\254\224\350\256\260.md" diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2541\345\244\251\344\275\234\344\270\232.md" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2541\345\244\251\344\275\234\344\270\232.md" new file mode 100644 index 0000000..02e8995 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2541\345\244\251\344\275\234\344\270\232.md" @@ -0,0 +1,2 @@ +笔记已提交 +PR链接已填写 diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2542\345\244\251\344\275\234\344\270\232.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2542\345\244\251\344\275\234\344\270\232.c" new file mode 100644 index 0000000..1f4cf0f --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2542\345\244\251\344\275\234\344\270\232.c" @@ -0,0 +1,58 @@ + +#include +#include +#include +// main线程与thread3线程实现优先级抢占 +// thread1线程与thread2线程实现时间片轮转 +// thread1线程与thread2线程优先级相同,时间片相同 +// thread3线程优先级高于thread1和thread2,时间片相同 +// thread3线程每500ms打印一次,thread1和thread2线程每次打印一次 +// main线程每500ms打印一次 +#define thread_size 512 +#define thread_pri 15 +#define thread_tick 5 +void thread1_entry() +{ + while (1) + { + rt_kprintf("this is thread1\n"); + } +} + +void thread2_entry() +{ + while (1) + { + rt_kprintf("this is thread2\n"); + } +} + +void thread3_entry() +{ + while (1) + { + rt_kprintf("this is thread3\n"); + rt_thread_mdelay(500); + } +} +int main(void) +{ + rt_thread_t thread1 = RT_NULL; + rt_thread_t thread2 = RT_NULL; + rt_thread_t thread3 = RT_NULL; + thread1 = rt_thread_create("thread1", thread1_entry, RT_NULL, thread_size, thread_pri, thread_tick); + thread2 = rt_thread_create("thread2", thread2_entry, RT_NULL, thread_size, thread_pri, thread_tick); + thread3 = rt_thread_create("thread3", thread3_entry, RT_NULL, thread_size, thread_pri - 1, thread_tick); + if (thread1 != RT_NULL) + rt_thread_startup(thread1); + if (thread2 != RT_NULL) + rt_thread_startup(thread2); + if (thread3 != RT_NULL) + rt_thread_startup(thread3); + while (1) + { + rt_kprintf("main thread\n"); + rt_thread_mdelay(500); + } + return RT_EOK; +} diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2542\345\244\251\347\254\224\350\256\260.md" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2542\345\244\251\347\254\224\350\256\260.md" new file mode 100644 index 0000000..2513374 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2542\345\244\251\347\254\224\350\256\260.md" @@ -0,0 +1,121 @@ +# DAY2 +## RT-Thread Studio开发 +**下载资源包与基础知识** +* 安装STM32F407-ATK-exploer资源包和qemu仿真环境 +* 了解临界区,线程,RT-Thread启动流程,线程状态切换,进行动手操作 +* 简单的汇编命令 + +CPU运行时,先去取得指令,再执行指令 +把内存a的值读入CPU寄存器R0 +把内存b的值读入CPU寄存器R1 +把R0、R1累加,存入RO +4把RO的值写入内存a +==几条汇编指令== +需要我们掌握的汇编指令并不多,只有几条 +读内存指令:LDR,即Load之意 +写内存指令:STR,即Store之意 +加减指令:ADD、SUB +跳转:BL,即Branch And Link +入栈指令:PUSH +出栈指令:POP + +**临界区**:每个进程中访问临界资源的那段程序称之为临界区 + +**线程切换**:![[RTT线程切换.png]] + +**RT-Thread启动流程**: +![[RT-Thread启动流程.png]] +**线程**:运行中的函数,被暂停运行的函数 +如何保存函数:暂停一个函数的时候得先保存它 保存它暂停瞬间的寄存器 放在它的栈里 + + 入口函数 +线程 栈 + (线程控制块创建的时候的那个地址)本质就是一块内存 可以是数组 可以是动态分配) + 线程控制块 +在实际运行中还有一部分:构造栈的内容 + +两种创建线程 静态/动态 +静态:rt_thread_init() 需要指定起始地址 +动态:rt_thraed_create() 函数内部自动分配内存 + +```C +rt_thread_init(1.线程控制块的地址 + 2.线程名字 + 3.入口函数 + 4.入口函数参数 + 5.线程栈起始地址 + 6.栈大小 + 7.线程优先级 + 8.线程时间片大小 + ) + +rt_thread_create(1.线程名字 + 2.入口函数 + 3.入口函数参数 + 4.栈大小 + 5.线程优先级 + 6.线程时间片大小 + ) + +``` +可以看出一个线程主要有上述三个重要主体组成,一个thread重要成员如下: + + ●thread->entry:函数指针 + ● thread->parameter:函数参数 + ● thread->stack_addr:栈的起始地址 + ● thread->stack_size:栈大小 + ● thread->sp:栈顶 : + ``` +thread->sp = (void *)rt_hw_stack_init(thread->entry, thread->parameter, +(rt_uint8_t *)((char *)thread->stack_addr + thread->stack_size - sizeof(rt_ubase_t)), +(void *)rt_thread_exit) + ``` + ● thread->init_priority:初始优先级 + ● thread->current_priority:当前优先级 + ●thread->init_tick:一次能运行多少个tick + ●thread->remaining_tick:当次运行还剩多少个tick +实战coding: +```c +#include +#include +#include + +#define thread_size 512 +#define thread_pri 15 +#define thread_tick 5 +void thread1_entry() +{ + while(1) + { + rt_kprintf("this is thread1\n"); + rt_thread_mdelay(500); + } +} +void thread2_entry() +{ + while(1) + { + rt_kprintf("this is thread2\n"); + rt_thread_mdelay(500); + } +} + +int main(void) +{ + rt_thread_t thread1 = RT_NULL; + rt_thread_t thread2 = RT_NULL; + thread1 = rt_thread_create("thread1", thread1_entry, RT_NULL, thread_size, thread_pri, thread_tick ); + thread2 = rt_thread_create("thread2", thread2_entry, RT_NULL, thread_size, thread_pri, thread_tick ); + if (thread1!=RT_NULL) + rt_thread_startup(thread1); + if (thread2!=RT_NULL) + rt_thread_startup(thread2); + while(1) + { + rt_kprintf("main thread\n"); + rt_thread_mdelay(500); + } + return RT_EOK; +} + +``` \ No newline at end of file -- Gitee From 6d2efdd60c7c77b08f440635d285f2e2144d6608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AB=AF=E6=9C=A8=E6=B0=B8=E4=B9=90?= Date: Tue, 22 Jul 2025 18:15:33 +0800 Subject: [PATCH 5/8] dm_day2_note --- .../\347\254\2541\345\244\251\344\275\234\344\270\232" | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2541\345\244\251\344\275\234\344\270\232" diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2541\345\244\251\344\275\234\344\270\232" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2541\345\244\251\344\275\234\344\270\232" deleted file mode 100644 index 02e8995..0000000 --- "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2541\345\244\251\344\275\234\344\270\232" +++ /dev/null @@ -1,2 +0,0 @@ -笔记已提交 -PR链接已填写 -- Gitee From bb8f8079c9f4a0a5f9f9e4607b240aceba48bf39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AB=AF=E6=9C=A8=E6=B0=B8=E4=B9=90?= Date: Wed, 23 Jul 2025 17:30:56 +0800 Subject: [PATCH 6/8] dm_day3_node --- ...32-\344\272\213\344\273\266\351\233\206.c" | 93 +++++++++++++++ ...232-\344\272\222\346\226\245\351\207\217c" | 64 ++++++++++ ...34\344\270\232-\344\277\241\345\217\267.c" | 45 +++++++ ...32-\344\277\241\345\217\267\351\207\217.c" | 43 +++++++ ...210\346\201\257\351\230\237\345\210\227.c" | 30 +++++ ...234\344\270\232-\351\202\256\347\256\261c" | 31 +++++ ...43\345\244\251\347\254\224\350\256\260.md" | 110 ++++++++++++++++++ 7 files changed, 416 insertions(+) create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\344\272\213\344\273\266\351\233\206.c" create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\344\272\222\346\226\245\351\207\217c" create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\344\277\241\345\217\267.c" create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\344\277\241\345\217\267\351\207\217.c" create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\346\266\210\346\201\257\351\230\237\345\210\227.c" create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\351\202\256\347\256\261c" create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2543\345\244\251\347\254\224\350\256\260.md" diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\344\272\213\344\273\266\351\233\206.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\344\272\213\344\273\266\351\233\206.c" new file mode 100644 index 0000000..2e4e181 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\344\272\213\344\273\266\351\233\206.c" @@ -0,0 +1,93 @@ +// 事件集EVENT demo + +#include +#include +#include + +#define thread_size 512 +#define thread_pri 15 +#define thread_tick 5 +#define EVENT_FLAG3 (1 << 3) +#define EVENT_FLAG5 (1 << 5) + +ALIGN(RT_ALIGN_SIZE) + +uint8_t a = 0; +static rt_mutex_t mut1 = RT_NULL; +rt_event_t event1 = RT_NULL; + +void thread1_entry() +{ + rt_err_t result2; + while (1) + { + result2 = rt_mutex_take(mut1, RT_WAITING_FOREVER); + if (result2 == RT_EOK) + { + rt_kprintf("thread1 get mut1 a = %d\n", a); + rt_event_send(event1, EVENT_FLAG3); + rt_thread_mdelay(500); + rt_mutex_release(mut1); + } + } +} +void thread2_entry() +{ + rt_err_t result; + while (1) + { + result = rt_mutex_take(mut1, RT_WAITING_FOREVER); + if (result == RT_EOK) + { + rt_kprintf("thread2 get mut1 a = %d\n", a); + rt_event_send(event1, EVENT_FLAG5); + rt_thread_mdelay(500); + rt_mutex_release(mut1); + } + } +} + +void thread3_entry() +{ + rt_uint32_t e; + while (1) + { + if (rt_event_recv(event1, (EVENT_FLAG3 | EVENT_FLAG5), RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &e) == RT_EOK) + { + rt_kprintf("thread3 get EVENT a = %d\n", a); + rt_thread_mdelay(500); + } + } +} + +void timer1_cb() +{ + rt_kprintf(" timer a++ %d\n", a); + a++; +} + +int main(void) +{ + rt_timer_t timer1; + rt_thread_t thread1 = RT_NULL; + rt_thread_t thread2 = RT_NULL; + rt_thread_t thread3 = RT_NULL; + + thread1 = rt_thread_create("thread1", thread1_entry, RT_NULL, 512, 11, 5); + thread2 = rt_thread_create("thread2", thread2_entry, RT_NULL, 512, 11, 5); + thread3 = rt_thread_create("thread3", thread3_entry, RT_NULL, 512, 11, 5); + timer1 = rt_timer_create("timer1", timer1_cb, RT_NULL, 1000, RT_TIMER_FLAG_PERIODIC); + mut1 = rt_mutex_create("mut1", RT_IPC_FLAG_FIFO); + event1 = rt_event_create("event1", RT_IPC_FLAG_FIFO); + + rt_timer_start(timer1); + rt_thread_startup(thread1); + rt_thread_startup(thread2); + rt_thread_startup(thread3); + + while (1) + { + rt_thread_mdelay(500); + } + return RT_EOK; +} diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\344\272\222\346\226\245\351\207\217c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\344\272\222\346\226\245\351\207\217c" new file mode 100644 index 0000000..4ff4509 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\344\272\222\346\226\245\351\207\217c" @@ -0,0 +1,64 @@ +#互斥量demo + +#include +#include +#include + +#define thread_size 512 +#define thread_pri 15 +#define thread_tick 5 +uint8_t a = 0; +static rt_mutex_t mut1 = RT_NULL; + +void thread1_entry() +{ + rt_err_t result2; + while (1) + { + result2 = rt_mutex_take(mut1, RT_WAITING_FOREVER); + if (result2 == RT_EOK) + { + rt_kprintf("thread1 get mut1 a = %d\n", a); + rt_thread_mdelay(500); + rt_mutex_release(mut1); + } + } +} +void thread2_entry() +{ + rt_err_t result; + while (1) + { + result = rt_mutex_take(mut1, RT_WAITING_FOREVER); + if (result == RT_EOK) + { + rt_kprintf("thread2 get mut1 a = %d\n", a); + rt_thread_mdelay(500); + rt_mutex_release(mut1); + } + } +} +void timer1_cb() +{ + rt_kprintf(" timer a++ %d\n", a); + a++; +} + +int main(void) +{ + rt_timer_t timer1; + rt_thread_t thread1 = RT_NULL; + rt_thread_t thread2 = RT_NULL; + thread1 = rt_thread_create("thread1", thread1_entry, RT_NULL, 512, 11, 5); + thread2 = rt_thread_create("thread2", thread2_entry, RT_NULL, 512, 11, 5); + timer1 = rt_timer_create("timer1", timer1_cb, RT_NULL, 1000, RT_TIMER_FLAG_PERIODIC); + mut1 = rt_mutex_create("mut1", RT_IPC_FLAG_FIFO); + rt_timer_start(timer1); + rt_thread_startup(thread1); + rt_thread_startup(thread2); + while (1) + { + rt_thread_mdelay(500); + } + return RT_EOK; +} diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\344\277\241\345\217\267.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\344\277\241\345\217\267.c" new file mode 100644 index 0000000..dce41fa --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\344\277\241\345\217\267.c" @@ -0,0 +1,45 @@ +// 线程间通信-信号demo +#include + +#define THREAD_PRIORITY 25 +#define THREAD_STACK_SIZE 512 +#define THREAD_TIMESLICE 5 + +static rt_thread_t tid1 = RT_NULL; + +void thread1_signal_handler(int sig) +{ + rt_kprintf("thread1 received signal %d\n", sig); +} + +static void thread1_entry(void *parameter) +{ + int cnt = 0; + + rt_signal_install(SIGUSR1, thread1_signal_handler); + rt_signal_unmask(SIGUSR1); + + while (cnt < 10) + { + rt_kprintf("thread1 count : %d\n", cnt); + cnt++; + rt_thread_mdelay(100); + } +} + +int signal_sample(void) +{ + tid1 = rt_thread_create("thread1", + thread1_entry, RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY, THREAD_TIMESLICE); + + if (tid1 != RT_NULL) + rt_thread_startup(tid1); + + rt_thread_mdelay(300); + + rt_thread_kill(tid1, SIGUSR1); + + return 0; +} diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\344\277\241\345\217\267\351\207\217.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\344\277\241\345\217\267\351\207\217.c" new file mode 100644 index 0000000..2d5796e --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\344\277\241\345\217\267\351\207\217.c" @@ -0,0 +1,43 @@ +#信号量 &timer demo +#include +#include +#include + +#define thread_size 512 +#define thread_pri 15 +#define thread_tick 5 +uint8_t a = 0; +static rt_sem_t sem1 = RT_NULL; +void thread1_entry() +{ + static rt_err_t result2; + while (1) + { + result2 = rt_sem_take(sem1, RT_WAITING_FOREVER); + if (result2 == RT_EOK) + { + rt_kprintf("a = %d\n", a); + } + } +} +void timer1_cb() +{ + a++; + rt_sem_release(sem1); +} +int main(void) +{ + + rt_timer_t timer1; + rt_thread_t thread1 = RT_NULL; + thread1 = rt_thread_create("thread1", thread1_entry, RT_NULL, 512, 11, 5); + timer1 = rt_timer_create("timer1", timer1_cb, RT_NULL, 1000, RT_TIMER_FLAG_PERIODIC); + sem1 = rt_sem_create("sem1", 0, RT_IPC_FLAG_FIFO); + rt_timer_start(timer1); + rt_thread_startup(thread1); + while (1) + { + rt_thread_mdelay(500); + } + return RT_EOK; +} diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\346\266\210\346\201\257\351\230\237\345\210\227.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\346\266\210\346\201\257\351\230\237\345\210\227.c" new file mode 100644 index 0000000..8718906 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\346\266\210\346\201\257\351\230\237\345\210\227.c" @@ -0,0 +1,30 @@ +// 线程间通信消息队列demo +#include +#include +#include + +rt_mq_t mq1; +rt_thread_t thread1; +rt_thread_t thread2; +void thread1_entry() +{ + char a = 'a'; + rt_mq_send(mq1, &a, 1); + rt_kprintf("thread1 send %c\n", a); +} +void thread2_entry() +{ + char b = RT_NULL; + rt_mq_recv(mq1, &b, 1, RT_WAITING_FOREVER); + rt_kprintf("thread2 rec %c\n", b); +} +int main() +{ + thread1 = rt_thread_create("thread1", thread1_entry, RT_NULL, 512, 15, 5); + thread2 = rt_thread_create("thread2", thread2_entry, RT_NULL, 512, 15, 5); + mq1 = rt_mq_create("mq1", 1, 1, RT_IPC_FLAG_FIFO); + rt_thread_startup(thread1); + rt_thread_startup(thread2); + rt_thread_mdelay(500); + return RT_EOK; +} diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\351\202\256\347\256\261c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\351\202\256\347\256\261c" new file mode 100644 index 0000000..8e36a73 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2543\345\244\251\344\275\234\344\270\232-\351\202\256\347\256\261c" @@ -0,0 +1,31 @@ +// 线程间通信mailbox demo + +#include +#include +#include + +rt_mailbox_t box1; +rt_thread_t thread1; +rt_thread_t thread2; +void thread1_entry() +{ + char a = 'a'; + rt_mb_send(box1, a); + rt_kprintf("thread1 send a\n"); +} +void thread2_entry() +{ + char b = RT_NULL; + rt_mb_recv(box1, &b, RT_WAITING_FOREVER); + rt_kprintf("thread2 rec %c\n", b); +} +int main() +{ + thread1 = rt_thread_create("thread1", thread1_entry, RT_NULL, 512, 15, 5); + thread2 = rt_thread_create("thread2", thread2_entry, RT_NULL, 512, 15, 5); + box1 = rt_mb_create("box1", 2, RT_IPC_FLAG_FIFO); + rt_thread_startup(thread1); + rt_thread_startup(thread2); + rt_thread_mdelay(500); + return RT_EOK; +} diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2543\345\244\251\347\254\224\350\256\260.md" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2543\345\244\251\347\254\224\350\256\260.md" new file mode 100644 index 0000000..25245e0 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2543\345\244\251\347\254\224\350\256\260.md" @@ -0,0 +1,110 @@ +# 定时器的链表操作概述 + +检查定时器每次都会在固定时间去轮流检查每个线程的线程定时器,那里记录着线程的运行时间,当运行时间超过设定值,进入超时函数。这需要有一个定时器链表,方便检查定时器去检查。 + +# 线程间通信IPC + +作用: + +* 互斥操作(关中断) +* 休眠-唤醒(链表) + +不能简单的使用全局变量来做线程间通信的媒介。 + +## 通信机制1:队列 + + +队列中存在消息块,消息块里面放数据。 + +队列初始化时,要确定消息块数量 以及消息块大小 + +队列.写操作时: +有空间:成功 +无空间:报错或者 + 等待一段时间 + 如何退出呢? + 1.有线程读队列,那么写操作可以唤醒 + 2.超时返回ERR + +队列.读操作时: +有数据:成功 +无数据:报错或者 + 等待一段时间 + 1.有线程写队列,读操作可以被唤醒 + 2.超时返回ERR + +Q:如何唤醒读或者写操作? +A:队列中一定会有两个链表,一个是Sendr list 一个是Receive list + +首先 线程读或者写数据 愿意等吗? +1.愿意:继续等 +2.不愿意:挂起 + 1.从Ready_list 移除 + 2.放入MQ(队列)-->parent-->suspend_thread + 3.启动线程自己的定时器 + 被唤醒: + 1.其他线程写或者读队列 + 2.从parent-->suspend_thread拿出唤醒 + 3.等待超时 + +多线程都想读或者写数据,可以规定方式:1.FIFO先用先出2.PRIO优先级排序 + +**写数据写在队列后面,读数据读队列前面** + +## 通信机制2:邮箱 + +链表+定时器+环形缓冲区 + +传递小数据,效率更高 +mailbox固定位5个位置 每个位置是一个unsigned long 数据的存储与队列有差异 +==读== +假如现在B线程要去mailbox读数据,如果现在里面: +1.有数据-->直接读 +2.无数据-->等 如果不等: + B线程进入堵塞(等数据ing) + 把B线程记录在mailboxList中(有数据了去链表找到你) +3.再次唤醒时:1.超时退出 返回ERR 2.被发送者唤醒 + +==写== +线程A去写mailbox数据: +1.有空:直接写 +2.没空:进入堵塞 或者 返回ERR + 把A线程记录在等待写入链表中(方便找到) +3.再次唤醒时:1.超时退出 返回ERR 2.被接受者唤醒 + +# 信号量(sem) + +不传数据 表征CPU资源 +可以非常形象的用停车站的例子: +![[信号量引入.png]] +信号量肯定具有链表和value + +如果value != 0 + 那么线程直接获得CPU资源 +如果value == 0: + 如果 愿意等待: + 从Readylist链表移除(挂起) + 在信号量链表中加入(有资源了去喊你) + 唤醒的原因:1.超时唤醒2.有资源了喊你 + 如果 不愿意等待: + 直接 ERR + +* 缺点: + 1.任意线程都可以释放信号量 + 2.可能出现优先级反转 + +# 互斥量(mutex) + +* 互斥量是特殊的信号量 +* 实现了优先级继承(将互斥量持有者与互斥量等待者提高到同一个优先级,释放后恢复到原先的优先级) +* 谁拥有谁有资格释放 + +互斥量可以被同一个线程多次拥有,互斥量结构体内部具有value,owner,original_priority,hold,hold会在同一个线程多次拥有后进行++。 + +# 事件组(event_grop) + +队列:用来传递数据,大小不限 +邮箱:用来传递数据,数据是一个整数 +信号量:表示资源数量 +互斥量:实现互斥操作,跟信号量的主要区别在于实现了优先级继承 +事件组:实现”等待多个事件” \ No newline at end of file -- Gitee From 1c313b5a24ad55263e8b6294084010963f3da376 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AB=AF=E6=9C=A8=E6=B0=B8=E4=B9=90?= Date: Thu, 24 Jul 2025 19:43:57 +0800 Subject: [PATCH 7/8] day4_note --- ...45\244\251\344\275\234\344\270\232-main.c" | 29 ++++++ ...32-\351\251\261\345\212\250\345\261\202.c" | 33 +++++++ ...32-\351\251\261\345\212\250\345\261\202.h" | 14 +++ ...250\346\241\206\346\236\266\345\261\202.c" | 88 +++++++++++++++++++ ...250\346\241\206\346\236\266\345\261\202.h" | 27 ++++++ ...44\345\244\251\347\254\224\350\256\260.md" | 59 +++++++++++++ 6 files changed, 250 insertions(+) create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-main.c" create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-\351\251\261\345\212\250\345\261\202.c" create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-\351\251\261\345\212\250\345\261\202.h" create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-\351\251\261\345\212\250\346\241\206\346\236\266\345\261\202.c" create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-\351\251\261\345\212\250\346\241\206\346\236\266\345\261\202.h" create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2544\345\244\251\347\254\224\350\256\260.md" diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-main.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-main.c" new file mode 100644 index 0000000..ef388f3 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-main.c" @@ -0,0 +1,29 @@ + +#include +#include +#include +#ifndef RT_USING_NANO +#include +#endif /* RT_USING_NANO */ + +int main(void) +{ + // IO + rt_device_t vir = rt_device_find("vir"); + if (vir == RT_NULL) + { + rt_kprintf("find vir dev err\n"); + return -RT_ERROR; + } + rt_uint32_t val = 1314; + rt_uint32_t ret = 0; + rt_device_open(vir, RT_DEVICE_FLAG_RDWR); + rt_device_write(vir, 0, &val, 4); + rt_device_read(vir, 0, &ret, 4); + rt_kprintf("ret :%d\n", ret); + rt_device_close(vir); + val = 333; + rt_vir_wirte((rt_vir_device_t)vir, val); + rt_vir_read((rt_vir_device_t)vir, &ret); + rt_kprintf("ret :%d\n", ret); +} diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-\351\251\261\345\212\250\345\261\202.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-\351\251\261\345\212\250\345\261\202.c" new file mode 100644 index 0000000..4cf2619 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-\351\251\261\345\212\250\345\261\202.c" @@ -0,0 +1,33 @@ +#include + +#if defined(RT_USING_VIR) + +struct vir_test vir; +void printfinfo(struct rt_device *device, rt_uint8_t *str) +{ + rt_kprintf("vir info :%s\n", str); +} +void vir_set_val(struct rt_device *device, rt_uint32_t val) +{ + vir.val = val; +} +void vir_get_val(struct rt_device *device, rt_uint32_t *val) +{ + *val = vir.val; +} +struct rt_vir_ops ops = + { + printfinfo, + vir_set_val, + vir_get_val, +}; + +static int vir_init(void) +{ + vir.val = 0; + vir.info = "test_vir"; + rt_hw_vir_register(&vir.parent, "vir", &ops, (void *)vir.info); +} +INIT_APP_EXPORT(vir_init); + +#endif diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-\351\251\261\345\212\250\345\261\202.h" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-\351\251\261\345\212\250\345\261\202.h" new file mode 100644 index 0000000..2963b55 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-\351\251\261\345\212\250\345\261\202.h" @@ -0,0 +1,14 @@ +#ifndef __DRV_VIR_H__ +#define __DRV_VIR_H__ +#include +#include + +struct vir_test +{ + + struct rt_vir_device parent; + rt_uint32_t val; + char *info; +}; + +#endif diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-\351\251\261\345\212\250\346\241\206\346\236\266\345\261\202.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-\351\251\261\345\212\250\346\241\206\346\236\266\345\261\202.c" new file mode 100644 index 0000000..213be09 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-\351\251\261\345\212\250\346\241\206\346\236\266\345\261\202.c" @@ -0,0 +1,88 @@ +#include +#include + +#if defined(RT_USING_VIR) + +rt_err_t _vir_init(rt_device_t dev) +{ + rt_kprintf("vir init \n"); + return RT_EOK; +} +rt_err_t _vir_open(rt_device_t dev, rt_uint16_t oflag) +{ + rt_kprintf("vir open\n"); + return RT_EOK; +} +rt_err_t _vir_close(rt_device_t dev) +{ + rt_kprintf("vir close\n"); + return RT_EOK; +} +rt_ssize_t _vir_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + rt_vir_device_t device = (rt_vir_device_t)dev; + if (device->ops->vir_get_val) + { + device->ops->vir_get_val(dev, (rt_uint32_t *)buffer); + return RT_EOK; + } + return -RT_ERROR; +} + +rt_ssize_t _vir_wirte(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + rt_vir_device_t device = (rt_vir_device_t)dev; + if (device->ops->vir_set_val) + { + device->ops->vir_set_val(dev, *(rt_uint32_t *)buffer); + return RT_EOK; + } + return -RT_ERROR; +} +rt_err_t _vir_control(rt_device_t dev, int cmd, void *args) +{ + rt_kprintf("vir control %d\n", cmd); + return RT_EOK; +} + +rt_err_t rt_hw_vir_register(rt_vir_device_t device, const char *name, const struct rt_vir_ops *ops, const void *user_data) +{ + RT_ASSERT(ops != RT_NULL); + rt_err_t result; + device->ops = ops; + device->parent.init = _vir_init; + device->parent.open = _vir_open; + device->parent.close = _vir_close; + device->parent.read = _vir_read; + device->parent.write = _vir_wirte; + device->parent.control = _vir_control; + result = rt_device_register(&device->parent, name, RT_DEVICE_FLAG_RDWR); + return result; +} + +rt_err_t rt_vir_read(rt_vir_device_t device, rt_uint32_t *val) +{ + RT_ASSERT(device != RT_NULL && device->ops != RT_NULL); + rt_device_t dev = (rt_device_t)device; + + if (device->ops->vir_get_val) + { + device->ops->vir_get_val(dev, val); + return RT_EOK; + } + return -RT_ERROR; +} + +rt_err_t rt_vir_wirte(rt_vir_device_t device, rt_uint32_t val) +{ + RT_ASSERT(device != RT_NULL && device->ops != RT_NULL); + rt_device_t dev = (rt_device_t)device; + if (device->ops->vir_set_val) + { + device->ops->vir_set_val(dev, val); + return RT_EOK; + } + return -RT_ERROR; +} + +#endif \ No newline at end of file diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-\351\251\261\345\212\250\346\241\206\346\236\266\345\261\202.h" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-\351\251\261\345\212\250\346\241\206\346\236\266\345\261\202.h" new file mode 100644 index 0000000..effa7db --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2544\345\244\251\344\275\234\344\270\232-\351\251\261\345\212\250\346\241\206\346\236\266\345\261\202.h" @@ -0,0 +1,27 @@ + +#ifndef __VIR_H__ +#define __VIR_H__ + +#include +#include +struct rt_vir_ops +{ + void (*printfinfo)(struct rt_device *device, rt_uint8_t *str); + void (*vir_set_val)(struct rt_device *device, rt_uint32_t val); + void (*vir_get_val)(struct rt_device *device, rt_uint32_t *val); +}; +/** + * @brief adc device + */ +struct rt_vir_device +{ + struct rt_device parent; + const struct rt_vir_ops *ops; +}; +typedef struct rt_vir_device *rt_vir_device_t; + +rt_err_t rt_hw_vir_register(rt_vir_device_t device, const char *name, const struct rt_vir_ops *ops, const void *user_data); +rt_err_t rt_vir_read(rt_vir_device_t device, rt_uint32_t *val); +rt_err_t rt_vir_wirte(rt_vir_device_t device, rt_uint32_t val); + +#endif diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2544\345\244\251\347\254\224\350\256\260.md" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2544\345\244\251\347\254\224\350\256\260.md" new file mode 100644 index 0000000..f19c4d7 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2544\345\244\251\347\254\224\350\256\260.md" @@ -0,0 +1,59 @@ +### 驱动框架 + +RT-Thread中,所有的设备驱动都使用一个结构体`rt_device`来表示: + +![image-20220122133813112](file:///E:/RT_Tools/weidongshan-rtt/doc_and_source_for_livestream/20220122_RT-Thread%E5%86%85%E9%83%A8%E6%9C%BA%E5%88%B6(%E4%B8%8B)/pic/event_groutp/12_rt_device.png?lastModify=1753357033) + +这些结构体都保存在一个链表中: + +![image-20220122134314026](file:///E:/RT_Tools/weidongshan-rtt/doc_and_source_for_livestream/20220122_RT-Thread%E5%86%85%E9%83%A8%E6%9C%BA%E5%88%B6(%E4%B8%8B)/pic/event_groutp/11_rt_object_container.png?lastModify=1753357033) + +要去使用这个驱动,就是先在上述链表里使用名字找到对应的rt_device结构体,然后调用里面的init/open/read/write/control/close等函数。 + +- 找到:rt_deivce_find + +- 操作:如下图 + + +![image-20220122134744865](file:///E:/RT_Tools/weidongshan-rtt/doc_and_source_for_livestream/20220122_RT-Thread%E5%86%85%E9%83%A8%E6%9C%BA%E5%88%B6(%E4%B8%8B)/pic/event_groutp/13_rt_dev_opration.png?lastModify=1753357033) + +示例代码:`rt-thread-v3.1.5\examples\test\device_test.c` + +rt_device_t device = RT_NULL; +​ +// step 1:find device +device = rt_device_find(device_name); +​ +// step 2:init device +if (!(device->flag & RT_DEVICE_FLAG_ACTIVATED)) +{ +    rt_err_t result; +    result = rt_device_init(device); +    if (result != RT_EOK) +   { +        rt_kprintf("To initialize device:%s failed. The error code is %d\r\n", +                   device->parent.name, result); +        return result; +   } +    else +   { +        device->flag |= RT_DEVICE_FLAG_ACTIVATED; +   } +} +​ +// open +result = rt_device_open(device,RT_DEVICE_FLAG_RDWR); +​ +// control +result = rt_device_control(device, +                           RT_DEVICE_CTRL_BLK_GETGEOME, +                           &geometry); +​ +// read/write +i = rt_device_read(device, 0, read_buffer, 1); +i = rt_device_write(device, sector_no, write_buffer,1); +​ + +### 10.2 注册pin驱动 + +    return rt_device_pin_register("pin", &_stm32_pin_ops, RT_NULL); \ No newline at end of file -- Gitee From 419e7eff28825f3bebb6d8ec776eb3cc8c558702 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AB=AF=E6=9C=A8=E6=B0=B8=E4=B9=90?= Date: Fri, 25 Jul 2025 19:02:25 +0800 Subject: [PATCH 8/8] day5_dm --- ...5\345\244\251\344\275\234\344\270\232.png" | Bin 0 -> 87570 bytes ...45\345\244\251\347\254\224\350\256\260.md" | 35 ++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2545\345\244\251\344\275\234\344\270\232.png" create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2545\345\244\251\347\254\224\350\256\260.md" diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2545\345\244\251\344\275\234\344\270\232.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\344\275\234\344\270\232/\347\254\2545\345\244\251\344\275\234\344\270\232.png" new file mode 100644 index 0000000000000000000000000000000000000000..7dceea3e60267ff7f6f6321d434e5e0e9e638f5a GIT binary patch literal 87570 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%0D_%<)(hE!G&Qc{fXVyvzX3u>m0nT zXqS}s{C8*qJJ7R>Glor5rX7z7zjX#|S!DxBrcAFm08VOVsAm&WW~r;&G~qK6RB@bP zb;uq%%8bo19ooHhu~kW#e7(8-OU4PxOJJ||aP5ie=|+CW*t*}c5-=;ds8r0j<|dEw z7GU$q4yXACs&9JiO{35HLwIaR!pi zw2-~Bu88a$58ijq%c=D!6I&CfJUo<}iat&A`l;YSMHM^XN)0*r^NG(O41D4#PRzo63JX<j~S}u4cRZ!4lh*;JaHkG2mO?~-J)Af zi?!u5rWWVCWj|*r-lEHU3%gNE^)p$6XZMj%AjplQ5c@9ZqR1Y>irR=t-Ogyrmaq;wWxt4K)X|G{b7o2XSWx z&U0rcrnDS9hXHSySyP}v>etx;o!ar8TmoLikS4P=zQ$H`3U-g>#|sCWoV@WW!$@`p zc#H={4v<3H4``GEd;!;&ybDfj-I=k@rpRyafZ z{1mUTSqu*K@*|Jj-{&a&SFNqBvwU_~3T&*0rEYR`=w};lU1D|J-5WX5_VN(`mN>#& z%8xe!YQ_+L2utLq&Z|J5EMm`MqFC-we0e7waM0ouaEM<@#Sb05=J_YU?NKrMhhy35 zBxK^#u(a{`l2WE4qmuUcF>K4JQ#SF&7h+GO1EFeN47xIYP@fS~`7(OC;2gzgw^HL; tF-g+e?Cb!zI?L*OXOtY^$oP}Bol}(LWM=)H$=@cqilT->sl3_i{{u=w*SY`z literal 0 HcmV?d00001 diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2545\345\244\251\347\254\224\350\256\260.md" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2545\345\244\251\347\254\224\350\256\260.md" new file mode 100644 index 0000000..00fea4f --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\347\253\257\346\234\250\346\260\270\344\271\220/\347\254\224\350\256\260/\347\254\2545\345\244\251\347\254\224\350\256\260.md" @@ -0,0 +1,35 @@ +# DAY5 软件包使用与IOT + +在RT-Thread源码中env工具配置工程选项时,比如开启软件包等等 会在menuconfig配置完成之后生成.config文件,这个文件记录了开启的所有东西。 +真正作用到源码里的是rtconfig.h 根据.config文件变化的 但是不要手动修改rtconfig 不然随着工程的刷新会刷新掉 类似于HAL CUBE IDE开发 + +config文件更新后 需要进行pkgs --update 更新新增的软件包或者配置 + +如果发现env下的menuconfig和官网的软件包不匹配 有缺失 那么要进行 +pkgs --upgrade 进行更新env软件包索引 + +![[Pasted image 20250725170311.png]] + +Kconfig配合scons编译器 完成rtt内核项目裁剪 在menuconfig中的页面显示的内容就是kconfig文件(分布在各个子集目录)中写的scons语法来显示的。 + +![[Pasted image 20250725170845.png]] +语句分析: +config,表示一个配置选项的开始,紧跟着的 BSP_USING_GPI0是配置选项的名称,conig 下面几行定义了该配置选项的属性。 +属性可以是该配置选项的 +类型 +输入提示 +依赖关系 +默认值 +帮助信息上 +bool表示配置选项的类型,每个config菜单项都要有类型定义,变量有5种类型 +bool 布尔类型 +tristate 三态类型 +string 字符串 +ohex 十六进制 +int 整型 +·select是反向依赖关系的意思,即当前配置选项被选中,则RTUSING PIN 就会被选中。 +。default 表示配置选项的默认值,bool类型的默认值可以是y/n。 +·help 帮助信息。 +通过 env 选中以上配置界面的选项后,最终可在 rtconfig.h 文件中生成如下两个宏 +define RT USING_PIN +define BSP USING GPIO -- Gitee