From f564c7469cc9cefc1c12c8f2ce468dd7c495dd0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=AF=E5=B0=8F=E8=91=B5?= <15860264+feng-xiaokui@user.noreply.gitee.com> Date: Tue, 22 Jul 2025 23:23:45 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E6=AC=A1=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../code.md" | 65 ++++++++++++++ .../note.md" | 89 +++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\343\200\220RSOC25\343\200\221Day2 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\206\257\345\256\276/code.md" create mode 100644 "2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\343\200\220RSOC25\343\200\221Day2 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\206\257\345\256\276/note.md" diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\343\200\220RSOC25\343\200\221Day2 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\206\257\345\256\276/code.md" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\343\200\220RSOC25\343\200\221Day2 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\206\257\345\256\276/code.md" new file mode 100644 index 0000000..ae63112 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\343\200\220RSOC25\343\200\221Day2 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\206\257\345\256\276/code.md" @@ -0,0 +1,65 @@ +# 【RSOC25】Day2 课程代码:冯宾 +#include +#include +#include + +void usr_thread1(void) +{ +    while(1) +    { +        rt_kprintf("run in usr thread1\r\n"); +        rt_thread_mdelay(100); +    } +} + +void usr_thread2(void) +{ +    while(1) +    { +        rt_kprintf("run in usr thread2\r\n"); +        rt_thread_mdelay(100); +    } +} + +void usr_thread3(void) +{ +    while(1) +    { +        rt_kprintf("run in usr thread3\r\n"); +        rt_thread_mdelay(100); +    } +} +rt_thread_t tid1 =RT_NULL; +rt_thread_t tid2 =RT_NULL; +rt_thread_t tid3 =RT_NULL; + +int main(void) +{ +    tid1 = rt_thread_create("usr1" , usr_thread1 , RT_NULL , 1024 ,4 , 5); + +    if (tid1 != RT_NULL) +    { +        rt_thread_startup(tid1); +    } + +    tid2 = rt_thread_create("usr2" , usr_thread2 , RT_NULL , 1024 , 5 , 5); + +    if (tid2 != RT_NULL) +    { +        rt_thread_startup(tid2); +    } + +    tid3 = rt_thread_create("usr3" , usr_thread3 , RT_NULL , 1024 , 6 , 5); + +    if (tid3 != RT_NULL) +    { +        rt_thread_startup(tid3); +    } +    rt_kprintf("run in main thread\r\n"); + +    while(1) rt_thread_mdelay(1000); + +    return RT_EOK; +} + + diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\343\200\220RSOC25\343\200\221Day2 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\206\257\345\256\276/note.md" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\343\200\220RSOC25\343\200\221Day2 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\206\257\345\256\276/note.md" new file mode 100644 index 0000000..8686150 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\343\200\220RSOC25\343\200\221Day2 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\206\257\345\256\276/note.md" @@ -0,0 +1,89 @@ +# 【RSOC25】Day2 课程笔记:冯宾 + +## rt_thread_init 和rt_thread_create 静态和动态线程区别 + +rt_thread_init   为静态线程,在编译阶段,代码编好后,为线程分配空间,这个空间,仅为这个线程使用。 + +适用于对安全有要求的场合 +几乎所有系统对系统内所有线程都是静态分配的方式 + +rt_thread_create  为动态线程   + +内存有限,但是需要的功能多,对安全没有太大的要求,为了内存富裕,采取动态分配。 + +动态内存运行一段时间过后,申请不到内存了,即为创建线程失败 + +## rt_thread_delete + +rt_thread_delete  删除一个已经创建的线程。该函数会终止指定线程的运行,并释放线程占用的系统资源(如线程控制块、堆栈空间等)。 + +## rt_thread_self + +rt_thread_self   用于获取当前正在执行的线程句柄(即线程控制块指针)。 + +## rt_thread_startup + +rt_thread_startup  通过该函数,可以将线程从初始状态转换到就绪状态,使其能够被操作系统调度执行。 + +## rt_thread_yield + +rt_thread_yield  用于主动让出 CPU 使用权,允许其他具有相同优先级的就绪线程获得执行机会。该函数在线程需要暂时放弃 CPU 资源时非常有用。 + +## rt_thread_find + +rt_thread_find   用于通过线程名称查找对应的线程句柄。这个函数在线程间通信或需要操作其他线程时非常有用。 +函数原型 + +## rt_thread_delay + +rt_thread_delay   是 RT-Thread 实时操作系统中用于使当前线程暂停执行(进入阻塞状态)的核心 API 函数。通过指定延时时间,线程可以主动释放 CPU 资源,让其他就绪线程有机会执行。、 + +## 时间线的单位是tick + +#define THREAD_TIMESLICE        5  //单位是毫秒 + +## 优先级大小:数字越小,优先级越大 + +#define THREAD_PRIORITY         25  //优先级是25 +#define RT_MAIN_THREAD_PRIORITY 10   //优先级是10 + +## 内核--线程接口参数 + +参数 + +name 线程的名称 +entry 线程的入口函数参数 +stack_size 线程栈的大小 +priority 线程的优先级 +tick 线程的时间片大小 + +返回 + +RE_EOK  线程创建成功 +-RE_ERROR  线程创建失败 + +## 线程状态切换 + +初始状态 +就绪状态 +关闭状态 +运行状态 +挂起状态:在一段时间内没有进行实际操作或任务处理 + +## 循环线程 + +无循环线程被执行完毕后,系统会自动回收资源,与需手动删除 + +循环线程需要有让出cpu的动作 +主动让出:使用系统延时 +被动让出:等待ipc + +## 系统的调度器 + +调度器的主要工作: +1.决定任务运行顺序 +2.执行任务切换 + +调度规则: +优先级抢占 +时间片轮转 -- Gitee