RT-Thread线程创建和删除

简介: RT-Thread线程创建和删除

线程的工作机制

在 RT-Thread 中,线程控制块由结构体 struct rt_thread 表示,线程控制块是操作系统用于管理线程的一个数据结构,它会存放线程的一些信息,例如优先级、线程名称、线程状态等,也包含线程与线程之间连接用的链表结构,线程等待事件集合等,详细定义如下:

/* 线程控制块 */
struct rt_thread
{
    /* rt 对象 */
    char        name[RT_NAME_MAX];     /* 线程名称 */
    rt_uint8_t  type;                   /* 对象类型 */
    rt_uint8_t  flags;                  /* 标志位 */
    rt_list_t   list;                   /* 对象列表 */
    rt_list_t   tlist;                  /* 线程列表 */
    /* 栈指针与入口指针 */
    void       *sp;                      /* 栈指针 */
    void       *entry;                   /* 入口函数指针 */
    void       *parameter;              /* 参数 */
    void       *stack_addr;             /* 栈地址指针 */
    rt_uint32_t stack_size;            /* 栈大小 */
    /* 错误代码 */
    rt_err_t    error;                  /* 线程错误代码 */
    rt_uint8_t  stat;                   /* 线程状态 */
    /* 优先级 */
    rt_uint8_t  current_priority;    /* 当前优先级 */
    rt_uint8_t  init_priority;        /* 初始优先级 */
    rt_uint32_t number_mask;
    ......
    rt_ubase_t  init_tick;               /* 线程初始化计数值 */
    rt_ubase_t  remaining_tick;         /* 线程剩余计数值 */
    struct rt_timer thread_timer;      /* 内置线程定时器 */
    void (*cleanup)(struct rt_thread *tid);  /* 线程退出清除函数 */
    rt_uint32_t user_data;                      /* 用户数据 */
};

代码如下:

#include <rtthread.h>
#define THREAD_PRIORITY 25
#define THREAD_STACK_SIZE 512
#define THREAD_TIMESLICE 5
static rt_thread_t tid1 = RT_NULL, tid2 = RT_NULL;
/** 线程 1 采用低优先级运行,一直打印计数值 */ 
static void thread1_entry(void *parameter){
    rt_uint32_t count = 0;
    rt_kprintf("thread1 create! \n");
    while(1){
        rt_kprintf("thread1 count: %d\n",count++);
        count++;
    }
}
static void thread1_cleanup(struct rt_thread *tid){
    if(tid != tid1)
    {
        return;
    }
    rt_kprintf("thread1 end \n");
    tid1 = RT_NULL;
}
/*  线程 2 唤醒后直接删除线程 1,删除线程 1 后,线程 1 自动脱离就绪线程 */
static void thread2_entry(void *parameter){
    rt_kprintf("thread2 create entry!\n");
     rt_uint32_t count = 0;
    rt_thread_delay(10);
    rt_thread_delete(tid1);
    rt_thread_delay(10);
}
static void thread2_cleanup(struct rt_thread *tid)
{
    if(tid != tid2)
    {
        return ;
    }
    rt_kprintf("thread2 end\n");
    tid2 = RT_NULL;
}
int thread_sample_init(){
    rt_thread_t init_thread;
    rt_err_t result;
    tid1 = rt_thread_create("t1",
    thread1_entry,
    RT_NULL,
    THREAD_STACK_SIZE,
    THREAD_PRIORITY,
    THREAD_TIMESLICE);
    if(tid1 != RT_NULL)
    {
        tid1->cleanup = thread1_cleanup;
        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)
    {
        tid2->cleanup = thread2_cleanup;
        rt_thread_startup(tid2);
    }
    return 0;
}
MSH_CMD_EXPORT(thread_sample_init, run signal sample);

运行效果如下:

相关文章
|
6月前
|
算法 调度 芯片
RT-Thread快速入门-线程管理
RT-Thread快速入门-线程管理
120 0
RT-Thread快速入门-线程管理
|
6月前
|
数据处理 容器
RT-Thread快速入门-线程间同步之信号量
RT-Thread快速入门-线程间同步之信号量
96 0
|
6月前
|
数据处理 调度
RT-Thread快速入门-线程管理(下)
RT-Thread快速入门-线程管理(下)
128 0
|
小程序 调度 内存技术
RTOS rt-thread裸机系统与多线程系统
RTOS rt-thread裸机系统与多线程系统
|
编译器
【玩转RT-Thread】线程间同步(一) 信号量
【玩转RT-Thread】线程间同步(一) 信号量
149 0
|
调度
【玩转RT-Thread】 RT-Thread Studio使用(2) 内核实战篇(线程)
【玩转RT-Thread】 RT-Thread Studio使用(2) 内核实战篇(线程)
279 0
|
API 调度
【玩转RT-Thread】线程管理(详细原理)(下)
【玩转RT-Thread】线程管理(详细原理)
309 0
|
传感器 调度 芯片
【玩转RT-Thread】线程管理(详细原理)(上)
【玩转RT-Thread】线程管理(详细原理)(上)
296 0
|
API 调度 C语言
RT-Thread记录(三、RT-Thread 线程操作函数及线程管理与FreeRTOS的比较)
前2课讲完了RT-Thread开发环境,启动流程,启动以后当然是开始跑线程了,那么自然我们得学会如何创建线程以及线程的有关操作。
810 0
RT-Thread记录(三、RT-Thread 线程操作函数及线程管理与FreeRTOS的比较)