打印
[应用相关]

stm32 入门RT-Thread内核 ——线程创建

[复制链接]
545|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 一路向北lm 于 2021-1-10 17:00 编辑

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


使用特权

评论回复
沙发
一路向北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             线程时间片

使用特权

评论回复
5
一路向北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)

使用特权

评论回复
6
一路向北lm|  楼主 | 2021-1-10 16:58 | 只看该作者
启动线程:  rt_err_t rt_thread_startup(rt_thread_t thread)
参数1:struct rt_thread  thread   线程控制块

使用特权

评论回复
7
一路向北lm|  楼主 | 2021-1-10 16:59 | 只看该作者
基于STM32具体实例:创建一个LED线程
// 定义线程控制块
static rt_thread_t  led1_thread = RT_NULL;
// 线程入口函数
void led1_task(void *parameter)
{
    while(1)
                {
                   LED1_TURN;
               rt_thread_mdelay(500);
                }                
}
// 创建成功后并开启线程
led1_thread = rt_thread_create("led1",led1_task,RT_NULL,512,3,20);       
        if(led1_thread != RT_NULL)
                  rt_thread_startup(led1_thread);
    else
                 return -1;


使用特权

评论回复
8
一路向北lm|  楼主 | 2021-1-10 16:59 | 只看该作者
效果:可以看到led1已经运行起来了

使用特权

评论回复
9
一路向北lm|  楼主 | 2021-1-10 16:59 | 只看该作者
线程栈设计小妙招
设定栈的最大利用量为70%为前提,可以将led1的栈空间减小,这个也是调节栈空间的一个小方法,更改设置为256,看到led1线程利用量提高了一倍。

使用特权

评论回复
10
随风而去吧| | 2021-1-10 19:42 | 只看该作者
很棒棒哦,值得学习

使用特权

评论回复
11
玛尼玛尼哄| | 2021-1-10 22:42 | 只看该作者
还要用邮箱进行线程间的通信。

使用特权

评论回复
12
xinpian101| | 2021-1-10 23:53 | 只看该作者
学习学习。

使用特权

评论回复
13
一路向北lm|  楼主 | 2021-1-11 11:46 | 只看该作者
玛尼玛尼哄 发表于 2021-1-10 22:42
还要用邮箱进行线程间的通信。

IPC 机制  后面会写

使用特权

评论回复
14
一路向北lm|  楼主 | 2021-1-11 11:47 | 只看该作者

一起学习,一起进步哈

使用特权

评论回复
15
cainiao518| | 2021-1-11 13:25 | 只看该作者
学习交流,一起进步

使用特权

评论回复
16
观海| | 2021-2-3 21:03 | 只看该作者
前年我还拿到了一本介绍这个的书呢

使用特权

评论回复
17
guanjiaer| | 2021-2-3 21:06 | 只看该作者
基本上现成都是这个原理 是吗

使用特权

评论回复
18
heimaojingzhang| | 2021-2-3 21:13 | 只看该作者
小北介绍的很是详细

使用特权

评论回复
19
keaibukelian| | 2021-2-3 21:14 | 只看该作者
这个代码是最简单的了

使用特权

评论回复
20
labasi| | 2021-2-3 21:15 | 只看该作者
如何结束县城呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

277

主题

3805

帖子

76

粉丝