RT-Thread 任务管理

一创建动态线程
任务三要素:任务栈,任务控制块,任务函数。

struct rt_thread led1_thread; /* 定义线程控制块 */ void led1_thread_entry(void* parameter); //任务函数 //注:动态线程的栈由任务自行动态分配

创建立=一个简单的动态线程,代码如下:
static rt_thread_t tid1 = RT_NULL; static void thread_entry(void* parameter); #define THREAD_PRIORITY25 #define THREAD_STACK_SIZE512 #define THREAD_TIMESLICE5/* 创建线程1 */ tid1 = rt_thread_create("t1",/* 线程名称*/ thread_entry, /* 线程入口函数*/ (void*)1,/* 线程入口参数 */ THREAD_STACK_SIZE, /* 线程栈大小*/ THREAD_PRIORITY,/* 线程优先级*/ THREAD_TIMESLICE); /* 线程时间片*/ if (tid1 != RT_NULL) rt_thread_startup(tid1); //启动线程

二 创建静态线程
struct rt_thread led1_thread; /* 定义线程控制块 */ ALIGN(RT_ALIGN_SIZE) rt_uint8_t rt_led1_thread_stack[1024]; /* 定义线程栈 */void led1_thread_entry(void* parameter) { HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1); rt_thread_delay(500); /* 延时 500 个 tick */ }rt_thread_init(&led1_thread, /* 线程控制块 */ "led1", /* 线程名字 */ led1_thread_entry, /* 线程入口函数 */ RT_NULL, /* 线程入口函数参数 */ &rt_led1_thread_stack[0], /* 线程栈起始地址 */ sizeof(rt_led1_thread_stack), /* 线程栈大小 */ 3, /* 线程的优先级 */ 20); /* 线程时间片 */ rt_thread_startup(&led1_thread); /* 启动线程,开启调度 */

三线程状态
RT_THREAD_INIT 线程初始状态。当线程刚开始创建还没开始运行时就处于这个 状态;在这个状态下,线程不参与调度
RT_THREAD_SUSPEND 挂起态、阻塞态。线程此时被挂起:它可能因为资源不可用而 挂起等待;或线程主动延时一段时间而被挂起。在这个状态下 ,线程不参与调度
RT_THREAD_READY 就绪态。线程正在运行;或当前线程运行完让出处理器后,操作系统寻找最高优先级的就绪态线程运行
RT_THREAD_RUNNING 运行态。线程当前正在运行,在单核系统中,只有rt_thread_self()函数返回的线程处于这个状态;在多核系统中则不受这个限制。
RT_THREAD_CLOSE 【RT-Thread 任务管理】线程结束态。当线程运行结束时将处于这个状态。这个状态的 线程不参与线程的调度。

RT-Thread 任务管理
文章图片

四 线程相关函数
线程删除 rt_err_t rt_thread_delete(rt_thread_t thread);
thread = RT_NULL;
线程对象将会被移出线程队列并且从内核对象管理器中删除,线程占用的堆栈空间也会被释放,收回的空间将重新用于其他的内存分配。
线程脱离 rt_err_t rt_thread_detach (rt_thread_t thread); 线程脱离将使线程对象在线程队列和内核对象管理器中被删除。
线程启动 rt_err_t rt_thread_startup(rt_thread_t thread); 创建(初始化)的线程对象的状态处于初始态,并未进入就绪线程的调度队列,我们可以调用该函数启动一个线程
当前线程 rt_thread_t rt_thread_self(void); 一个公用函数可能会被多个线程执行,在执行的时候可以通过该函数接口获得当前执行的线程句柄。
线程让出处理器 rt_err_t rt_thread_yield(void); 当前线程的时间片用完或者该线程自动要求让出处理器资源时,它不再占有处理器,调度器会选择相同优先级的下一个线程执行。
线程睡眠 rt_err_t rt_thread_sleep(rt_tick_t tick);
rt_err_t rt_thread_delay(rt_tick_t tick);
让运行的当前线程延迟一段时间,在指定的时间到达后重
新运行,这就叫做“线程睡眠”
线程挂起 rt_err_t rt_thread_suspend (rt_thread_t thread); 当线程调用rt_thread_delay,调用线程将主动挂起,当调用rt_sem_take,rt_mb_recv等函数时,资源不可使用也将导致调用线程挂起。
线程恢复 rt_err_t rt_thread_resume (rt_thread_t thread); 线程恢复就是让挂起的线程重新进入就绪状态
线程控制 rt_err_t rt_thread_control(rt_thread_t thread, rt_uint8_t cmd, void* arg); 当需要对线程进行一些其他控制时,例如动态更改线程的优先级,可以调用该函数
线程延时 rt_err_t rt_thread_delay(rt_tick_t tick) 单位为tick
线程延时 rt_err_t rt_thread_mdelay(rt_int32_t ms) 单位为ms




    推荐阅读