004 RT-ThreadStudio 线程管理接口介绍

线程管理接口

        在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; /* 用户数据*/
};

        其中init_priority是线程创建时指定的线程优先级,在线程运行过程当中是不会被改变的(除非用户执行县城控制函数进行手动控制线程优先级)。cleanup会在线程退出时,被线程回调一次以执行用户设置的清理线程等工作。最后一个成员user_data可由用户挂接一些数据信息到线程控制块中,以提供类似线程私有数据的实现。

        线程的创建、启动、删除等操作,都与线程控制块相关,RT-Thread提供了线程管理和控制的一些函数。

函数描述
rt_thread_create()创建和删除线程
rt_thread_delete删除线程
rt_thread_init初始化和脱离线程
脱离线程
启动线程
获得当然正运行的线程
使线程让出当前资源
使线程睡眠指定tick
使线程延时指定tick
使线程延时指定毫秒
挂起线程
恢复线程

函数描述
rt_thread_create()创建和删除线程
rt_thread_delete删除线程
rt_thread_init初始化和脱离线程
rt_thread_detach()脱离线程
rt_thread_startup启动线程
rt_thread_self获得当然正运行的线程
rt_thread_yield使线程让出当前资源
rt_thread_sleep使线程睡眠指定tick
rt_thread_delay使线程延时指定tick
rt_thread_mdelay使线程延时指定毫秒
rt_thread_suspend挂起线程
rt_thread_resume()恢复线程
rt_thread_cocntrol控制线程

RT-Thread部分接口函数介绍

        1.创建和删除线程

        在RT-Thread中,线程可以动态创建和删除

        1.1创建线程

        可以通过下面接口函数动态创建一个线程:

rt_thread_create(const char* name ,    //线程名称
                    void (*entry)(void *parameter),    //线程入口函数
                    void * parameter,    //线程入口函数参数
                    rt_uint32_t  stack_size,    //线程栈大小
                    rt_uint8_t priority,    //线程优先级
                    rt_uint32_t tick);    //线程的时间片大小
        1.2删除线程

        对于使用rt_thread_create()创建出来的线程,当不需要使用,或者运行出错时,我们可以使用它把线程完全删除:

rt_err_t rt_thread_delete(rt_thread_t thread);//要删除的线程句柄

        2初始化和脱离线程

        2.1初始化线程

        对于静态定义的线程对象(线程控制块),可以使用下面的函数初始化静态线程对象:

rt_err_t rt_thread_init(struct rt_thread* thread,    //线程句柄
                        const char *name,    //线程名称
                        void (*entry)(void *parameter),    //线程入口函数
                        void * parameter,    //线程入口函数参数
                        void *stack_start,    //线程栈起始地址
                        rt_uint_32_t stack_size,    //线程栈大小
                        rt_uint8_t priority,    //线程优先级
                        rt_uint32_t tick);    //线程时间片
        2.2脱离线程 

        对于用rt_thread_init初始化的线程,可以用rt_thread_detach函数将线程对象从线程队列和内核对象管理器中脱离。

rt_err_t rt_thread_detach(rt_thread thread); //线程句柄

        这个接口函数与rt_thread_delete函数相对应的,rt_thread_delete函数操作的对象是rt_thread_create创建的句柄,而rt_thread_detach函数操作的对象时使用rt_thread_init初始化的线程控制块。线程本身不应调用这个接口脱离线程本身。

        3.线程睡眠

re_err_t rt_thread_sleep(rt_tick tick);	        //使线程睡眠指定tick
re_err_t  rt_thread_delay(rt_tick tick);	    //使线程延时指定tick
re_err_t  rt_thread_mdelay(rt_uint32_t ms);	    //使线程延时指定毫秒

        三个接口函数的作用相同,调用它们可以使当前线程挂起一段指定的事件,课这个事件过后,线程会呗唤醒并再次进入就绪状态。

        4.挂起线程

        线程挂起就是指线程脱离就绪队列,线程不再参与调度器的调度。

 rt_err_t rt_thread_suspend(rt_thread_t thread);

        RT-Thread对此函数有严格的使用限制,该函数只能使用在挂起当前线程(自己挂起自己)。

        5.恢复线程

        恢复线程就是让挂起的线程重新进入就绪状态,并将线程放入系统的就绪队列中。

 rt_err_t rt_thread_resume(rt_thread_t thread);

        6.获取当前运行的线程

        在程序运行过程中,相同的一段代码可能会被多个线程执行,在执行时可以通过函数获取当前执行的线程句柄。

rt_thread_t rt_thread_self();

        7.设置调度器钩子函数

        在整个系统运行时,系统都处于线程运行、中断触发、响应中断、切换到其他线程,甚至是线程间的切换过程中,所以说系统的上下文切换是系统中最普遍的事件。想要指导在一个时刻什么样的线程切换,可以通过函数设置一个相应的钩子函数。

void rt_thread_sethock(void (*hook)(struct rt_thread *form,

                            struct rt_thread* to));

       hook表示用户定义的钩子函数指针,form表示系统所要切换出的线程控制块指针,to表示系统所要切换到线程控制块指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值