线程的工作机制
在 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);
运行效果如下: