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/7] 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/7] 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/7] 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/7] 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/7] 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/7] 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/7] 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