RT-Thread的线程(任务)处理【RT-Thread学习笔记 2】

RT-Thread中使用线程这个概念,而不是任务。两者相似,我在这里把他的线程当作任务来理解了

1、任务处理

动态任务相关API

创建任务:rt_thread_create函数,创建任务之后会返回rt_thread_t类型的任务ID

创建之后启动任务:rt_thread_startup

删除任务:rt_thread_delete

任务延时函数:rt_thread_delay 延时时候,任务处于suspend状态

任务运行情况可用finish模块,在电脑终端查看

2、动态创建线程和静态创建线程

RT-Thread中支持静态和动态两种定义方式。用线程来举例的话,rt_thread_init对应静态定义方式,rt_thread_create对应动态定义方式。

  • 使用静态定义方式时,必须先定义静态的线程控制块,并且定义好堆栈空间,然后调用rt_thread_init来完成线程的初始化工作。采用这种 方式,线程控制块和堆栈占用的内存会放在RW段,这段空间在编译时就已经确定,它不是可以动态分配的,所以不能被释放,而只能使用 rt_thread_detach函数将该线程控制块从对象管理器中脱离。

  • 使用动态定义方式rt_thread_create时,RT-Thread会动态申请线程控制块和堆栈空间。在编译时,编译器是不会感知到这段空 间的,只有在程序运行时,RT-Thread才会从系统堆中申请分配这段内存空间,当不需要使用该线程时,调用rt_thread_delete函数就会 将这段申请的内存空间重新释放到内存堆中。

这两种方式各有利弊,静态定义方式会占用RW/ZI空间,但是不需要动态分配内存,运行时效率较高,实时性较好。 动态方式不会占用额外的RW/ZI空间,占用空间小,但是运行时需要动态分配内存,效率没有静态方式高。

静态创建线程代码:

创建线程:rt_thread_init

启动线程:rt_thread_startup

脱离线程:rt_thread_detach

//静态创建线程
    result = rt_thread_init(&thread1,                          //线程handle
                            "static",                          //线程名
                            rt_init_thread_entry,              //线程入口函数
                            RT_NULL,                           //线程入口参数
                            &thread1_stack[0],                 //线程栈地址
                            sizeof(thread1_stack),             //线程栈大小
                            6,                                 //线程优先级
                            10);                               //线程时间片

动态创建线程代码:

创建线程:rt_thread_create

启动线程:rt_thread_startup

线程启动成功后,当OS调度开始,即可被OS调度执行。

tid = rt_thread_create("init",
        rt_init_thread_entry, RT_NULL,
        2048, 10, 5);
    if (tid != RT_NULL)
        rt_thread_startup(tid);

空间使用比较

动态创建的线程,delete之后会释放出空间

静态创建的线程,detach之后不会释放空间

时间: 2024-09-30 07:14:58

RT-Thread的线程(任务)处理【RT-Thread学习笔记 2】的相关文章

php Thread Safe(线程安全)与None Thread Safe(NTS,非线程安全)之分

Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. 从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用多进程的工作方式不同的是Windows系统是采用多线程的工作方式.如果在IIS下以CGI方式运行PHP会非常慢,这是由于CGI模式是建立在多进程的基础之上的,而

Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分

Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. 从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用多进程的工作方式不同的是Windows系统是采用多线程的工作方式.如果在IIS下以CGI方式运行PHP会非常慢,这是由于CGI模式是建立在多进程的基础之上的,而

JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?

前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事.当然,在学校里考试之前当然要把所有内容学一遍和复习一遍.但是,到了社会里做事,很多时候都是边做边学.应聘如此,工作如此,很多的挑战都是如此.没办法,硬着头皮上吧. 3.5 线程的分组管理 在实际的开发过程当中,可能会有多个线程同时存在,这对批量处理有了需求.这就有点像用迅雷下载电视剧,假设你在同时

Ultimate thread group线程组和Stepping thread group线程组测试场景

Ultimate thread group线程组 当测试需求是要求进行波浪型的压力测试场景时,使用该线程组,例如:测试场景总共有10个线程,然后分为三个波段进行测试,每个波段负载策略设置为一样,如图: 注意,这里是设置了三个线程计划,每个线程计划并发10个,是在时间轴上按顺序执行的,因此场景最高并发用户是10个,而非30个并发用户. 2.当测试需求是要求进行阶梯型的压力测试场景时,使用该线程组.例如:测试场景总共有30个线程,然后分为三次逐渐增加负载,每次增加负载10个线程,如图: 注意,这里是

线程、任务和同步学习笔记(二)

1.Thread类可以创建和控制线程.Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart委托类型参数.其中,ThreadStart委托要求函数为无参.返回值类型为void:ParameterizedThreadStart委托要求函数接受一个object类型参数,返回值类型同样为void.创建Thread类对象后,使用Start方法启动线程. 1 using System; 2 using System.Threading; 3 4 clas

JavaSE中线程与并行API框架学习笔记1——线程是什么?

前言:虽然工作了三年,但是几乎没有使用到多线程之类的内容.这其实是工作与学习的矛盾.我们在公司上班,很多时候都只是在处理业务代码,很少接触底层技术. 可是你不可能一辈子都写业务代码,而且跳槽之后新单位很可能有更高的技术要求.除了干巴巴地翻书,我们可以通过两个方式来解决这个问题:一是做业余项目,例如在github上传自己的demo,可以实际使用:二是把自己的学习心得写成博客,跟同行们互相交流. 3.1 线程的初窥门径 我们在之前的文章里提到的程序其实都是单线程程序,也就说启动的程序从main()程

线程、任务和同步学习笔记(五)

1.如果两个或多个线程访问相同的对象,或者访问不同步的共享状态,会出现争用条件. 1 using System; 2 using System.Threading; 3 4 class Outputer 5 { 6 public void Output(string msg) 7 { 8 for (int i = 0; i < msg.Length; i++) 9 { 10 Console.Write(msg[i]); 11 } 12 Console.WriteLine(); 13 } 14 }

线程、任务和同步学习笔记(四)

1.抽象线程类Parallel的For和ForEach方法可以多次调用同一个方法.Parallel类的Invoke方法允许同时调用不同的方法. 1 using System; 2 using System.Threading; 3 using System.Threading.Tasks; 4 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 ParallelLoopResult result = Parallel.For(0

线程、任务和同步学习笔记(六)

1.如前所述,lock语句由编译器解析为Monitor类.Monitor类是一个静态类,有Enter和Exit方法. 1 using System; 2 using System.Text; 3 using System.Threading; 4 using System.Threading.Tasks; 5 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 StringBuilder str = new StringBui

疯狂Java学习笔记(63)-----------线程进阶

Java线程各个阶段的状态: 那么我们开始一点点研究吧: 启动线程 一.定义线程 1.扩展java.lang.Thread类. 此类中有个run()方法,应该注意其用法: public void run() 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法:否则,该方法不执行任何操作并返回.   Thread 的子类应该重写该方法. 2.实现java.lang.Runnable接口. void run() 使用实现接口 Runnable