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_PRIORITY    25
#define THREAD_STACK_SIZE  512
#define THREAD_TIMESLICE   5

/* 创建线程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_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

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值