rtthread 线程

news2024/10/1 23:29:26

创建动态线程最简单代码

#include <rtthread.h>//包含头文件

static rt_thread_t thread1 = RT_NULL; //创建线程控制块指针,指向空

static void thread1_entry(void *parameter)//线程入口(干什么)
{
   rt_kprintf("do something");
}

int thread_run(void)
{
    thread1 = rt_thread_create("thread1",
                            thread1_entry, 
														RT_NULL,
                            1024,
                            30,
														10);
    
    if (thread1 != RT_NULL)//判断创建是否成功
        rt_thread_startup(thread1);
		
    return 0;
}

MSH_CMD_EXPORT(thread_run, thread sample);//导入命令

静态函数

  1. 其他文件中可以定义相同名字的函数,不会发生冲突。
  2. 静态函数不能被其他文件所用。
  3. 静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。

静态变量

  1. 不会被其他文件所访问,修改
  2. 其他文件中可以使用相同名字的变量,不会发生冲突。

字节对齐

参考此视频

动态线程和静态线程

动态线程静态线程
内存不占用RW/ZI段空间,空间小,需要动态分配内存占用RW/ZI段空间 ,不需要动态分配内存
运行效率相对低相对高

句柄

动态线程:static rt_thread_t tid1 = RT_NULL;
静态线程:static struct rt_thread thread2;
在这里插入图片描述

参看定义,得知:typedef struct rt_thread *rt_thread_t;,会发现前者是后者的指针,本质上是一样的东西

创建方式

比较:相对动态线程,静态线程需要额外提供线程句柄和线程栈地址

动态线程静态线程
线程名字需要提供需要提供
线程入口需要提供需要提供
入口参数需要提供需要提供
线程栈大小需要提供需要提供
线程优先级需要提供需要提供
时间片轮需要提供需要提供
线程句柄不需要提供 需要提供
线程栈地址不需要提供需要提供
  1. 动态线程
 tid1 = rt_thread_create("thread1",//线程名字
                            thread1_entry, //线程入口
                            RT_NULL, //入口函数参数
                            THREAD_STACK_SIZE,//线程栈大小
                            THREAD_PRIORITY, //线程优先级
                            THREAD_TIMESLICE);//时间片轮
  1. 静态线程
rt_thread_init(&thread2, //线程句柄
                   "thread2",//线程名字
                   thread2_entry,//线程函数入口
                   RT_NULL,//入口参数
                   &thread2_stack[0],//线程栈地址
                   sizeof(thread2_stack),//线程栈大小
                   THREAD_PRIORITY - 1, //线程优先级
                   THREAD_TIMESLICE);//时间片

备注:RW/ZI段是程序总共使用的RAM字节数


#include <rtthread.h>

#define THREAD_PRIORITY         25 //定义的线程优先级
#define THREAD_STACK_SIZE       512//线程栈的大小
#define THREAD_TIMESLICE        5//时间片

//动态线程
static rt_thread_t tid1 = RT_NULL; //静态定义一个线程号

//线程1做什么:一直打印数值
static void thread1_entry(void *parameter)
{
    rt_uint32_t count = 0;

    while (1)
    {
        /* 线程1采用低优先级运行,一直打印计数值 */
        rt_kprintf("thread1 count: %d\n", count ++);
        rt_thread_mdelay(500);
    }
}


//静态线程
ALIGN(RT_ALIGN_SIZE)//字节对齐,线程栈需要4字节对齐(4字节刚好是一个指针的大小)
static char thread2_stack[1024];//线程栈
static struct rt_thread thread2;


//线程2干什么:打印十次数字之后就打印退出语句
static void thread2_entry(void *param)
{
    rt_uint32_t count = 0;//计数
    
    for (count = 0; count < 10 ; count++)
    {
        rt_kprintf("thread2 count: %d\n", count);
    }
    rt_kprintf("thread2 exit\n");
}

//运行函数,需要被外部使用所以就不能使用static定义
int thread_sample(void)
{
    //创建线程1
    tid1 = rt_thread_create("thread1",
                            thread1_entry, RT_NULL,
                            THREAD_STACK_SIZE,
                            THREAD_PRIORITY, THREAD_TIMESLICE);
    

    if (tid1 != RT_NULL)
        rt_thread_startup(tid1);//如果创建成功,启动线程1


    rt_thread_init(&thread2, //创建线程2
                   "thread2",
                   thread2_entry,
                   RT_NULL,
                   &thread2_stack[0],
                   sizeof(thread2_stack),
                   THREAD_PRIORITY - 1, THREAD_TIMESLICE);
									 
    rt_thread_startup(&thread2);

    return 0;
}

MSH_CMD_EXPORT(thread_sample, thread sample);//导入命令

关键字和API

关键字和API解释
rt_thread_t动态线程(结构体指针)
rt_thread静态线程(结构体)
ALIGN(RT_ALIGN_SIZE)设置变量4字节对齐
rt_thread_create创建动态线程
rt_thread_init创建静态线程
MSH_CMD_EXPORT命令导入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/380493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT 爆火,社交应用如何 Get 新技能

风浪越大&#xff0c;鱼越贵。关注【融云全球互联网通信云】了解更多 现在&#xff0c;最大的浪无疑属于 ChatGPT&#xff0c;一款以对话方式进行交互的语言模型。 通过创新业务打下江山的商业传奇们&#xff0c;都怕跟丢了这波浪潮而成为“上一代人”。所以&#xff0c;我们…

[文件操作] File 类的用法和 InputStream, OutputStream 的用法

能吃是不是件幸福的事呢 文章目录前言1. 文件的相关定义2. 文件类型3. Java对文件系统的操作3.1 对文件的基础操作3.2 读文件3.3 写文件前言 从这章开始,我们就开始学文件操作相关的知识了~ 1. 文件的相关定义 1.文件的定义可以从狭义和广义两个方面解释. 狭义: 指硬盘上的文…

Redis学习笔记:缓存运用常见问题

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育 目录1、数据一致性的问题1.1、新增数据一致性的问题1.2、修改/删除一致性问题1.2.1、操作分析1.2.1、总结和再深入2、缓存穿透&#xff0c;缓存击穿和缓存雪崩2.1、缓存穿透&#xff08;查不到&#xff09;2.1.1、…

从功能到自动化,熬夜3天整理出这一份2000字学习指南~

学习自动化这个想法&#xff0c;其实自己在心里已经琢磨了很久&#xff0c;就是一直没付诸实践&#xff0c;觉得现在手工测试已经能满足当前的工作需要&#xff0c;不想浪费时间去学习新的东西&#xff0c;有点时间还不如刷刷视频、看看小说等。 第一次有学习Selenium的冲动是…

【Bio】碳水化合物 carbohydrate 和糖蛋白 glycoprotein

文章目录碳水化合物 carbohydrate单糖 monosaccharides戊糖 pentose己糖 hexose双糖 disaccharide寡糖 oligosaccharide 和多糖 polysaccharide糖蛋白 glycoproteinRef碳水化合物 carbohydrate 碳水化合物 (carbohydrate)&#xff0c;也是糖类&#xff0c;指的是一系列多羟基 …

pwnlab通关流程

pwnlab通关 关于文件包含&#xff0c;环境变量劫持的一个靶场 信息收集 靶机ip&#xff1a;192.168.112.133 开放端口 根据开放的端口信息决定从80web端口入手 目录信息 在images和upload路径存在目录遍历&#xff0c;config.php被渲染无法查看&#xff0c;upload.php需…

C++实现文本界面英语词典

C实现文本界面英语词典 C实现文本界面的英语词典&#xff0c;能在Dev-C运行。提供两种方案&#xff1a;一是简单仅查词功能&#xff1b;二是具有查词、添加、删除功能&#xff0c;具有选择菜单&#xff0c;值得一提的是&#xff0c;本程序对用户输入菜单选项序号做了检测&#…

Zabbix“专家坐诊”第183期问答汇总

问题一 Q&#xff1a;老师&#xff0c;请问一下zabbix采集的数据怎么过滤&#xff0c;获取数据是nottime20:30 notafter3&#xff0c;怎么过滤出netafter3 &#xff1f;谢谢。 A&#xff1a;过滤器设置如下图。 问题二 Q&#xff1a;大佬&#xff0c;请问一下被管节点部署了…

视觉Slam十四讲笔记

视觉SLAM十四讲 ch1~2 虚拟机部分指令解析在其他文件中进行引用该库编译器参考链接&#xff1a;虚拟机部分 CMakeList.txt文件是cmake用来生成Makefile文件需要的一个描述编译链接的规则文件 指令解析 &#xff08;1&#xff09;PROJECT(projectname [CXX] [C] [Java]): 该…

力扣(LeetCode)427. 建立四叉树(2023.03.01)

给你一个 n * n 矩阵 grid &#xff0c;矩阵由若干 0 和 1 组成。请你用四叉树表示该矩阵 grid 。 你需要返回能表示矩阵的 四叉树 的根结点。 注意&#xff0c;当 isLeaf 为 False 时&#xff0c;你可以把 True 或者 False 赋值给节点&#xff0c;两种值都会被判题机制 接受…

Elasticsearch进阶之(核心概念、系统架构、路由计算、倒排索引、分词、Kibana)

Elasticsearch进阶之&#xff08;核心概念、系统架构、路由计算、倒排索引、分词、Kibana&#xff09; 1、核心概念&#xff1a; 1.1、索引&#xff08;Index&#xff09; 一个索引就是一个拥有几分相似特征的文档的集合。比如说&#xff0c;你可以有一个客户数据的索引&…

能源消耗监测管理系统,在建筑节能中起到哪些重要作用?

能源是一切活动的基础更是社会经济发展的命脉&#xff0c;但随着经济的建设&#xff0c;能源资源的消耗也越来越大&#xff0c;其中建筑是最大的消耗者。水、电、气等能源的消耗量逐年增长&#xff0c;这种能源并不是取之不尽用之不竭的&#xff0c;能源的日益紧张和环境恶化&a…

IM即时通讯开发MQ消息队列

消息是互联网信息的一种表现形式&#xff0c;是人利用计算机进行信息传递的有效载体&#xff0c;比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一。 消息从发送者到接收者的典型传递方式有两种&#xff1a; 1&#xff09;一种我们可以称为即时消息&#xff1a…

【FATE联邦学习】Fateboard的使用

fateboard文档 https://fate.fedai.org/fateboard/ github Fateboard文档 https://github.com/FederatedAI/FATE-Board/blob/master/README-CN.md 背景 Fateboard是FATE框架的任务看板。 在配置FATE时&#xff0c;Fateboard一般是被安装好了的&#xff0c;安装过程查看这里 A…

你知道如何获取全国省市街道区域信息吗?

随着互联网和快递行业的飞速发展&#xff0c;在中国广袤的大地上&#xff0c;全国行政区域规划星罗棋布&#xff0c;要查询一个行政单元如果不运用科技的手段查询可是非常的不易&#xff0c;现在&#xff0c;全国行政区划查询API的作用越来越大&#xff0c;它可以帮助我们对地址…

比特数据结构与算法(第四章_下)二叉树OJ(力扣:144,965,104,226,100,572)

144. 二叉树的前序遍历难度简单给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。示例 1&#xff1a;输入&#xff1a;root [1,null,2,3]输出&#xff1a;[1,2,3]示例 2&#xff1a;输入&#xff1a;root [ ]输出&#xff1a;[ ]示例 3&#xff1a;输入&#…

【react】react18的学习

一、安装 $ create-react-app [Project name]默认支持sass 二、核心依赖 react&#xff1a;react 核心 react-dom&#xff1a;用于开发渲染web 应用&#xff1b; react-scripts&#xff1a;封装webpack服务&#xff1b; "start": "react-scripts start&quo…

网络应用之html 的基本结构

html 的基本结构学习目标能够写出html的基本结构1. 结构代码<!DOCTYPE html><html><head><metacharset"UTF-8"><title>网页标题</title></head><body>网页显示内容</body></html>第一行<!DOCTYPE ht…

认识Cesium旋转大小变量

前文代码中有如下&#xff1b;矩阵乘以旋转大小&#xff0c;还放入mat&#xff1b; Cesium.Matrix4.multiply(mat, rotationX, mat); 初看以为rotationX是一个数值&#xff0c;因为矩阵可以和数相乘&#xff1b; 但是看它的代码&#xff0c;rotationX是由一长串代码获得的&a…

计算机网络高频知识点(二)

目录 一、三次握手 二、为什么是三次握手而不是两次握手 三、四次挥手 四、挥手为什么需要四次 五、websocket 1、是什么 2、原理 3、websocket与http的关系 4、特点 六、http结构 七、HTTP头都有哪些字段 八、http1.0和http1.1&#xff0c;还有http2有什么区别 九…