From a1216ee3d63fc8906aaf3a82683e5bc80439632a Mon Sep 17 00:00:00 2001 From: lwhkkkk <88980173+lwhkkkk@users.noreply.github.com> Date: Wed, 23 Jul 2025 00:35:16 +0800 Subject: [PATCH 1/5] update --- ...00\345\244\251\344\275\234\344\270\232.md" | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 "2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\200\345\244\251\344\275\234\344\270\232.md" diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\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)/\345\210\230\347\272\254\346\201\222/\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 0000000..0d2b565 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\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,44 @@ +# Git + + + +## 总结常用 Git 命令 + +**git push/pull** + 推送代码:将你在本地进行的修改上传到远程仓库, + 拉取代码:从远程仓库获取最新的代码,更新到本地。 + +**git add .** + 将所有已修改的文件加入到暂存区。 + +**git commit -m "xx"** + 提交修改,并附加一个 标题。 + + **git log** + 查看提交的历史记录。 + +**git status** + 查看当前文件所处的状态(主要是被修改和未提交的文件)。 + +**git checkout -b xx_branch** + 创建一个新的分支,名称为 `xx_branch`,并切换到该分支。 + +--- + +# env 使用方法 + + **pkgs --upgrade** + 可以把已有的软件包升级。 + + + + **scons -j4** + 使用 `scons` 构建工具进行多线程编译(此处 -j4 表示使用 4 个线程) + 如果报错提示缺少 `config` 文件,可以先打开 `menuconfig`,配置完保存并退出后再重新编译。 + +**使用 QEMU 模拟器** + 运行 `qemu-nographic.bat` 启动 QEMU 的无图形界面模式。 + 直接运行 `qemu` 启动带图形界面版本。按 Ctrl + Alt + G 释放鼠标,按 Ctrl + C 可退出模拟器。 + +**在 QEMU 中查看命令** + 使用 `help` 命令查看 QEMU 的相关命令。 -- Gitee From 424068aa46fa82d28199dc228313b0c992f2dabe Mon Sep 17 00:00:00 2001 From: lwhkkkk <88980173+lwhkkkk@users.noreply.github.com> Date: Fri, 1 Aug 2025 00:14:14 +0800 Subject: [PATCH 2/5] day2 homework --- .../main.c" | 92 +++++++++++++++++++ ...14\345\244\251\347\254\224\350\256\260.md" | 81 ++++++++++++++++ 2 files changed, 173 insertions(+) create mode 100644 "2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/main.c" create mode 100644 "2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\347\254\224\350\256\260.md" diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/main.c" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/main.c" new file mode 100644 index 0000000..5158bb6 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/main.c" @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift first version + * 2018-11-19 flybreak add stm32f407-atk-explorer bsp + */ + +#include +#include +#include + +/* defined the LED0 pin: PF9 */ +#define LED0_PIN GET_PIN(F, 9) +#define THREAD_STACK_SIZE 512 +#define THREAD1_PRIORITY 8 +#define THREAD2_PRIORITY 10 +#define THREAD3_PRIORITY 10 + +#define THREAD_TIMESLICE 5 + +static rt_thread_t tid1 = RT_NULL; +static rt_thread_t tid2 = RT_NULL; +static rt_thread_t tid3 = RT_NULL; + + +void thread1_entry(void *parameter) +{ + while(1) + { + rt_kprintf("high priority thread1 running\n"); + rt_thread_mdelay(20); + } +} + +void thread2_entry(void *parameter) +{ + while(1) + { + rt_kprintf("thread2 running\n"); + rt_thread_mdelay(10); + } +} + + +void thread3_entry(void *parameter) +{ + while(1) + { + rt_kprintf("thread3 running\n"); + rt_thread_mdelay(10); + } +} + + + + + +int main(void) +{ //高优先级 + tid1 = rt_thread_create("t1", + thread1_entry, + RT_NULL, + THREAD_STACK_SIZE, + THREAD1_PRIORITY, + THREAD_TIMESLICE); + + //低优先级 + tid2 = rt_thread_create("t2", + thread2_entry, + RT_NULL, + THREAD_STACK_SIZE, + THREAD2_PRIORITY, + THREAD_TIMESLICE); + + tid3 = rt_thread_create("t3", + thread3_entry, + RT_NULL, + THREAD_STACK_SIZE, + THREAD3_PRIORITY, + THREAD_TIMESLICE); + + if(tid1 != RT_NULL) rt_thread_startup(tid1); + if(tid2 != RT_NULL) rt_thread_startup(tid2); + if(tid3 != RT_NULL) rt_thread_startup(tid3); + + return RT_EOK; + +} diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\347\254\224\350\256\260.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\347\254\224\350\256\260.md" new file mode 100644 index 0000000..54c438e --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\344\275\234\344\270\232/\347\254\254\344\272\214\345\244\251\347\254\224\350\256\260.md" @@ -0,0 +1,81 @@ + +# rt_thread 函数详解 + +## 函数原型 + +```c +rt_thread_t rt_thread_create( + const char *name, + void (*entry)(void *parameter), + void *parameter, + rt_uint32_t stack_size, + rt_uint8_t priority, + rt_uint32_t tick +); + +``` +## 函数说明 + +- 在程序运行时通过动态内存分配方式创建一个新的线程对象; +- 初始化线程控制块、分配线程栈空间; +- 设置线程的名称、入口函数、参数、优先级、时间片等属性; +- 返回线程对象指针,用于后续管理; +- **注意**:调用该函数只是创建线程,不会立即启动线程,需要额外调用 `rt_thread_startup()` 启动它。 + + +## 函数源码 + +```c +rt_err_t rt_thread_yield(void) +{ + struct rt_thread *thread; + rt_base_t lock; + + thread = rt_thread_self(); + lock = rt_hw_interrupt_disable(); + + thread->remaining_tick = thread->init_tick; + thread->stat |= RT_THREAD_STAT_YIELD; + + rt_schedule(); + rt_hw_interrupt_enable(lock); + + return RT_EOK; +} +``` +## 函数作用说明 + +`rt_thread_yield` 是 RT-Thread 实时操作系统中的线程调度函数,用于让当前线程主动放弃 CPU 的使用权。 + +调用该函数后: + +- 当前线程不会进入挂起或阻塞状态; +- 它会把 CPU 执行权交还给调度器; +- 如果有其他相同优先级的线程处于就绪状态,那么这些线程有机会被调度执行; +- 如果没有其他同优先级的线程,当前线程仍会继续运行。 + + +## 函数原型 + +```c +rt_err_t rt_thread_init( + struct rt_thread *thread, + const char *name, + void (*entry)(void *parameter), + void *parameter, + void *stack_start, + rt_uint32_t stack_size, + rt_uint8_t priority, + rt_uint32_t tick +); +``` + +## 函数作用说明 + +`rt_thread_init` 是 RT-Thread 实时操作系统中用于静态初始化线程的函数。 + +与 `rt_thread_create` 不同,它不进行动态内存分配,而是要求用户手动提供线程控制块和线程栈空间。其作用是将这些信息初始化为一个可调度的线程对象。 + +调用该函数后,线程并不会立即运行,仍需要手动调用 `rt_thread_startup()` 启动线程。 + + -- Gitee From b4c4d6e1d56dd6048d383365dfa37bbcafd4dfd3 Mon Sep 17 00:00:00 2001 From: lwhkkkk <88980173+lwhkkkk@users.noreply.github.com> Date: Sun, 3 Aug 2025 03:57:33 +0800 Subject: [PATCH 3/5] update homeworkday3 --- .../event_demo.c" | 89 +++++++++++++++++++ .../mailbox_demo.c" | 72 +++++++++++++++ .../msgqueue_demo.c" | 80 +++++++++++++++++ .../mutex_demo.c" | 62 +++++++++++++ .../sem_demo.c" | 64 +++++++++++++ .../signal_demo.c" | 63 +++++++++++++ ...11\345\244\251\347\254\224\350\256\260.md" | 82 +++++++++++++++++ 7 files changed, 512 insertions(+) create mode 100644 "2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/event_demo.c" create mode 100644 "2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/mailbox_demo.c" create mode 100644 "2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/msgqueue_demo.c" create mode 100644 "2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/mutex_demo.c" create mode 100644 "2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/sem_demo.c" create mode 100644 "2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/signal_demo.c" create mode 100644 "2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260.md" diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/event_demo.c" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/event_demo.c" new file mode 100644 index 0000000..2c8064f --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/event_demo.c" @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-08-03 点点 the first version + */ + +#include +#include "event_demo.h" + +#define THREAD_STACK_SIZE 1024 +#define THREAD_PRIORITY 20 +#define THREAD_TIMESLICE 10 + + +#define EVENT_FLAG1 (1 << 0) +#define EVENT_FLAG2 (1 << 1) + + +static rt_event_t demo_event = RT_NULL; +static rt_thread_t sender_thread =RT_NULL; +static rt_thread_t receiver_thread = RT_NULL; + +static void sender_entry(void *parameter) +{ + rt_uint8_t count = 0; + + while (1) + { + if (count % 2 == 0 ) + { + rt_event_send(demo_event,EVENT_FLAG1); + rt_kprintf("send EVENT_FLAG1\n"); + } + else + { + rt_event_send(demo_event, EVENT_FLAG2); + rt_kprintf("send EVENT_FLAG2\n"); + } + + + count++; + rt_thread_mdelay(1000); + } +} + + static void receiver_entry(void *parameter) + { + rt_uint32_t received; + + while(1) + { + if(rt_event_recv(demo_event, EVENT_FLAG1 | EVENT_FLAG2, RT_EVENT_FLAG_OR |RT_EVENT_FLAG_CLEAR, 2000, &received)==RT_EOK) + { + if(received & EVENT_FLAG1) + rt_kprintf("receiver Event_FLAG1\n"); + if(received & EVENT_FLAG2) + rt_kprintf("receiver Event_FLAG2\n"); + } + + else { + rt_kprintf("receiver timeout\n"); + } + } + } + + void event_demo_init(void) + { + demo_event = rt_event_create("demo_event", RT_IPC_FLAG_PRIO); + if(demo_event == RT_NULL) + { + rt_kprintf("create error \n"); + return ; + } + + + sender_thread = rt_thread_create("sender",sender_entry,RT_NULL,THREAD_STACK_SIZE,THREAD_PRIORITY,THREAD_TIMESLICE); + if(sender_thread != RT_NULL) + rt_thread_startup(sender_thread); + + + receiver_thread =rt_thread_create("receiver",receiver_entry,RT_NULL,THREAD_STACK_SIZE,THREAD_PRIORITY,THREAD_TIMESLICE); + if(receiver_thread != RT_NULL) + rt_thread_startup(receiver_thread); + } + diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/mailbox_demo.c" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/mailbox_demo.c" new file mode 100644 index 0000000..8105c85 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/mailbox_demo.c" @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-08-03 点点 the first version + */ +#include +#include "mailbox_demo.h" + +#define THREAD_STACK_SIZE 512 +#define THREAD_PRIORITY 20 +#define THREAD_TIMESLICE 5 + +#define MAILBOX_SIZE 4 + +static rt_thread_t sender_tid = RT_NULL; +static rt_thread_t receiver_tid = RT_NULL; + +static rt_mailbox_t mb = RT_NULL; + +static void sender_entry(void *param) +{ + rt_uint32_t msg = 100; + + while (1) + { + rt_kprintf("seed message %d\n", msg); + rt_mb_send(mb, msg++); + + rt_thread_mdelay(1000); + } +} + + +static void receiver_entry(void *param) +{ + rt_uint32_t received_msg; + + while (1) + { + + if (rt_mb_recv(mb, &received_msg, RT_WAITING_FOREVER) == RT_EOK) + { + rt_kprintf("receiver message %d\n", received_msg); + } + } +} + + +void mailbox_demo_init(void) +{ + + mb = rt_mb_create("demo_mb", MAILBOX_SIZE, RT_IPC_FLAG_FIFO); + if (mb == RT_NULL) + { + rt_kprintf("create error\n"); + return; + } + + sender_tid = rt_thread_create("sender", sender_entry, RT_NULL, + THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); + if (sender_tid != RT_NULL) + rt_thread_startup(sender_tid); + + receiver_tid = rt_thread_create("receiver", receiver_entry, RT_NULL, + THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE); + if (receiver_tid != RT_NULL) + rt_thread_startup(receiver_tid); +} diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/msgqueue_demo.c" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/msgqueue_demo.c" new file mode 100644 index 0000000..d9956dd --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/msgqueue_demo.c" @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-08-03 点点 the first version + */ + +#include +#include "msgqueue_demo.h" + +#define THREAD_STACK_SIZE 512 +#define THREAD_PRIORITY 20 +#define THREAD_TIMESLICE 5 +#define MSG_SIZE 32 +#define MSG_QUEUE_SIZE 8 +static rt_thread_t sender_tid = RT_NULL; +static rt_thread_t receiver_tid = RT_NULL; + +static rt_mq_t mq = RT_NULL; + + +static void sender_entry(void *parameter) +{ + char msg[MSG_SIZE]; + rt_uint32_t count = 0; + + while (1) + { + rt_snprintf(msg, sizeof(msg), "Hello %d", count++); + if (rt_mq_send(mq, msg, rt_strlen(msg) + 1) == RT_EOK) + { + rt_kprintf("seed thread %s\n", msg); + } + + rt_thread_mdelay(1000); + } +} + + +static void receiver_entry(void *parameter) +{ + char msg[MSG_SIZE]; + + while (1) + { + rt_memset(msg, 0, sizeof(msg)); + + if (rt_mq_recv(mq, msg, sizeof(msg), RT_WAITING_FOREVER) == RT_EOK) + { + rt_kprintf("receiver thread%s\n", msg); + } + } +} + + +void msgqueue_demo_init(void) +{ + + mq = rt_mq_create("demo_mq", MSG_SIZE, MSG_QUEUE_SIZE, RT_IPC_FLAG_FIFO); + if (mq == RT_NULL) + { + rt_kprintf("消息队列创建失败!\n"); + return; + } + + + sender_tid = rt_thread_create("sender", sender_entry, RT_NULL, + THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); + if (sender_tid != RT_NULL) + rt_thread_startup(sender_tid); + + + receiver_tid = rt_thread_create("receiver", receiver_entry, RT_NULL, + THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE); + if (receiver_tid != RT_NULL) + rt_thread_startup(receiver_tid); +} diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/mutex_demo.c" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/mutex_demo.c" new file mode 100644 index 0000000..fabfeab --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/mutex_demo.c" @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-08-03 点点 the first version + */ + + +#include +#include "mutex_demo.h" + + +#define THREAD_STACK_SIZE 1024 +#define THREAD_PRIORITY 20 +#define THREAD_TIMESLICE 10 + + +static rt_mutex_t demo_mutex = RT_NULL; +static rt_thread_t thread1 = RT_NULL; +static rt_thread_t thread2 =RT_NULL; + +static void thread_entry(void *parameter) +{ + char *name = (char *)parameter; + while(1) + { + if (rt_mutex_take(demo_mutex, RT_WAITING_FOREVER) == RT_EOK) + { + rt_kprintf("%s get mutex start print\n",name); + rt_thread_mdelay(500); + rt_kprintf("%s print finish\n",name); + rt_mutex_release(demo_mutex); + } + + + rt_thread_mdelay(100); + } +} + +void mutex_demo_init(void) +{ + demo_mutex = rt_mutex_create("demo_mutex",RT_IPC_FLAG_PRIO); + if(demo_mutex == RT_NULL) + { + rt_kprintf(" create mutex error!\n"); + return; + } + + + thread1 = rt_thread_create("thread1", thread_entry, "thread1", THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); + if (thread1 != RT_NULL) + rt_thread_startup(thread1); + thread2 = rt_thread_create("thread2", thread_entry, "thread2", THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); + + if(thread2 != RT_NULL) + rt_thread_startup(thread2); +} + + diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/sem_demo.c" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/sem_demo.c" new file mode 100644 index 0000000..b44b29e --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/sem_demo.c" @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-08-02 点点 the first version + */ + +#include +#include"sem_demo.h" + + +#define THREAD_STACK_SIZE 512 +#define THREAD_PRIORITY 20 +#define THREAD_TIMESLICE 5 + +static rt_thread_t tid1 = RT_NULL; +static rt_thread_t tid2 = RT_NULL; + +static rt_sem_t sem = RT_NULL; + +//线程1:等待信号量 +static void thread1_entry(void *parameter) +{ + while(1) + { + if (rt_sem_take(sem, RT_WAITING_FOREVER) == RT_EOK) + { + rt_kprintf("thread1 go on\n"); + } + } +} +//线程2:每秒释放一次信号量 +static void thread2_entry(void *parameter) +{ + while(1) + { + rt_thread_mdelay(1000); + rt_kprintf("thread2 ok\n"); + rt_sem_release(sem); + } +} + + +void sem_demo_init(void) +{ + sem = rt_sem_create("demo_Sem", 0, RT_IPC_FLAG_FIFO); + if(sem == RT_NULL) + { + rt_kprintf("sem error\n"); + return; + } + + tid1 = rt_thread_create("t1", thread1_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); + if(tid1 != RT_NULL) + rt_thread_startup(tid1); + tid2 = rt_thread_create("t2", thread2_entry, RT_NULL,THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE); + + if(tid2 != RT_NULL) + rt_thread_startup(tid2); + +} diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/signal_demo.c" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/signal_demo.c" new file mode 100644 index 0000000..c2f30a6 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/signal_demo.c" @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-08-03 点点 the first version + */ + +#include +#include +#include "signal_demo.h" + +#define THREAD_STACK_SIZE 512 +#define THREAD_PRIORITY 20 +#define THREAD_TIMESLICE 5 + +static rt_thread_t thread1 = RT_NULL; +static rt_thread_t thread2 = RT_NULL; + + +static void sig_usr1_handler(int signo) +{ + rt_kprintf("thread1 reciver SIGUSR1\n"); +} + + +static void thread1_entry(void *param) +{ + + signal(SIGUSR1, sig_usr1_handler); + + + while (1) + { + rt_thread_mdelay(1000); + } +} + + +static void thread2_entry(void *param) +{ + while (1) + { + rt_kprintf("thread2:send SIGUSR1 to thread1\n"); + rt_thread_kill(thread1, SIGUSR1); // 向线程1发送信号 + rt_thread_mdelay(2000); + } +} + +void signal_demo_init(void) +{ + thread1 = rt_thread_create("recv", thread1_entry, RT_NULL, + THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); + if (thread1 != RT_NULL) + rt_thread_startup(thread1); + + thread2 = rt_thread_create("send", thread2_entry, RT_NULL, + THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE); + if (thread2 != RT_NULL) + rt_thread_startup(thread2); +} diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260.md" new file mode 100644 index 0000000..ac98b55 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\344\275\234\344\270\232/\347\254\254\344\270\211\345\244\251\347\254\224\350\256\260.md" @@ -0,0 +1,82 @@ +## 函数介绍:`rt_sem_create` + +```c +rt_sem_t rt_sem_create(const char *name, + rt_uint32_t value, + rt_uint8_t flag); +``` + + +## 函数说明 + +- 在程序运行时通过动态内存分配方式创建一个新的信号量(semaphore)对象; +- 初始化信号量控制块,并设置初始计数值(资源数); +- 设置信号量的名称、初始值和线程等待方式(如 FIFO 或按优先级); +- 返回信号量对象的句柄(`rt_sem_t` 类型),可用于后续 `take` / `release` 操作; +- 注意:该函数创建的信号量为动态对象,需要通过 `rt_sem_delete()` 手动释放资源; + +## 函数介绍:`rt_sem_delete` + +```c +rt_err_t rt_sem_delete(rt_sem_t sem); +``` + +## 函数说明 + +- 当系统不再使用某个信号量时,可通过该函数删除信号量以释放系统资源; +- 系统将注销该信号量对象,并释放其占用的内存; +- 如果有线程正在等待该信号量,删除操作将会唤醒所有等待线程; +- 被唤醒的线程返回值为 `-RT_ERROR`,表示该信号量已无效; +- 删除操作完成后,信号量对象的内存将被释放。 + + +## 函数介绍:`rt_sem_take` + +```c +rt_err_t rt_sem_take(rt_sem_t sem, rt_int32_t time); +``` + +## 函数说明 + +- 线程通过该函数尝试获取信号量资源实例; +- 当信号量值大于 0 时,线程立即获得信号量,信号量值减 1; +- 如果信号量当前值为 0(即资源暂不可用),线程将根据 `time` 参数的不同,选择: + - 直接返回(立即失败); + - 挂起等待一段时间; + - 永久等待直到其他线程释放信号量; +- 如果在等待时间内仍然无法获得信号量,线程将超时返回,返回值为 `-RT_ETIMEOUT`; +- 若在等待期间信号量被删除,线程也会被唤醒并返回 `-RT_ERROR`。 + +## 函数介绍:`rt_sem_trytake` + +```c +rt_err_t rt_sem_trytake(rt_sem_t sem); +``` + +## 函数说明 + +- 当线程不希望阻塞等待信号量时,可以使用该函数进行非阻塞获取; +- 该函数相当于 `rt_sem_take(sem, RT_WAITING_NO)` 的快捷版本; +- 如果信号量当前值大于 0,线程将立即获取信号量,信号量值减 1; +- 如果信号量当前值为 0(不可用),该函数会立即返回,不会等待; +- 返回值为 `-RT_ETIMEOUT` 表示信号量不可用,获取失败。 + +## 函数介绍:`rt_mutex_create` + +```c +rt_mutex_t rt_mutex_create(const char *name, rt_uint8_t flag) +``` +## 函数说明 + +- 该函数用于动态创建一个互斥量(mutex)对象,互斥量的名字由参数 `name` 指定; +- 系统会从对象管理器中分配一个 `mutex` 对象,并初始化其属性; +- 初始化时会设置 IPC 父类属性以及互斥量相关信息; +- 虽然函数带有 `flag` 参数,但对于互斥量来说flag 参数已作废; +- 不论传入 `RT_IPC_FLAG_FIFO` 还是 `RT_IPC_FLAG_PRIO`,系统始终会使用 `RT_IPC_FLAG_PRIO`(按优先级排队)处理互斥量等待队列。 + + + + + + + -- Gitee From e5484cdd97abade4cd6e7f422fe93756013cdd44 Mon Sep 17 00:00:00 2001 From: lwhkkkk <88980173+lwhkkkk@users.noreply.github.com> Date: Sun, 3 Aug 2025 15:04:14 +0800 Subject: [PATCH 4/5] update day homework --- .../virt_device.c" | 9 +++ ...33\345\244\251\347\254\224\350\256\260.md" | 65 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 "2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/virt_device.c" create mode 100644 "2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260.md" diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/virt_device.c" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/virt_device.c" new file mode 100644 index 0000000..95cd960 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/virt_device.c" @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-08-03 点点 the first version + */ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260.md" new file mode 100644 index 0000000..ce5f0c6 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\347\254\224\350\256\260.md" @@ -0,0 +1,65 @@ +## 函数介绍:`rt_device_create` / `rt_device_destroy` +```c +rt_device_t rt_device_create(int type, int attach_size); +void rt_device_destroy(rt_device_t device); +``` + + +## 函数说明 + +- `rt_device_create()`:用于动态创建一个设备对象; +- `rt_device_destroy()`:用于销毁之前创建的设备对象; +- 创建设备时会自动为设备分配内存,并初始化基本字段; +- 设备创建成功后返回 `rt_device_t` 类型的句柄,失败返回 `RT_NULL`; +- 销毁设备时释放其分配的内存资源,避免内存泄露; + + + +## 函数介绍:`rt_device_register` / `rt_device_unregister` + +```c +rt_err_t rt_device_register(rt_device_t dev, const char *name, rt_uint8_t flags); +rt_err_t rt_device_unregister(rt_device_t dev); +``` + +## 函数说明 + +- `rt_device_register()`:用于将设备注册到系统设备管理器中; +- 注册后,设备可以被 `rt_device_find()` 查找到并用于读写操作; +- 需要指定设备名、操作标志等参数; +- `rt_device_unregister()`:将设备从系统中注销,释放其在设备表中的记录; +- 常用于动态设备的注册与释放,如虚拟设备、外挂设备等。 + + + +## 函数介绍:`rt_device_open` / `rt_device_close` + + +```c +rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflags); +rt_err_t rt_device_close(rt_device_t dev); +``` + +## 函数说明 + +- `rt_device_open()`:用于打开一个设备对象,为后续 `read` / `write` 做准备; +- 打开设备时可指定打开模式标志(如读写、只读、独占等); +- 如果设备设置了 `RT_DEVICE_FLAG_STANDALONE`(独占模式),则不允许重复打开; +- `rt_device_close()`:用于关闭设备,释放设备使用权; +- 注意:重复关闭或关闭已销毁设备将返回错误。 +- +## 函数介绍:查找 SPI 设备(`rt_device_find`) + +```c +rt_device_t rt_device_find(const char *name); +``` + +## 函数说明 + +在使用 SPI 设备前,必须先通过设备名称调用 `rt_device_find()` 函数获取该设备的句柄,后续才能进行 `open`、`read`、`write`、`control` 等操作。 + + + + + + -- Gitee From 9eb46899a1939182c5870d4368e717ebb9590aa3 Mon Sep 17 00:00:00 2001 From: lwhkkkk <88980173+lwhkkkk@users.noreply.github.com> Date: Sun, 3 Aug 2025 23:48:26 +0800 Subject: [PATCH 5/5] day5 homework --- .../main.c" | 66 +++++++++++++++++ ...46\344\271\240\347\254\224\350\256\260.md" | 72 +++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 "2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/main.c" create mode 100644 "2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/\345\255\246\344\271\240\347\254\224\350\256\260.md" diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/main.c" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/main.c" new file mode 100644 index 0000000..dbed465 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/main.c" @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020/12/31 Bernard Add license info + */ + +#include +#include +#include + + +#define MQTT_HOST "broker.emqx.io" +#define MQTT_PORT 1883 +#define MQTT_CLIENT_ID CONFIG_MQTT_CLIENT_ID +#define MQTT_USER CONFIG_MQTT_USERNAME +#define MQTT_PASS CONFIG_MQTT_PASSWORD +#define MQTT_PUB_TOPIC CONFIG_MQTT_PUBLISH_TOPIC + +#define STUDENT_NAME CONFIG_STUDENT_NAME +#define STUDY_MESSAGE CONFIG_STUDY_MESSAGE + +static mqtt_client_t *client = RT_NULL; + +static void mqtt_start(void) +{ + struct mqtt_connect_client_info_t ci = { + .client_id = MQTT_CLIENT_ID, + .client_user = MQTT_USER, + .client_pass = MQTT_PASS, + .keep_alive = 60, + }; + + client = mqtt_client_new(); + if (client == RT_NULL) + { + rt_kprintf("MQTT client create failed!\n"); + return; + } + + mqtt_client_connect(client, MQTT_HOST, MQTT_PORT, RT_NULL, &ci, RT_NULL); +} + +static void mqtt_upload_info(void) +{ + char payload[128]; + rt_snprintf(payload, sizeof(payload), + "{ \"name\": \"%s\", \"study\": \"%s\" }", + STUDENT_NAME, STUDY_MESSAGE); + + mqtt_publish(client, MQTT_PUB_TOPIC, + payload, strlen(payload), 0, 0); + rt_kprintf("Upload message: %s\n", payload); +} + +int main(void) +{ + mqtt_start(); + rt_thread_mdelay(3000); + mqtt_upload_info(); + + return 0; +} diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/\345\255\246\344\271\240\347\254\224\350\256\260.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/\345\255\246\344\271\240\347\254\224\350\256\260.md" new file mode 100644 index 0000000..be4469a --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\345\210\230\347\272\254\346\201\222/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/\345\255\246\344\271\240\347\254\224\350\256\260.md" @@ -0,0 +1,72 @@ +# Kconfig 的工作机制介绍 + +RT-Thread 使用 Kconfig 配置系统用于实现组件选择、功能裁剪和灵活配置。该机制源自 Linux 内核,能方便用户根据项目需求灵活启用或禁用模块功能。 + +## Kconfig 简介 + +Kconfig 是一套基于菜单配置的机制,配合 `menuconfig` 工具使用,用户可以通过图形化界面或命令行配置系统选项,生成 `.config` 文件。 + +在 RT-Thread 中,Kconfig 常用于配置如下内容: + +- 内核功能(调度器、定时器、信号量等) +- 驱动组件(串口、I2C、SPI 等) +- 软件包(如 lwIP、FinSH) +- 板级支持包(BSP)配置 + + +## Kconfig 编写 + +每个组件目录下包含一个 `Kconfig` 文件,定义当前模块的配置项: + +```kconfig +config RT_USING_HEAP + bool "Enable heap memory management" + default y +``` +## menuconfig 工具启动 + +通过 `scons --menuconfig` 或 `python menuconfig.py` 启动图形化配置界面(基于 `kconfig-frontends`)。 + +## 生成 .config 文件 + +用户在配置界面中选择所需功能,生成 `.config` 文件,格式为: + +```text +CONFIG_RT_USING_HEAP=y +CONFIG_RT_USING_CONSOLE=y +``` + +## 生成 rtconfig.h + +系统通过 Python 脚本解析 `.config`,生成 `rtconfig.h`,内容为: + +```c +#define RT_USING_HEAP +#define RT_USING_CONSOLE +``` + +## 参与编译 + +所有组件通过包含 `rtconfig.h` 判断功能是否启用,从而决定是否参与编译。 + +# RTThread软件包介绍 + +## 软件包简介 + +软件包(Package)是 RT-Thread 生态中的重要组成部分,它封装了各种通用功能模块,便于开发者直接调用。软件包由 RT-Thread 官方或社区维护,具有如下特点: + +- **通用性强**:涵盖传感器驱动、网络协议栈、文件系统、人工智能、中间件等; +- **易于集成**:通过 RT-Thread 的软件包管理工具(`RT-Thread Package Manager`)进行集成; +- **可裁剪性好**:支持配置开关,只引入需要的功能,节省资源; +- **跨平台**:支持在多个架构和芯片上移植使用。 + +## 软件包分类 + +- **设备驱动** 示例软件包:sensor、wifi、camera 等,用于封装各种硬件设备的驱动,便于在不同平台上快速使用硬件资源。 +- **网络协议栈** 示例软件包:lwIP、AT、EasyMQTT 等,支持 TCP/IP 协议、物联网通信等常用网络功能。 +- **文件系统** 示例软件包:DFS、FATFS、LittleFS 等,支持挂载本地文件系统或 SPI Flash,提高数据存储能力。 +- **工具与调试** 示例软件包:FinSH、log 等,提供 shell 命令、日志打印等调试能力,辅助开发。 +- **AI 与算法支持** 示例软件包:uAI、NNOM、uNN 等,实现边缘设备上的神经网络推理和轻量级算法处理。 +- **UI 图形界面** 示例软件包:GUIEngine、LVGL 等,提供图形化用户界面支持,适合嵌入式人机交互应用。 + + -- Gitee