1---线程的创建与删除
线程的基本知识
组成 --------线程代码(函数),线程控制块、线程堆栈。
·线程代码
/* static void thread1_entry(viod* parameter)
{
}*/
·线程控制块
--主要就是初始化rt_thread结构体,它用来记录线程的各个属性
/* static struct rt_thread thread1; */
·线程堆栈
--线程堆栈是一段连续的内存块,动态线程是系统自动分配的。
/* static rt_uint8_t thread1_stack[512]; */
#define RT_USING_HEAP // 开启此项可以创建动态线程和动态信号量,如果使用静态线程和静态信号量,则可以不开启此项
#define RT_USING_CONSOLE //使用rt_kprintf向串口打印信息,需要开启此项
#define RT_TICK_PER_SECOND 100//此项定义了1秒 =RT_TICK_PER_SECOND个tick = 100 tick 一个tick为10ms
动态线程
·定义指向线程控制块的指针
/* rt_thread_ttid1,tid2; */
·创建
/* 堆栈大小512bytes,优先级21,时间片2个系统滴答 */
/*tid1 =rt_thread_create("thread1",
Thread1_entry,RT_NULL,
512,6,10);
if(tid1 != RT_NULL)
Rt_thread_startup(tid1);
*/
·线程代码--同上
·删除线程:rt_thread_delete(thread1);
静态线程
·定义堆栈
/* staticrt_uint8_t thread1_stack[512]; */
·线程控制块
/*static struct rt_thread thread1_thread*/
·创建
/*rt_err_t result;
result =rt_thread_init(&thread1_thread,
"thread1",
Static_thread_entry,RT_NULL,
(rt_uint8_t*)&led1_stack[0],sizeof(thread1_stack),20,2);
If(result == RT_EOK)
Rt_thread_startup(&thread1_thread);
·线程代码--同上
·脱离线程: rt_thread_detach(&thread1);
总结:RT-Thread中支持静态和动态两种定义方式。rt_thread_init对应静态定义方式,rt_thread_create对应动态定义方式。
使用静态定义方式时,必须先定义静态的线程控制块,并且定义好堆栈空间,然后调用rt_thread_init来完成线程的初始化工作,采用这种方式,线程控制块和堆栈占用的内存会放在RW段,这段内存空间在编译时就已经确定,它不是可以动态分配的,所以不能被释放,而只能用rt_thread_detach将线程控制块从对象管理器脱离。
使用动态定义方式rt_thread_create时,系统会动态申请线程控制块和堆栈空间,当不需要使用该线程时,调用rt_thread_delete将这段申请的内存空间释放。
2--线程让出
rt_thread_yield,当在线程执行的过程遇到这个函数,该线程会停止交给下一个处在就绪状态的线程。
3--线程优先级抢占
假设有两个线程thread1和thread2且thread1的线程高与thread2
因为更高的优先级,thread1率先得到运行,又由于thread1有3个系统tick的延时,故thread2得到运行,而thread2的程序在没有运行完时,thread1的延时到了,这时候就会发生优先级抢占,thread2停止运行,返回继续执行thread1.
(这里解释的不好,就是这么个意思,写个一个程序试试就明白了)
4--相同优先级线程轮转调度
对于相同优先级的线程,在调度时采用Round-Robin算法(这里我也不懂,但是咱们就是为了用操作系统,就不是为了写操作系统,所以没有必要去懂),也就是设计成一个分时系统,调度器按照轮询的方式依次调度这些线程,没个线程的执行时间为该线程被创建时指定的时间片的参数。
5--线程优先级反转
原理:
这个图就能说明原理了。
优先级继承是指:将占用共享资源的低优先级线程的优先级临时提高到等待该共享资源的所有线程中,优先级最高的那个线程的优先级,当高优先级线程由于等于共享资源被阻塞时,拥有共享资源的线程的优先级会被自动提升,从而避免出现优先级反转问题。(这个感觉就是互斥锁差不多,也许是我理解的不对。)
线程的问题就总结完了,基本就是创建和如何正确执行的问题。再有就是这些线程在宏观上是并行执行的。