当前位置: 首页 > news >正文

RT-Thread的线程(任务)处理 rt_thread_create/rt_thread_init区别

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之后不会释放空间

相关文章:

  • 命令收集
  • 为实现全局化产品线布局,瑞芯微宣布旗下芯片RK3399 Linux系统开源
  • mongodb--安装和初步使用教程
  • WIFI渗透从入门到精通
  • Webscan360的防御与绕过
  • 装饰器
  • vue属性用法
  • netbeans 正则替换
  • Go语言学习笔记(八)golang 操作 Redis Mysql RabbitMQ
  • [转]23种设计模式全解析
  • pycharm 教程(一)安装和首次使用
  • 最优化 凸集、凸函数
  • 如何培养良好的编程风格
  • php 设计模式
  • UNDO及MVCC、崩溃恢复
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Java反射-动态类加载和重新加载
  • jQuery(一)
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Node项目之评分系统(二)- 数据库设计
  • php面试题 汇集2
  • Spark RDD学习: aggregate函数
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 开源SQL-on-Hadoop系统一览
  • 力扣(LeetCode)22
  • 时间复杂度与空间复杂度分析
  • Mac 上flink的安装与启动
  • Spring Batch JSON 支持
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • # Panda3d 碰撞检测系统介绍
  • #define 用法
  • #图像处理
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (libusb) usb口自动刷新
  • (pojstep1.3.1)1017(构造法模拟)
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (分布式缓存)Redis分片集群
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (三)mysql_MYSQL(三)
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)Unity3DUnity3D在android下调试
  • .NET CORE Aws S3 使用
  • .NET Framework与.NET Framework SDK有什么不同?
  • .net 反编译_.net反编译的相关问题
  • .NET 回调、接口回调、 委托
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .NET委托:一个关于C#的睡前故事
  • .net专家(张羿专栏)
  • @Autowired标签与 @Resource标签 的区别
  • @Builder用法
  • @Valid和@NotNull字段校验使用