RT-thread内核对象的基础应用

RT-thread的内核对象基础应用


alt text

  1. 启动流程
    以RT-Thread Studio为例,用户程序入口为位于 main.c 文件中 的main 函数。系统启动后先运行startup_stm32f103xe.s文件中的汇编代码,运行“bl entry”指令后跳转到components.c 文件中调用entry函数,进而调用rtthread_startup函数,进行 RT-Thread 系统启动。在运行rtthread_startup函数时调用rt_application_init函数,创建并启动main线程,等调度器工作后进入mian.c文件中运行 main函数,完成系统启动。

  2. 内存分布
    MCU 包含FLASH和RAM两类存储空间。RT-Thread Studio将程序编译后分为text、data和bss三个程序段,分别存储在 MCU 不同的存储区。
    alt text

  3. 什么是静态对象和动态对象,区别
    静态对象会占用 RAM 空间,不依赖于内存堆管理器,内存分配时间确定,运行效率高。动态对象不占用额外的RAM空间,依赖于内存堆管理器,运行时申请 RAM 空间,当对象被删除后,占用的 RAM 空间被释放,运行效率较低。

  4. 内核对象有那些
    内核对象包括:线程,信号量,互斥量,事件,邮箱,消息队列和定时器,内存池,设备驱动等

  5. 线程管理方式及特点?
    (1)无线程运行时,从就绪线程列表中查找最高优先级线程运行。
    (2)低优先级线程使高优先级的线程满足运行条件,当前线程停止运行,高优先级的线程运行。
    (3)中断服务程序使高优先级的线程满足运行条件,中断完成时,被中断的线程挂起,高优先级线程运行。
    线程切换时,调度器先将当前线程上下文信息保存,当再切回到这个线程时,调度器将该线程的上下文信息恢复。

  6. 线程有那些状态
    alt text

  7. 什么是线程同步,有哪些方式?
    线程间同步是指多个线程通过特定的机制来控制多个线程的执行顺序,线程间同步方式有信号量(semaphore)、互斥量(mutex)、和事件集(event),其核心思想是:在访问临界区的时候只允许一个 (或一类) 线程运行。

  8. 信号量的工作机制是怎样的?
    线程可以获取和释放信号量,每成功获取一次信号量,信号值减1,每成功释放一次信号量,信号值加1。线程在获取信号量时,首先被添加至线程等待链表,当轮到其获取信号量时,如果信号值大于0,线程可以直接获取到信号量,如果信号值为0,则该线程无法获取到信号量,其状态由运行状态转换为挂起状态,直到有其它线程释放信号量,信号值大于0时,该线程才能获取到信号量,由挂起状态转换为就绪状态。

  9. 信号量的应用方法?

//(1)定义信号量句柄:
rt_sem_t dsem = RT_NULL;
//(2)主线程创建信号量:
dsem = rt_sem_create("dsem", 0, RT_IPC_FLAG_FIFO);
//(3)线程1#X释放信号量:
rt_sem_release(dsem);
//(4)线程2#Y获取信号量:
rt_sem_take(dsem, RT_WAITING_FOREVER);

alt text

  1. 什么是会互斥量?
    互斥量又叫相互排斥的信号量,是一种特殊的二值信号量
    互斥量的状态只有两种:0和1。
    线程可以获取和释放互斥量,线程成功获取互斥量后,该线程拥有互斥量的所有权,称为持有线程,某一个时刻一个互斥量只能被一个线程持有。互斥量只能由持有线程释放互斥量,其它线程无权释放互斥量。
  2. 互斥量和信号量的不同
    互斥量:线程拥有互斥量的所有权,只能由持有线程释放;支持递归访问;能防止线程优先级翻转。
    信号量:线程不具有信号量的所有权,可以由任何线程释放;线程递归持有会形成死锁;可能发生线程优先级翻转
  3. 什么是优先级反转?解决方法?
    优先级翻转:当高优先级线程A通过信号量访问共享资源时,如果该信号量已被低优先级线程C持有,而线程C运行时被中等优先级线程B抢占,造成高优先级线程C被较低优先级线程阻塞,实时性难以得到保证。
    优先级继承:暂时提高低优先级线程C的优先级至高优先级线程A的优先级,避免线程C被中等优先级线程B抢占,当低优先级线程C释放资源时,再将其优先级复原。注意:获得互斥量后,请尽快释放互斥量,并且在持有互斥量的过程中,不得再行更改持有互斥量线程的优先级。
  4. 互斥量的使用步骤?
//(1)定义互斥量句柄
rt_mutex_t dmutex = RT_NULL;
//(2)主线程创建互斥量:
dmutex = rt_mutex_create("dmutex ", 0, RT_IPC_FLAG_FIFO);
//(3)线程获取互斥量:
rt_mutex_release(dmutex);
//(4)持有线程释放互斥量:
rt_mutex_take(dmutex, RT_WAITING_FOREVER);

alt text

  1. 什么是事件集?
    事件集是一种内核对象,用于线程间事件通知。事件集可以包含多个事件,每个事件可以被一个或多个线程等待。事件集可以由一个或多个线程设置,也可以由一个或多个线程清除。
  2. 事件集的使用步骤?
//(1)定义事件集句柄
rt_event_t dev_event = RT_NULL;
//(2)主线程创建事件集:
dev_event = rt_event_create("dev_event", RT_IPC_FLAG_FIFO);
//(3)线程1#X设置事件集:
rt_event_send(dev_event, 0x01);
//(4)线程2#Y等待事件集:
rt_event_recv(dev_event, 0x01, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER);
  1. 什么是线程同步
    线程间同步用于解决线程执行顺序的问题,线程间通信主要用于线程间信息传递,同时能够改变线程执行顺序。线程间通信的方式有邮箱、消息队列和信号

  2. 什么是邮箱,使用方法?
    邮箱是一种线程间通信方法,开销较低,效率较高,邮箱中的每一封邮件只能容纳固定的 4 字节内容(针对 32 位处理系统,指针的大小即为 4 个字节,一封邮件恰好能容纳一个指针)。
    alt text
    alt text

//(1)定义邮箱句柄:
rt_mb_t dmb = RT_NULL;
//(2)主线程创建邮箱:
dmb = rt_mb_create("dmb", 10, RT_IPC_FLAG_FIFO);
//(3)线程1#X发送邮件:
rt_mb_send(dmb, (rt_ubase_t)value);
//(4)线程2#Y接收邮件:
rt_mb_recv(dmb, (rt_ubase_t*)&value, RT_WAITING_FOREVER);

alt text

  1. 社么是消息队列,用法?
    消息队列是邮箱的扩展,能够接收来自线程或中断服务例程中不固定长度的消息,并把消息缓存在自己的内存空间中
    alt text
    用法:
//(1)定义消息队列句柄:
rt_mq_t dmq = RT_NULL;
//(2)主线程创建消息队列:
dmq = rt_mq_create("dmq", 100, 10, RT_IPC_FLAG_FIFO);
//(3)1#线程发送消息:
rt_mq_send(dmq, &b, sizeof(b));
//(4)2#线程接收消息:
rt_mq_recv(dmq, &b, sizeof(b), RT_WAITING_FOREVER);

alt text

  1. 什么是信号,使用方法?
    信号(又称为软中断信号),在软件层次上是对中断机制的一种模拟,用来通知线程发生了异步事件,用做线程之间的异常通知、应急处理。在原理上,一个线程收到一个信号与处理器收到一个中断请求可以说是类似的。
    信号本质是软中断,线程不必通过任何操作来等待信号的到达,事实上,线程也不知道信号到底什么时候到达,线程之间可以互相通过调用 rt_thread_kill() 发送软中断信号。
    alt text
    信号的三种处理方法:
  • 指定处理函数
  • 忽略信号
  • 系统默认值
    用法:
    假设线程1 #需要对信号进行处理。首先,线程1要执行三个操作: 安装信号(类似硬件中工作方式设置为中断模式)、 解除阻塞(类似开中断)和设置异常处理方式(类似中断服务)。然后,线程2#可以给线程 1 发送信号(类似产生中断),触发线程 1 对该信号的处理。
//(1)在RT-Thread Settings中使能信号(默认不使能);
//(2)线程1#安装信号:
rt_signal_install(SIGUSR1, thread1_signal_handler);
//(3)线程1#解除信号阻塞:
rt_signal_unmask(SIGUSR1);
//(4)编写信号处理函数:
void tid1_signal_handler(int sig)
//(5)线程2#发送信号:
rt_thread_kill(tid1, SIGUSR1);

alt text

  1. 什么是IO设备
    IO设备模型是建立在内核对象模型基础之上的一类对象,被纳入对象管理器的范畴。

  2. PIN设备的应用步骤

    1. 获取引脚编号(3种方法)
      1. 使用API
      rt_base_t pin_num;
      pin_num = rt_pin_get("PA.0");
      
      1. 使用宏
          #include <board.h>  
          #define PIN_NUM   GET_PIN(A,0)
      
      1. 查看定义
      #define PIN_NUM   0
      
    2. 设置引脚模式
      rt_pin_mode(pin_num, PIN_MODE_OUTPUT);
      
    3. 设置引脚电平
      rt_pin_write(pin_num, PIN_HIGH);
      
    4. 设置引脚上下拉
      rt_pin_pull_up(pin_num, 1);
      

中断示例:
alt text

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

flink源码系列:RPC通信

这里写目录标题 1. 本节课目的2.开始本节内容2.1.RPC概念3.2.大数据组件常见的RPC实现技术3.3.Pekko&#xff08;Akka&#xff09;3.3.1. Akka、Pekko基本概念3.3.2.Pekko Demo事例3.3.2.1.PekkoData 类3.3.2.2.PekkoRpcReceiverActor类3.3.2.3.PekkoRpcSenderActor 类3.3.2.4.…

618全面开战,抖音电商头部品牌罗拉密码突然“不干”了?

前言&#xff1a; 随着618电商大战的硝烟渐浓&#xff0c;各大电商平台纷纷摩拳擦掌&#xff0c;准备在这场年度购物盛宴中大展拳脚。然而&#xff0c;在这热闹非凡的氛围中&#xff0c;一个熟悉的名字却显得格外低调——罗拉密码。作为抖音电商领域的头部品牌&#xff0c;罗拉…

Git代码冲突原理与三路合并算法

Git代码冲突原理 Git合并文件是以行为单位进行一行一行合并的&#xff0c;但是有些时候并不是两行内容不一样Git就会报冲突&#xff0c;这是因为Git会帮助我们进行分析得出哪个结果是我们所期望的最终结果。而这个分析依据就是三路合并算法。当然&#xff0c;三路合并算法并不…

BetterZip 5软件安装包下载+安装教程

BetterZip是一款功能强大的Mac解/压缩软件&#xff0c;可以满足用户对文件压缩、解压、加密和保护等方面的需求。以下是关于BetterZip软件的主要功能、特点和使用方法的详细介绍&#xff0c;以及对其用户友好度、稳定性和安全性的评价。 安 装 包 获 取 地 址: BetterZip 5-安…

Unity引擎在UI上渲染粒子播放

大家好&#xff0c;我是阿赵。   在UI上面显示粒子特效&#xff0c;如果把粒子系统直接拖到Canvas里面&#xff0c;会存在很多问题&#xff0c;比如层级问题、裁剪问题等。这里分享一种用MaskableGraphic和UIVertex来显示粒子特效的方法。 一、 MaskableGraphic和UIVertex简…

使用Python和Matplotlib绘制复杂数学函数图像

本文介绍了如何使用Python编程语言和Matplotlib库来绘制复杂的数学函数图像。通过引入NumPy库的数学函数,我们可以处理包括指数函数在内的各种复杂表达式。本文详细讲解了如何设置中文字体以确保在图像中正确显示中文标题和标签,并提供了一个完整的代码示例,用户可以通过输入…

【Redis进阶】RDB持久化策略

1. 浅谈持久化 持久化&#xff1a;能够在重启主机/进程的时候&#xff0c;将数据从硬盘中恢复到内存的特性。 持久化相信大家都是不陌生的&#xff0c;毕竟MySQL中事务ACID四大特性中就包含持续性这样的特点&#xff0c;所谓持久化&#xff0c;本质上就是将数据保存在硬盘上&a…

Sping源码(九)—— Bean的初始化(非懒加载)— lookupMethod标签

序言 在继续深入Spring的对象创建流程之前&#xff0c;这篇文章先简单介绍一下lookupMethod标签的用法及作用。 准备的xml 自定义名为methodOverride.xml的配置文件。 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.s…

【星海随笔】云解决方案学习日志篇(三) 工作原理篇

Filebeat工作原理 Filebeat 是使用 Golang 实现的轻量型日志采集器,也是 Elasticsearch stack 里面的一员。本质上是一个 agent ,可以安装在各个节点上,根据配置读取对应位置的日志,并上报到相应的地方去。 使用了背压敏感协议,因此不会使管道过载。当Logstash数据处理繁忙时,…

张艺兴step新专开启自由驾驶新纪元

张艺兴《Step》新专&#xff0c;开启自由驾驶新纪元&#xff01;当音乐与驾驶相遇&#xff0c;会碰撞出怎样的火花&#xff1f;当实力派艺人张艺兴遇上全新英文专辑《Step》&#xff0c;便为我们解锁了一种前所未有的出行体验&#xff01;这不仅仅是一张音乐专辑&#xff0c;更…

南方cass专业测绘软件下载,南方cass功能强大的cad辅助测绘软件获取!

在测绘领域&#xff0c;南方CASS测绘软件无疑是一颗璀璨的明星&#xff0c;被誉为“全能选手”。这款软件在功能方面表现出了令人赞叹的多样性和专业性&#xff0c;为测绘工作提供了极大的便利。 ​ 首先&#xff0c;南方CASS测绘软件具备强大的数据兼容性&#xff0c;支持多种…

万相台的功能是什么?如何使用万相台?

1.特点&#xff1a; 万相台是一个智能渠道&#xff0c;可控性弱&#xff0c;高转化&#xff0c;人群&关键词是黑盒&#xff1b; 2.场景多&#xff1a; 有拉新快、活动加速、上新快、货品加速、活动加速、多目标直投、全站推等&#xff1b; 3.扣费逻辑&#xff1a;cpc付…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第41课-动态添加3D对象

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第41课-动态添加3D对象 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…

填报志愿选大学专业,文科生如何选专业?

读文科的同学接触的专业知识相对广泛&#xff0c;往往被认为是“万金油”&#xff0c;他们仿佛什么都能做&#xff0c;但是和专业技能类知识不同&#xff0c;缺乏技术支持&#xff0c;从而使得文科专业的就业方向和前景远远比不上理科专业那么明朗&#xff0c;对于众多文科生而…

机器学习:回顾总结

学了什么 进阶内容 接下来如何学习 找个项目自己练习多读前沿paper 学员分布

【linux网络(三)】HTTP协议详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. 序列化和…

使用QT绘制简单的动态数据折线图

两个核心类时QChart和QLineSeries 下面这个示例代码中&#xff0c;定时器每隔一段时间将曲线图中的数据点向右移动 一个单位&#xff0c;同时调整横坐标轴的范围&#xff0c;实现了一次滚动对应移动一个数据点的效果。 QLineSeries最多容纳40961024个点 #include <QtWidg…

boot整合solr

换了新项目组&#xff0c;技术相对老些&#xff0c;于是用boot框架简单记录下&#xff01; 安装 下载路径&#xff1a;https://solr.apache.org/downloads.html Windows环境 下载solr-8.2.0.zip包并解压缩&#xff0c;以管理员身份打开cmd&#xff0c;执行 solr cmd 命令启…

【开源项目】重庆智慧城市案例~实景三维数字孪生城市CIM/BIM

飞渡科技数字孪生重庆管理平台&#xff0c;以实景三维平台为支撑&#xff0c;以城市数据库对接为核心&#xff0c;利用数字孪生技术&#xff0c;结合云计算、物联网IOT等技术&#xff0c;对接城市规划、智能交通、和公共安全等系统。 利用平台强大的国产自研渲染引擎&#xff0…

你的职业规划就是面向贫穷的规划

如果你觉得作者的文章还有点用,请记得点赞 + 关注 说一个扎心的事实,就是我们绝大多数人的职业规划基本上都是错误的,都是面向贫穷的规划。 因为绝大多数人的职业规划都是打工人的职业规划,这种规划除了很少部分人最终能成为企业高管,实现层级跃迁外,绝大多数人在大多数…