diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/Day3/\344\273\243\347\240\201/\344\273\243\347\240\2013.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/Day3/\344\273\243\347\240\201/\344\273\243\347\240\2013.md" new file mode 100644 index 0000000000000000000000000000000000000000..2161c3126f49c45ffff996cd7bb42162b1a9756f --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/Day3/\344\273\243\347\240\201/\344\273\243\347\240\2013.md" @@ -0,0 +1,126 @@ +#include +#include +#include +#define DBG_TAG "main" +#define DBG_LVL DBG_LOG +#include + +#include +#include + +rt_thread_t thread1 = RT_NULL; +rt_thread_t thread2 = RT_NULL; +struct rt_thread thread3; +rt_mq_t my_mq = RT_NULL; +char thread3_stack[RT_ALIGN(1024,RT_ALIGN_SIZE)]; + +typedef struct{ + int message; + char name; +}mq_msg; +mq_msg my_mq_msg; + +void thread1_back(void *parameter) +{ + mq_msg thread_mq; + while(1) + { + rt_mq_recv(my_mq, &thread_mq, sizeof(thread_mq), RT_WAITING_FOREVER); + char string[100] = {0}; + snprintf(string,sizeof(string),"receive data is ==> name:%c, data:%d\r\n",thread_mq.name,thread_mq.message); + rt_kprintf(string); + } +} + +void thread3_back(void *parameter) +{ + mq_msg thread3_mq; + while(1) + { + thread3_mq.name = 'C'; + thread3_mq.message = 666; + rt_mq_send_wait(my_mq, &thread3_mq, sizeof(thread3_mq),RT_WAITING_FOREVER); + rt_thread_delay(500); + } +} + +void thread2_back(void *parameter) +{ + mq_msg thread2_mq; + while(1) + { + thread2_mq.name = 'B'; + thread2_mq.message = 777; + rt_mq_send_wait(my_mq, &thread2_mq, sizeof(thread2_mq),RT_WAITING_FOREVER); + rt_thread_delay(1000); + } +} + +int thread_config(void) +{ + rt_err_t check = RT_NULL; + my_mq = rt_mq_create("mq", sizeof(my_mq_msg), 5, RT_IPC_FLAG_FIFO); + if(my_mq != RT_NULL) + { + rt_kprintf("mq create ok\r\n"); + } + thread1 = rt_thread_create( "thread1", + thread1_back, + RT_NULL, + 1024, + 5, + 10); + if(thread1 != RT_NULL) + { + rt_kprintf("thread1 create ok!\r\n"); + rt_thread_startup(thread1); + } + else { + return 1; + } + thread2 = rt_thread_create( "thread2", + thread2_back, + RT_NULL, + 1024, + 5, + 10); + if(thread2 != RT_NULL) + { + rt_kprintf("thread2 create ok!\r\n"); + rt_thread_startup(thread2); + } + else { + return 1; + } + check = rt_thread_init( &thread3, + "thread3", + thread3_back, + RT_NULL, + &thread3_stack[0], + sizeof(thread3_stack), + 5, + 10); + if(check == RT_EOK) + { + rt_kprintf("thread3 init ok\r\n"); + rt_thread_startup(&thread3); + } + else { + return 1; + } + return 0; +} + +int main(void) +{ + if(thread_config()) + { + return 0; + } + while (1) + { + rt_thread_mdelay(10000); + } + + return RT_EOK; +} diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/Day3/\344\275\234\344\270\232/\344\275\234\344\270\2323.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/Day3/\344\275\234\344\270\232/\344\275\234\344\270\2323.md" new file mode 100644 index 0000000000000000000000000000000000000000..e554e8dc3663e04d52844c8baac4076e699b9a62 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/Day3/\344\275\234\344\270\232/\344\275\234\344\270\2323.md" @@ -0,0 +1,3 @@ +1. 笔记已提交 +2. 论坛已提交 +3. 内容已开源 diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/Day3/\345\233\276\347\211\207/\344\273\243\347\240\2013.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/Day3/\345\233\276\347\211\207/\344\273\243\347\240\2013.png" new file mode 100644 index 0000000000000000000000000000000000000000..ea0972df839e876b3d7300e2fa43e43feb26a4fd Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/Day3/\345\233\276\347\211\207/\344\273\243\347\240\2013.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/Day3/\347\254\224\350\256\260/\347\254\224\350\256\2603.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/Day3/\347\254\224\350\256\260/\347\254\224\350\256\2603.md" new file mode 100644 index 0000000000000000000000000000000000000000..2e677ae6dc683f8fce431db82f6e19b0b5ee3a39 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/Day3/\347\254\224\350\256\260/\347\254\224\350\256\2603.md" @@ -0,0 +1,45 @@ +# 课程笔记 +1. RT-Thread 线程创建方式 + RT-Thread 提供两种线程创建方式,各有适用场景: + 11. 动态创建 + 111. 特点:通过系统堆内存分配线程控制块和栈空间,使用灵活但需注意内存管理 + 112. 关键函数:rt_thread_create() 创建线程,rt_thread_startup() 启动线程 + 113. 适用场景:需要动态调整线程数量或生命周期的场景,如网络连接处理 + 12. 静态创建 + 111. 特点:使用预分配的静态内存区域,无需动态内存分配,适合资源受限环境 + 112. 关键步骤:定义线程栈数组和线程控制块,调用 rt_thread_init() 初始化,再调用 rt_thread_startup() 启动 + 113. 适用场景:资源受限的嵌入式系统或对内存使用有严格控制的场景 +2. RT-Thread 线程通信(邮箱) + 邮箱是 RT-Thread 中高效的线程间通信机制: + 21. 核心概念 + 211. 消息载体:邮箱传递的是固定大小的 "邮件",通常是指针或整数(如 32 位系统中为 4 字节) + 212. 工作模式:支持阻塞和非阻塞两种接收模式 + 213. 缓冲区:邮箱可配置缓冲区大小,支持多邮件排队 + 22. 典型应用场景 + 221. 传递命令或状态标志 + 222. 指针传递:用于共享大型数据结构(避免复制开销) + 223. 跨线程事件通知 +3. RT-Thread 信号量 + 信号量是实现线程同步与互斥的基础工具: + 31. 两种信号量类型 + 311. 二值信号量:初始值为 1,用于互斥访问临界资源,确保同一时间只有一个线程访问 + 312. 计数信号量:初始值大于 1,用于资源计数,例如限制同时访问某资源的线程数量 + 32. 核心操作 + 321. 获取信号量:rt_sem_take(),可设置等待超时时间 + 322. 释放信号量:rt_sem_release(),释放资源使用权 + 33. 常见用途 + 331. 互斥锁:保护共享资源(如全局变量、硬件外设) + 332. 生产者 - 消费者模型:控制缓冲区资源使用 + 333. 事件触发:一个线程等待另一个线程完成特定操作 +4. RT-Thread 静态创建线程栈对齐 + 线程栈对齐是保证系统稳定性的关键: + 41. 栈对齐要求 + 411. RT-Thread 要求线程栈起始地址必须按 RT_ALIGN_SIZE 对齐(通常为 4 字节或 8 字节,取决于架构) + 412. 栈对齐栈大小也需是对齐单位的整数倍 + 42. 栈对齐为什么需要对齐 + 421. 硬件限制:部分架构(如 ARM)要求访问内存时地址必须对齐,否则会触发异常 + 422. 性能优化:对齐的内存访问效率更高 + 43. 开发者注意事项 + 431. 使用静态数组定义栈时,编译器会自动对齐 + 432. 使用 RT_ALIGN 宏确保栈大小符合对齐要求 + 433. 避免手动计算栈地址,使用 RT-Thread 提供的初始化函数自动处理对齐 \ No newline at end of file diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\344\273\243\347\240\201.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\344\273\243\347\240\201.md" new file mode 100644 index 0000000000000000000000000000000000000000..22e51db6aa995edb87c777e77c2a9dc35f2c854c --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\344\273\243\347\240\201.md" @@ -0,0 +1,103 @@ +#include +#include +#include +#define DBG_TAG "main" +#define DBG_LVL DBG_LOG +#include + +rt_thread_t thread1 = RT_NULL; +rt_thread_t thread2 = RT_NULL; +struct rt_thread thread3; + +char thread3_stack[RT_ALIGN(1024,RT_ALIGN_SIZE)]; + +void thread1_back(void *parameter) +{ + while(1) + { + rt_kprintf("thread1 run\n"); + rt_thread_delay(1000); + } +} + +void thread2_back(void *parameter) +{ + while(1) + { + rt_kprintf("thread2 run\n"); + rt_thread_delay(1000); + } +} + +void thread3_back(void *parameter) +{ + while(1) + { + rt_kprintf("thread3 run\n"); + rt_thread_delay(500); + } +} + +int thread_config(void) +{ + thread1 = rt_thread_create( "thread1", + thread1_back, + RT_NULL, + 1024, + 5, + 10); + if(thread1 != RT_NULL) + { + rt_kprintf("thread1 create ok!\r\n"); + rt_thread_startup(thread1); + } + else { + return 1; + } + thread2 = rt_thread_create( "thread2", + thread2_back, + RT_NULL, + 1024, + 5, + 10); + if(thread2 != RT_NULL) + { + rt_kprintf("thread2 create ok\r\n"); + rt_thread_startup(thread2); + } + else { + return 1; + } + rt_err_t check = RT_NULL; + check = rt_thread_init( &thread3, + "thread3", + thread3_back, + RT_NULL, + &thread3_stack[0], + sizeof(thread3_stack), + 4, + 10); + if(check == RT_EOK) + { + rt_kprintf("thread3 init ok\r\n"); + rt_thread_startup(&thread3); + } + else { + return 1; + } + return 0; +} + +int main(void) +{ + if(thread_config()) + { + return 0; + } + while (1) + { + rt_thread_mdelay(10000); + } + + return RT_EOK; +} \ No newline at end of file diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\344\275\234\344\270\232.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..ec61d8f894032b5d837b6e85417a6a6315a5b318 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\344\275\234\344\270\232.md" @@ -0,0 +1,3 @@ +1. 笔记已提交 +2. 论坛已提交 +3. 内容已开源 \ No newline at end of file diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\344\275\234\344\270\2322.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\344\275\234\344\270\2322.md" new file mode 100644 index 0000000000000000000000000000000000000000..277ddbbe94c32960061efd35fabcd11c62d9b88d --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\344\275\234\344\270\2322.md" @@ -0,0 +1,3 @@ +1. 笔记已提交 +2. 论坛已提交 +3. 内容已开源 \ No newline at end of file diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\347\205\247\347\211\2071.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\347\205\247\347\211\2071.png" new file mode 100644 index 0000000000000000000000000000000000000000..048159b2ef420a065e52257022ac8fd313e734d8 Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\347\205\247\347\211\2071.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\347\205\247\347\211\2072.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\347\205\247\347\211\2072.png" new file mode 100644 index 0000000000000000000000000000000000000000..b4faf8cea01a919be3e96f11baa7ae8b6217ba27 Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\347\205\247\347\211\2072.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\350\277\220\350\241\214.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\350\277\220\350\241\214.png" new file mode 100644 index 0000000000000000000000000000000000000000..12b3ca3e1ad810f6d5ffa92a2cd1039d289d9cd4 Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\344\275\234\344\270\232/\350\277\220\350\241\214.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\347\254\224\350\256\260/\347\254\224\350\256\260.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\347\254\224\350\256\260/\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..0a39e029e6f9b6f04b273e177004c6bf7ffdc886 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\347\254\224\350\256\260/\347\254\224\350\256\260.md" @@ -0,0 +1,4 @@ +1. 了解RT-Thread开发环境和基础的内核机 +2. 安装RT-Thread Studio 开发工具 -- [RT-Thread Studio](https://www.rt-thread.com/studio.html) +3. 创建工程 --- f407 +4. 编译运行 diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\347\254\224\350\256\260/\347\254\224\350\256\2602.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\347\254\224\350\256\260/\347\254\224\350\256\2602.md" new file mode 100644 index 0000000000000000000000000000000000000000..c87a4ee720e9a2438fae380eb04b0dca2eea1817 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/[RSOC25]-Day2-\350\257\276\347\250\213\347\254\224\350\256\260-\346\235\250\350\222\231\346\201\251/Day2\347\254\224\350\256\260/\347\254\224\350\256\2602.md" @@ -0,0 +1,20 @@ +1. 了解RT-Thread开发环境和基础的内核机 +2. 安装RT-Thread Studio 开发工具 -- [RT-Thread Studio](https://www.rt-thread.com/studio.html) +3. 创建工程 --- f407 +4. QEMU调试 +5. 知识点 + * 4-11是通用寄存器 + * 0-3 是参数传递, 其他寄存器是pc sp psr + * r0~r3 是 “调用者保存寄存器”(Caller - Saved):函数调用时,用于临时传参 / 返回值,被调用函数可直接修改,无需主动保存(调用者(上层函数)不依赖其值持续存在)。 + * r4~r11 是 “被调用者保存寄存器”(Callee - Saved):被调用函数(如线程函数)若使用这些寄存器,必须手动保存 / 恢复(否则会破坏调用者上下文)这是网上的解释 +6. 线程切换 (时间片轮转,优先级强占) + * 二个线程优先级一样,系统调度会安装时间片轮转对若干个线程进行调度 + * 二个线程优先级不一样,系统调度会让排优先级高的优先调度,优先级一样,系统调度会安装时间片轮转对优先级高的进行调度 + * 线程回调函数必须要有延时函数来让出CPU资源,不能一个线程独占CPU资源 + * 线程回调函数不能有死循环,否则线程会一直运行,无法切换 + * 线程回调函数不能有阻塞操作,否则线程会阻塞,无法切换 + + + + + diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\344\273\243\347\240\201/\344\273\243\347\240\2014-1.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\344\273\243\347\240\201/\344\273\243\347\240\2014-1.md" new file mode 100644 index 0000000000000000000000000000000000000000..5e2e723a12d13206a074b45e562aba41bb799c39 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\344\273\243\347\240\201/\344\273\243\347\240\2014-1.md" @@ -0,0 +1,63 @@ +/* virtual_device.h */ +#ifndef __VIRTUAL_DEVICE_H__ +#define __VIRTUAL_DEVICE_H__ + +#include +#include + +/* 虚拟设备命令枚举 */ +typedef enum { + VDEV_CMD_INIT = 0, + VDEV_CMD_OPEN, + VDEV_CMD_CLOSE, + VDEV_CMD_READ, + VDEV_CMD_WRITE, + VDEV_CMD_CONTROL, + /* 可以添加更多命令 */ +} vdev_cmd_t; + +/* 虚拟设备操作函数集 */ +struct virtual_device_ops { + rt_err_t (*init)(struct rt_device *dev); + rt_err_t (*open)(struct rt_device *dev, rt_uint16_t oflag); + rt_err_t (*close)(struct rt_device *dev); + rt_size_t (*read)(struct rt_device *dev, rt_off_t pos, void *buffer, rt_size_t size); + rt_size_t (*write)(struct rt_device *dev, rt_off_t pos, const void *buffer, rt_size_t size); + rt_err_t (*control)(struct rt_device *dev, int cmd, void *args); +}; + +/* 虚拟设备结构体 */ +struct virtual_device { + struct rt_device parent; /* 继承RT-Thread基础设备结构 */ + const struct virtual_device_ops *ops; /* 设备操作函数集 */ + void *user_data; /* 用户数据 */ + rt_bool_t is_ready; /* 设备就绪状态 */ +}; +typedef struct virtual_device *virtual_device_t; + +/* 注册虚拟设备 */ +rt_err_t virtual_device_register(virtual_device_t vdev, const char *name, + rt_uint32_t flags, void *data); + +/* 注销虚拟设备 */ +rt_err_t virtual_device_unregister(virtual_device_t vdev); + +/* 虚拟设备初始化函数 */ +rt_err_t virtual_device_init(virtual_device_t vdev); + +/* 虚拟设备打开函数 */ +rt_err_t virtual_device_open(virtual_device_t vdev, rt_uint16_t oflag); + +/* 虚拟设备关闭函数 */ +rt_err_t virtual_device_close(virtual_device_t vdev); + +/* 虚拟设备读取函数 */ +rt_size_t virtual_device_read(virtual_device_t vdev, rt_off_t pos, void *buffer, rt_size_t size); + +/* 虚拟设备写入函数 */ +rt_size_t virtual_device_write(virtual_device_t vdev, rt_off_t pos, const void *buffer, rt_size_t size); + +/* 虚拟设备控制函数 */ +rt_err_t virtual_device_control(virtual_device_t vdev, int cmd, void *args); + +#endif /* __VIRTUAL_DEVICE_H__ */ \ No newline at end of file diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\344\273\243\347\240\201/\344\273\243\347\240\2014-2.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\344\273\243\347\240\201/\344\273\243\347\240\2014-2.md" new file mode 100644 index 0000000000000000000000000000000000000000..0147319e50fec9b81d74e379a9f960c680096506 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\344\273\243\347\240\201/\344\273\243\347\240\2014-2.md" @@ -0,0 +1,168 @@ +/* virtual_device.c */ +#include "virtual_device.h" + +/* 设备初始化回调函数 */ +static rt_err_t vdev_init(struct rt_device *dev) +{ + virtual_device_t vdev = (virtual_device_t)dev; + + if (vdev->ops && vdev->ops->init) + return vdev->ops->init(dev); + + return RT_EOK; +} + +/* 设备打开回调函数 */ +static rt_err_t vdev_open(struct rt_device *dev, rt_uint16_t oflag) +{ + virtual_device_t vdev = (virtual_device_t)dev; + + if (vdev->ops && vdev->ops->open) + return vdev->ops->open(dev); + + return RT_EOK; +} + +/* 设备关闭回调函数 */ +static rt_err_t vdev_close(struct rt_device *dev) +{ + virtual_device_t vdev = (virtual_device_t)dev; + + if (vdev->ops && vdev->ops->close) + return vdev->ops->close(dev); + + return RT_EOK; +} + +/* 设备读取回调函数 */ +static rt_size_t vdev_read(struct rt_device *dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + virtual_device_t vdev = (virtual_device_t)dev; + + if (vdev->ops && vdev->ops->read) + return vdev->ops->read(dev, pos, buffer, size); + + return 0; +} + +/* 设备写入回调函数 */ +static rt_size_t vdev_write(struct rt_device *dev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + virtual_device_t vdev = (virtual_device_t)dev; + + if (vdev->ops && vdev->ops->write) + return vdev->ops->write(dev, pos, buffer, size); + + return 0; +} + +/* 设备控制回调函数 */ +static rt_err_t vdev_control(struct rt_device *dev, int cmd, void *args) +{ + virtual_device_t vdev = (virtual_device_t)dev; + + if (vdev->ops && vdev->ops->control) + return vdev->ops->control(dev, cmd, args); + + return RT_ENOSYS; +} + +/* 注册虚拟设备 */ +rt_err_t virtual_device_register(virtual_device_t vdev, const char *name, + rt_uint32_t flags, void *data) +{ + rt_err_t result; + + if (vdev == RT_NULL) + return RT_ERROR; + + /* 初始化基础设备结构 */ + vdev->parent.type = RT_Device_Class_Char; + vdev->parent.rx_indicate = RT_NULL; + vdev->parent.tx_complete = RT_NULL; + + /* 设置设备操作函数 */ + vdev->parent.init = vdev_init; + vdev->parent.open = vdev_open; + vdev->parent.close = vdev_close; + vdev->parent.read = vdev_read; + vdev->parent.write = vdev_write; + vdev->parent.control = vdev_control; + + /* 设置设备数据 */ + vdev->parent.user_data = data; + vdev->user_data = data; + vdev->is_ready = RT_FALSE; + + /* 注册设备到RT-Thread设备管理器 */ + result = rt_device_register(&vdev->parent, name, flags); + if (result != RT_EOK) { + rt_kprintf("register virtual device failed: %d\n", result); + return result; + } + + return RT_EOK; +} + +/* 注销虚拟设备 */ +rt_err_t virtual_device_unregister(virtual_device_t vdev) +{ + if (vdev == RT_NULL) + return RT_ERROR; + + /* 关闭设备 */ + if (vdev->parent.flag & RT_DEVICE_FLAG_OPEN) + virtual_device_close(vdev); + + /* 从设备管理器中注销 */ + return rt_device_unregister(&vdev->parent); +} + +/* 其他接口函数实现 */ +rt_err_t virtual_device_init(virtual_device_t vdev) +{ + if (vdev == RT_NULL) + return RT_ERROR; + + return rt_device_init(&vdev->parent); +} + +rt_err_t virtual_device_open(virtual_device_t vdev, rt_uint16_t oflag) +{ + if (vdev == RT_NULL) + return RT_ERROR; + + return rt_device_open(&vdev->parent, oflag); +} + +rt_err_t virtual_device_close(virtual_device_t vdev) +{ + if (vdev == RT_NULL) + return RT_ERROR; + + return rt_device_close(&vdev->parent); +} + +rt_size_t virtual_device_read(virtual_device_t vdev, rt_off_t pos, void *buffer, rt_size_t size) +{ + if (vdev == RT_NULL) + return 0; + + return rt_device_read(&vdev->parent, pos, buffer, size); +} + +rt_size_t virtual_device_write(virtual_device_t vdev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + if (vdev == RT_NULL) + return 0; + + return rt_device_write(&vdev->parent, pos, buffer, size); +} + +rt_err_t virtual_device_control(virtual_device_t vdev, int cmd, void *args) +{ + if (vdev == RT_NULL) + return RT_ERROR; + + return rt_device_control(&vdev->parent, cmd, args); +} \ No newline at end of file diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\344\273\243\347\240\201/\344\273\243\347\240\2014-3.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\344\273\243\347\240\201/\344\273\243\347\240\2014-3.md" new file mode 100644 index 0000000000000000000000000000000000000000..e2ad6286ab100db7732f1b97b75183484f58bbe8 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\344\273\243\347\240\201/\344\273\243\347\240\2014-3.md" @@ -0,0 +1,130 @@ +/* virtual_led_device.c */ +#include "virtual_device.h" + +/* LED设备私有数据 */ +struct virtual_led_device { + struct virtual_device parent; /* 继承虚拟设备 */ + rt_bool_t status; /* LED状态 */ +}; +typedef struct virtual_led_device *virtual_led_device_t; + +/* LED设备操作函数实现 */ +static rt_err_t led_init(struct rt_device *dev) +{ + virtual_led_device_t led = (virtual_led_device_t)dev; + + /* 初始化LED状态 */ + led->status = RT_FALSE; + rt_kprintf("LED device initialized\n"); + + return RT_EOK; +} + +static rt_err_t led_open(struct rt_device *dev, rt_uint16_t oflag) +{ + rt_kprintf("LED device opened\n"); + return RT_EOK; +} + +static rt_err_t led_close(struct rt_device *dev) +{ + rt_kprintf("LED device closed\n"); + return RT_EOK; +} + +static rt_size_t led_read(struct rt_device *dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + virtual_led_device_t led = (virtual_led_device_t)dev; + rt_uint8_t *data = (rt_uint8_t *)buffer; + + if (size >= 1) { + data[0] = led->status ? 1 : 0; + return 1; + } + + return 0; +} + +static rt_size_t led_write(struct rt_device *dev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + virtual_led_device_t led = (virtual_led_device_t)dev; + const rt_uint8_t *data = (const rt_uint8_t *)buffer; + + if (size >= 1) { + led->status = (data[0] != 0) ? RT_TRUE : RT_FALSE; + rt_kprintf("LED set to %s\n", led->status ? "ON" : "OFF"); + return 1; + } + + return 0; +} + +static rt_err_t led_control(struct rt_device *dev, int cmd, void *args) +{ + virtual_led_device_t led = (virtual_led_device_t)dev; + + switch (cmd) { + case VDEV_CMD_INIT: + led_init(dev); + break; + + case VDEV_CMD_OPEN: + led_open(dev, 0); + break; + + case VDEV_CMD_CLOSE: + led_close(dev); + break; + + default: + return RT_ENOSYS; + } + + return RT_EOK; +} + +/* LED设备操作函数集 */ +static const struct virtual_device_ops led_ops = { + .init = led_init, + .open = led_open, + .close = led_close, + .read = led_read, + .write = led_write, + .control = led_control, +}; + +/* 创建虚拟LED设备 */ +virtual_device_t virtual_led_create(const char *name) +{ + virtual_led_device_t led; + + /* 分配内存 */ + led = (virtual_led_device_t)rt_malloc(sizeof(struct virtual_led_device)); + if (led == RT_NULL) { + rt_kprintf("create virtual LED device failed: out of memory\n"); + return RT_NULL; + } + + /* 初始化设备结构 */ + rt_memset(led, 0, sizeof(struct virtual_led_device)); + led->parent.ops = &led_ops; + + /* 注册设备 */ + if (virtual_device_register(&led->parent, name, RT_DEVICE_FLAG_RDWR, RT_NULL) != RT_EOK) { + rt_free(led); + return RT_NULL; + } + + return &led->parent; +} + +/* 删除虚拟LED设备 */ +void virtual_led_delete(virtual_device_t vdev) +{ + if (vdev) { + /* 注销设备 */ + virtual_device_unregister(vdev); + /* 释放内存 */ + rt_free(vdev); + } +} \ No newline at end of file diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\344\273\243\347\240\201/\344\273\243\347\240\2014-4.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\344\273\243\347\240\201/\344\273\243\347\240\2014-4.md" new file mode 100644 index 0000000000000000000000000000000000000000..bed8849c316e8aea9b6f2121ff0355b4af6b953b --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\344\273\243\347\240\201/\344\273\243\347\240\2014-4.md" @@ -0,0 +1,55 @@ +/* main.c */ +#include +#include "virtual_device.h" +#include "virtual_led_device.h" + +static virtual_device_t led_device = RT_NULL; + +static void led_test(void) +{ + rt_uint8_t status; + + /* 打开LED设备 */ + if (virtual_device_open(led_device, RT_DEVICE_FLAG_RDWR) != RT_EOK) { + rt_kprintf("open LED device failed\n"); + return; + } + + /* 点亮LED */ + status = 1; + virtual_device_write(led_device, 0, &status, 1); + + /* 延时 */ + rt_thread_mdelay(1000); + + /* 熄灭LED */ + status = 0; + virtual_device_write(led_device, 0, &status, 1); + + /* 读取LED状态 */ + virtual_device_read(led_device, 0, &status, 1); + rt_kprintf("LED status: %s\n", status ? "ON" : "OFF"); + + /* 关闭LED设备 */ + virtual_device_close(led_device); +} + +static int virtual_device_example(void) +{ + /* 创建LED设备 */ + led_device = virtual_led_create("vled0"); + if (led_device == RT_NULL) { + rt_kprintf("create virtual LED device failed\n"); + return -1; + } + + /* 测试LED设备 */ + led_test(); + + /* 删除LED设备 */ + virtual_led_delete(led_device); + + return 0; +} +/* 导出为命令 */ +MSH_CMD_EXPORT(virtual_device_example, virtual device framework example); \ No newline at end of file diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\344\275\234\344\270\232/\344\275\234\344\270\2324.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\344\275\234\344\270\232/\344\275\234\344\270\2324.md" new file mode 100644 index 0000000000000000000000000000000000000000..f888c09b337453c0660f68d1acdefb6a4d73c200 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\344\275\234\344\270\232/\344\275\234\344\270\2324.md" @@ -0,0 +1,3 @@ +1. 笔记已提交 +2. 论坛已提交 +3. 内容已开源 \ No newline at end of file diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\345\233\276\347\211\2074/\345\233\276\347\211\2074-1.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\345\233\276\347\211\2074/\345\233\276\347\211\2074-1.png" new file mode 100644 index 0000000000000000000000000000000000000000..4fa7450d02c7c42b6b7ebcca3e75bcb6d767462d Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\345\233\276\347\211\2074/\345\233\276\347\211\2074-1.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\345\233\276\347\211\2074/\345\233\276\347\211\2074-2.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\345\233\276\347\211\2074/\345\233\276\347\211\2074-2.png" new file mode 100644 index 0000000000000000000000000000000000000000..10578a222eaebe5638a99b37692b2764e2f9aaf0 Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\345\233\276\347\211\2074/\345\233\276\347\211\2074-2.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\347\254\224\350\256\260/\347\254\224\350\256\2604.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\347\254\224\350\256\260/\347\254\224\350\256\2604.md" new file mode 100644 index 0000000000000000000000000000000000000000..ef86ecafd4b8630c0857898ec7385a7fbcb7bbe3 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day4/\347\254\224\350\256\260/\347\254\224\350\256\2604.md" @@ -0,0 +1,66 @@ +RT-Thread 项目中集成上述虚拟设备驱动框架,需要完成以下配置步骤: +1. 添加框架代码到项目 + 首先需要将框架代码文件添加到你的 RT-Thread 项目中: + 创建一个新的目录,例如 components/virtual_device + 将以下文件复制到该目录: + virtual_device.h + virtual_device.c + virtual_led_device.c (示例设备驱动) +2. 修改项目配置文件 + 在项目的 SConscript 文件中添加对新组件的支持:python + # 在项目根目录的 SConscript 中添加 + from building import * + + cwd = GetCurrentDir() + src = Glob('components/virtual_device/*.c') + CPPPATH = [cwd] + + group = DefineGroup('VirtualDevice', src, depend = [''], CPPPATH = CPPPATH) + Return('group') +3. 配置 RT-Thread 设备框架 + 确保 RT-Thread 的设备驱动框架已启用: + 打开项目的 menuconfig 配置界面: + bash + scons --menuconfig + + 导航到 RT-Thread Components -> Device Drivers + 确保 Enable device framework 选项已选中 + 保存配置并退出 +4. 初始化虚拟设备框架 + 在应用程序中初始化并使用虚拟设备框架: + #include "virtual_device.h" + #include "virtual_led_device.h" + + int main(void) + { + virtual_device_t vdev; + + /* 创建虚拟LED设备 */ + vdev = virtual_led_create("vled0"); + if (vdev == RT_NULL) { + rt_kprintf("Failed to create virtual LED device!\n"); + return -1; + } + return 0; + } +5. 使用设备控制命令 + 框架示例中已将测试函数导出为 MSH 命令,可以通过串口终端测试: + 编译并下载程序到目标设备 + 打开串口终端连接到设备 + 在终端中输入 virtual_device_example 命令执行测试 +6. 创建自定义虚拟设备 + 如需创建自定义虚拟设备,可参考 virtual_led_device.c 实现: + 定义设备私有数据结构,继承自 struct virtual_device + 实现设备操作函数集(init, open, close, read, write, control) + 创建设备创建和删除函数 + 在应用程序中调用创建函数注册设备 +7. 验证集成结果 + 通过 RT-Thread 的设备管理命令验证设备是否正常注册: + bash + list_device + 应该能看到名为 vled0 的设备,类型为 CharDevice + 注意事项 + 如果使用静态内存分配,需要修改框架代码中的内存分配方式 + 对于多线程环境,可能需要添加适当的线程同步机制 + 根据实际需求扩展 virtual_device_ops 结构和命令集 + 在设备操作函数中实现具体的硬件控制逻辑(如果是模拟真实设备) \ No newline at end of file diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day5/\344\275\234\344\270\232/\344\275\234\344\270\2325.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day5/\344\275\234\344\270\232/\344\275\234\344\270\2325.md" new file mode 100644 index 0000000000000000000000000000000000000000..f888c09b337453c0660f68d1acdefb6a4d73c200 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day5/\344\275\234\344\270\232/\344\275\234\344\270\2325.md" @@ -0,0 +1,3 @@ +1. 笔记已提交 +2. 论坛已提交 +3. 内容已开源 \ No newline at end of file diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day5/\347\254\224\350\256\260/\347\254\224\350\256\2605.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day5/\347\254\224\350\256\260/\347\254\224\350\256\2605.md" new file mode 100644 index 0000000000000000000000000000000000000000..4287c0ce74f4357d9c3b228761bc3b2c1a95f4af --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/day5/\347\254\224\350\256\260/\347\254\224\350\256\2605.md" @@ -0,0 +1,27 @@ +一、RT-Thread 软件包配置流程 +配置核心依赖 RT-Thread 的包管理工具(如 Env 工具或 RT-Thread Studio),通过可视化配置界面选择所需功能,自动处理依赖关系。 +1. 环境准备 +工具:安装 Env 工具(命令行配置)或 RT-Thread Studio(IDE 集成),确保工程已适配目标硬件(如 STM32、ESP32 等)。 +基础组件:确保系统已启用 RT-Thread 内核、FinSH 控制台(调试用)、DFS(文件系统,可选)。 +2. 软件包选择与配置 +通过 menuconfig 界面(Env 中执行 scons --menuconfig,或 RT-Thread Studio 中右键工程选择 “配置”)进入配置菜单,重点关注 IoT 相关分类: +(1)网络通信层(必选,IoT 设备联网基础) +Wi-Fi 连接:若使用 Wi-Fi 模组(如 ESP8266、ESP32),进入 RT-Thread online packages -> IoT - internet of things -> WLAN,选择 wlan 软件包,配置 Wi-Fi 驱动(如 esp8266 或 esp32 子包),并设置默认 AP 信息(SSID、密码)。 +蜂窝网络(NB-IoT/4G):若使用 NB-IoT 模组(如 BC25),进入 RT-Thread online packages -> IoT - internet of things -> AT device,选择 at_device 软件包(支持 AT 指令模组),配置模组型号(如 BC25)和 UART 接口(模组与 MCU 连接的串口)。 +以太网:若设备带以太网接口,进入 RT-Thread online packages -> Network -> Ethernet,选择对应 PHY 驱动(如 lan8720)。 +(2)协议栈与数据传输层(IoT 数据交互核心) +MQTT 协议:IoT 设备常用的轻量级通信协议,选择 RT-Thread online packages -> IoT - internet of things -> MQTT,启用 paho-mqtt 软件包,配置: +服务器地址(如阿里云 IoT 服务器 iot-as-mqtt.cn-shanghai.aliyuncs.com)、端口(默认 1883 或 8883 加密端口); +连接参数(Client ID、用户名、密码,需与云平台设备信息匹配)。 +HTTP/HTTPS:若需 RESTful API 交互,选择 cURL 或 httpclient 软件包,配置超时时间、证书(HTTPS 加密用)。 +数据格式化:启用 cJSON 软件包(RT-Thread online packages -> Utilities -> cJSON),用于将传感器数据转换为 JSON 格式(IoT 常用数据格式)。 +(3)传感器与硬件交互层 +传感器框架:进入 RT-Thread online packages -> IoT - internet of things -> Sensor,启用 sensor 框架(统一传感器驱动接口),并选择具体传感器驱动(如温湿度传感器 dht11、光照传感器 bh1750),配置硬件接口(I2C/SPI/UART,需与实际接线匹配)。 +外设驱动:若需控制执行器(如继电器、LED),选择对应 GPIO 或 PWM 驱动包(通常已集成在 BSP 中,需确认硬件引脚配置)。 +(4)云平台对接层(可选,直接对接公有云) +主流云平台(阿里云、腾讯云、华为云)均提供 RT-Thread 软件包,以阿里云 IoT为例: +进入 RT-Thread online packages -> IoT - internet of things -> Cloud,选择 ali-iotkit 软件包; +配置设备三元组(ProductKey、DeviceName、DeviceSecret),自动生成 MQTT 连接参数(无需手动配置 paho-mqtt 细节)。 +3. 软件包更新与编译 +配置完成后,保存退出 menuconfig,执行 pkgs --update 下载选中的软件包(Env 工具),或在 RT-Thread Studio 中点击 “同步软件包”; +执行 scons 编译工程,软件包代码会自动集成到工程中。 \ No newline at end of file diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\274\240\344\270\211/\344\275\234\344\270\232/README.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\274\240\344\270\211/\344\275\234\344\270\232/README.md" deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\274\240\344\270\211/\347\254\224\350\256\260/README.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\274\240\344\270\211/\347\254\224\350\256\260/README.md" deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\346\235\250\350\222\231\346\201\251-\346\217\220\344\272\244\346\265\213\350\257\225/\344\275\234\344\270\232/\347\254\254\344\270\200\345\244\251\344\275\234\344\270\232.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\346\235\250\350\222\231\346\201\251-\346\217\220\344\272\244\346\265\213\350\257\225/\344\275\234\344\270\232/\347\254\254\344\270\200\345\244\251\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..06fdfdca28648ffe7fd23f2d93bcff998cff1305 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\346\235\250\350\222\231\346\201\251-\346\217\220\344\272\244\346\265\213\350\257\225/\344\275\234\344\270\232/\347\254\254\344\270\200\345\244\251\344\275\234\344\270\232.md" @@ -0,0 +1,3 @@ +1. 笔记已提交 +2. 论坛已提交 +3. 内容已开源 diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\346\235\250\350\222\231\346\201\251-\346\217\220\344\272\244\346\265\213\350\257\225/\347\254\224\350\256\260/\345\206\205\346\240\270\347\254\224\350\256\260.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\346\235\250\350\222\231\346\201\251-\346\217\220\344\272\244\346\265\213\350\257\225/\347\254\224\350\256\260/\345\206\205\346\240\270\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..5573d8cdacde7fc0e17b936f4c814292592394b4 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\346\235\250\350\222\231\346\201\251-\346\217\220\344\272\244\346\265\213\350\257\225/\347\254\224\350\256\260/\345\206\205\346\240\270\347\254\224\350\256\260.md" @@ -0,0 +1,32 @@ +* 2025年7月21日 --- RT-Thread训练营笔记 +* 安装Git工具(Git Bash) +* 安装ENV_WINDOW工具, 添加qemu-nographic.bat环境变量 + * 'pkgs --upgrade' 升级软件包 'pkgs --update' 更新软件包 + * +* 下载工程源码 +* 编译程序 + * menuconfig + * scons -j4 + * qemu-nographic.bat +* 使用vscode对源工程进行打开 +* 使用Gitee进行个人SSH密钥配置 + * 复制以下命令到终端执行 git clone + git@gitee.com:rtthread/rsoc-rtt.git + * 确保你提交的代码身份被 Gitee 正确识别 + git config --global user.name '杨蒙恩' + git config --global user.email '16073658+yang-meng- en@user.noreply.gitee.com' + * 生成 RSA 密钥 + ssh-keygen -t rsa + * 获取 RSA 公钥内容,并配置到 SSH公钥 中 + cat ~/.ssh/id_rsa.pub +* Gitee命令 + * 'git push/pull' --- 推送 + * 'git add .' --- 添加所有修改的文件到暂存区 + * 'git commit -m "log"'--- commit,log是commit的标题 + * 'git log' --- 查看修改日志 + * 'git status' --- 查看文件状态 + * 'git checkout -b first_branch' --- 创建一个分支名为first_branch + * 'git switch' --- 切换分支 + * 'git branch' --- 查看分支 + * 'git reset --hard HEAD~' --- 硬重置,把上一个退一个commit + * 'git reset --soft HEAD~' --- 软重置,把上一个commit退回暂存区里 \ No newline at end of file