RT-Thread 任务管理

    xiaoxiao2022-07-07  258

    一  创建动态线程

    任务三要素:任务栈,任务控制块,任务函数。

    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)