rtthread 线程
创建动态线程最简单代码
#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);//导入命令
静态函数
- 其他文件中可以定义相同名字的函数,不会发生冲突。
- 静态函数不能被其他文件所用。
- 静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。
静态变量
- 不会被其他文件所访问,修改
- 其他文件中可以使用相同名字的变量,不会发生冲突。
字节对齐
参考此视频
动态线程和静态线程
动态线程 | 静态线程 | |
---|---|---|
内存 | 不占用RW/ZI段空间,空间小,需要动态分配内存 | 占用RW/ZI段空间 ,不需要动态分配内存 |
运行效率 | 相对低 | 相对高 |
句柄
动态线程:static rt_thread_t tid1 = RT_NULL;
静态线程:static struct rt_thread thread2;
参看定义,得知:typedef struct rt_thread *rt_thread_t;
,会发现前者是后者的指针,本质上是一样的东西
创建方式
比较:相对动态线程,静态线程需要额外提供线程句柄和线程栈地址
动态线程 | 静态线程 | |
---|---|---|
线程名字 | 需要提供 | 需要提供 |
线程入口 | 需要提供 | 需要提供 |
入口参数 | 需要提供 | 需要提供 |
线程栈大小 | 需要提供 | 需要提供 |
线程优先级 | 需要提供 | 需要提供 |
时间片轮 | 需要提供 | 需要提供 |
线程句柄 | 不需要提供 | 需要提供 |
线程栈地址 | 不需要提供 | 需要提供 |
- 动态线程
tid1 = rt_thread_create("thread1",//线程名字thread1_entry, //线程入口RT_NULL, //入口函数参数THREAD_STACK_SIZE,//线程栈大小THREAD_PRIORITY, //线程优先级THREAD_TIMESLICE);//时间片轮
- 静态线程
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)
{//创建线程1tid1 = rt_thread_create("thread1",thread1_entry, RT_NULL,THREAD_STACK_SIZE,THREAD_PRIORITY, THREAD_TIMESLICE);if (tid1 != RT_NULL)rt_thread_startup(tid1);//如果创建成功,启动线程1rt_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 | 命令导入 |
相关文章:

rtthread 线程
创建动态线程最简单代码 #include <rtthread.h>//包含头文件static rt_thread_t thread1 RT_NULL; //创建线程控制块指针,指向空static void thread1_entry(void *parameter)//线程入口(干什么) {rt_kprintf("do something"…...

伯恩光学再成被执行人:多次因劳动纠纷被起诉,曾冲刺港交所上市
近日,贝多财经从天眼查APP了解到,伯恩光学(深圳)有限公司(下称“伯恩光学”)因《伯恩光学(深圳)有限公司与温*燕劳动合同纠纷的案件》一事,被广东省深圳市龙岗区人民法院…...
mysql基础操作2
通配符_:一个任意字符,like ‘张_’%:任意长度的字符串,like ‘co%’,‘%co’,‘%co%’【】:括号中所指定范围内的一个字符,like ‘9W0【1-2】’【^】:不在括号中所指定范…...

指针的进阶【下篇】
文章目录📀8.指向函数指针数组的指针📀9.回调函数📀8.指向函数指针数组的指针 🌰请看代码与注释👇 int Add(int x, int y) {return x y; } int Sub(int x, int y) {return x - y; } int main() {int (*pf)(int, int…...

不同序列模型的输入和输出总结
不同序列模型的输入和输出总结 文章目录不同序列模型的输入和输出总结RNNLSTMGRURNN RNN 是迭代输出: 输入第一个 -> 输出第二个, 输入第二个 -> 输出第三个, 输出倒数第二个 -> 输出最后一个。 LSTM LSTM 也是迭代输出ÿ…...

基于神经网络补偿的主动悬架自适应控制
目录 前言 1. 1/4悬架模型 2.仿真分析 2.1仿真模型 2.2仿真结果 2.1 形① 2.2 形② 3. 总结 前言 上两篇博客我们介绍了神经网络补偿控制律的仿真测试,从仿真结果我们可以得知神经网络具有逼近扰动,并将其补偿的作用。 上两篇文章链接…...

什么是链表,如何实现?(单链表篇)
欢迎来到 Claffic 的博客 💞💞💞 “仅仅活着是不够的,还需要有阳光,自由和花的芬芳。” 前言: 在日常使用的网站和软件中,列表属于最常见的一种东西了,其实现形式有顺序表࿰…...

探针台简介
探针台,是我们半导体实验室电学性能测试的常用设备,也是各大实验室以及芯片设计、封装测试的熟客。设备具备各项优势,高性能低成本,用途广,操作方便,在不同测试环境下,测试结果稳定,…...

ABAP 辨析 标准表|排序表|哈希表
1、文档介绍 本文档将介绍内表的区别和用法,涉及标准表、排序表、哈希表 2、用法与区别 2.1、内表种类 内表顶层为任意表,任意表分为索引表和哈希表,索引表又可分为标准表和排序表,结构如图: 2.2、内表用法 2.2.1…...

MIGO 物料过账 创建物料凭证 BAPI_GOODSMVT_CREATE
文章目录1.前台操作2.需求分析2.1调用方式2.2分为两大概括:2.3业务逻辑细节图3.BAPI_GOODSMVT_CREATE4.RFC接口代码5.总结1.前台操作 SAP CO01(创建生产订单)/MIGO(发货投料)前台操作 这里面有migo的前台操作,首先了解前台操作后再去写RFC接口是比较容易理解的.!! 2.需求分析…...

项目经理处理团队冲突 5大注意事项
1、在时间、场景、体验矩阵中的5种处理方式 第一种方式:强迫命令,即职位高的一方在不考虑对方感受的情况下,强迫职位低的一方接受自己的意见。这种处理方式的适用场景为重要且紧急,这种方式团队成员的体验感低。 第二种方式&#…...

Linux(Centos)安装TDengine
目录1:简介2:前期准备3:安装4:启动5:开机自启动6:安装客户端驱动(如果别的服务器需要链接TD则需要此步操作)7:基础命令1:简介 官网: https://www.taosdata.com/简介&…...

大数据处理技术导论(6) | Datawhale组队学习46期
文章目录1. hive 概述2. hive 与传统关系型数据库的对比3. hive 数据类型4. hive 数据模型5. hive 实战5.1 创建表5.2 修改表5.3 清空表、删除表5.4 其他命令项目地址 https://github.com/datawhalechina/juicy-bigdata,感谢项目团队的付出。本次主要学习 hive 相关…...

Java——异常
目录 什么是异常 异常处理主要的5个关键字 异常的体系结构 异常语法 异常的分类 异常的处理流程 异常的处理 防御式编程 异常的抛出 throw的注意事项 异常的捕获 异常声明throws try-catch捕获处理 finally 自定义异常类 throw和throws区别 什么是异常 程序在运行时出现错…...

Netty之io.netty.util.concurrent.Promise与io.netty.util.concurrent.Future初解
目录 目标 Netty版本 Netty官方API 三者之间的关系 基本使用方法 java.util.concurrent.Future io.netty.util.concurrent.Future io.netty.util.concurrent.Promise 目标 了解io.netty.util.concurrent.Promise与io.netty.util.concurrent.Future的基本使用方法。了解…...

【正点原子FPGA连载】第二十一章AXI DMA环路测试 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第二十一章AXI D…...

手把手搭建springboot项目06-springboot整合RabbitMQ及其原理和应用场景
目录前言工作流程-灵魂画手名词解释交换机类型一、安装1.1 [RabbitMQ官网安装](https://www.rabbitmq.com/download.html)1.2 Docker安装并启动二、食用教程2.1.导入依赖2.2 添加配置2.3 代码实现2.3.1 直连(Direct)类型2.3.2 引入消息手动确认机制2.3.2…...
如何根据IP地址判断是IPv4还是IPv6
IPv4地址的书写形式为:“192.168.0.1” IPv6地址的书写形式为:“2001:DB8:85A3:8D3:1319:8A2E:370:7344” 给你一个IP地址,它有三种可能:IPv4、IPv6、既不是IPv4也不是IPv6的无效地址。所以,如果用函数ipGetAddressAsNumber,只能判断是不是ipv4,编写如下函数: int R…...

山地车和公路车怎么选
公路车: 只能适应平坦的路面,骑行阻力小,速度快比较适合新手 山地车: 能适应所有路面,更注重操控性和舒适性 怎么选? 1、先决定用途 旅游:旅行车、山地车、 通勤:公路车 2、预…...

Zotero设置毕业论文/中文期刊参考文献格式
大家在使用zotero时很容易遇到的问题: 英文参考文献中有多个作者时出现“等”,而不是用"et al"引文最后面有不需要的DOI号,或者论文链接对于一些期刊分类上会出现OL字样,即[J/OL]作者名为全大写 本文主要解决以上几个…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...