[应用相关] stm32 入门RT-Thread内核 ——线程创建

[复制链接]
998|19
 楼主| 一路向北lm 发表于 2021-1-10 16:56 | 显示全部楼层 |阅读模式
本帖最后由 一路向北lm 于 2021-1-10 17:00 编辑

RT-Thread线程主要有三个部分组成:入口函数线程控制块线程栈
入口函数:即是线程代码,是一个无限循环的函数。类似于下面的函数
  1. void led1_task(void *parameter)
  2. {
  3.     while(1)
  4.                 {
  5.                    LED1_TURN;
  6.              rt_thread_mdelay(500);
  7.                 }         
  8. }


 楼主| 一路向北lm 发表于 2021-1-10 16:57 | 显示全部楼层
线程控制块:是操作系统用于管理线程的一个数据结构,它会存放一些信息,比如优先级、线程的名称、线程状态等,也包括线程与线程之间连接用的链表结构,线程等待事件集合等。
 楼主| 一路向北lm 发表于 2021-1-10 16:57 | 显示全部楼层
线程栈:RT-Thread每个线程都具有独立的栈空间,当进行线程切换时,系统会将当前的上下文保存到线程栈中,当线程要恢复运行时,再从线程中读取上下文信息,恢复线程的运行。线程上下文指的是线程执行时的环境,具体来说是各个变量和数据包括所有寄存器变量、堆栈信息、内存信息等。
 楼主| 一路向北lm 发表于 2021-1-10 16:58 | 显示全部楼层
静态创建线程:  :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)
参数1:struct rt_thread *thread   线程控制块地址
参数2:  const char       *name  线程名称
参数2: void (*entry)(void *parameter),   线程入口函数
参数3: void             *parameter,  线程入口函数参数
参数4: void             *stack_start,  线程堆栈起始地址
参数5: rt_uint32_t       stack_size, 线程堆栈大小
参数6: rt_uint8_t        priority,   线程优先级
参数7: rt_uint32_t       tick             线程时间片
 楼主| 一路向北lm 发表于 2021-1-10 16:58 | 显示全部楼层
动态创建线程: 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)
 楼主| 一路向北lm 发表于 2021-1-10 16:58 | 显示全部楼层
启动线程:  rt_err_t rt_thread_startup(rt_thread_t thread)
参数1:struct rt_thread  thread   线程控制块
 楼主| 一路向北lm 发表于 2021-1-10 16:59 | 显示全部楼层
基于STM32具体实例:创建一个LED线程
  1. // 定义线程控制块
  2. static rt_thread_t  led1_thread = RT_NULL;
  3. // 线程入口函数
  4. void led1_task(void *parameter)
  5. {
  6.     while(1)
  7.                 {
  8.                    LED1_TURN;
  9.                rt_thread_mdelay(500);
  10.                 }                
  11. }
  12. // 创建成功后并开启线程
  13. led1_thread = rt_thread_create("led1",led1_task,RT_NULL,512,3,20);       
  14.         if(led1_thread != RT_NULL)
  15.                   rt_thread_startup(led1_thread);
  16.     else
  17.                  return -1;


 楼主| 一路向北lm 发表于 2021-1-10 16:59 | 显示全部楼层
效果:可以看到led1已经运行起来了
141055ffac1ed775a2.png
 楼主| 一路向北lm 发表于 2021-1-10 16:59 | 显示全部楼层
线程栈设计小妙招
设定栈的最大利用量为70%为前提,可以将led1的栈空间减小,这个也是调节栈空间的一个小方法,更改设置为256,看到led1线程利用量提高了一倍。
854835ffac1fc354e6.png
随风而去吧 发表于 2021-1-10 19:42 | 显示全部楼层
很棒棒哦,值得学习
玛尼玛尼哄 发表于 2021-1-10 22:42 | 显示全部楼层
还要用邮箱进行线程间的通信。
xinpian101 发表于 2021-1-10 23:53 | 显示全部楼层
学习学习。
 楼主| 一路向北lm 发表于 2021-1-11 11:46 | 显示全部楼层
玛尼玛尼哄 发表于 2021-1-10 22:42
还要用邮箱进行线程间的通信。

IPC 机制  后面会写
 楼主| 一路向北lm 发表于 2021-1-11 11:47 | 显示全部楼层

一起学习,一起进步哈
cainiao518 发表于 2021-1-11 13:25 | 显示全部楼层
学习交流,一起进步
观海 发表于 2021-2-3 21:03 | 显示全部楼层
前年我还拿到了一本介绍这个的书呢
guanjiaer 发表于 2021-2-3 21:06 | 显示全部楼层
基本上现成都是这个原理 是吗
heimaojingzhang 发表于 2021-2-3 21:13 | 显示全部楼层
小北介绍的很是详细
keaibukelian 发表于 2021-2-3 21:14 | 显示全部楼层
这个代码是最简单的了
labasi 发表于 2021-2-3 21:15 | 显示全部楼层
如何结束县城呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

3837

帖子

81

粉丝
快速回复 在线客服 返回列表 返回顶部