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

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

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

相关文章

WebMvcConfigurer配置不当导致鉴权失败

最近同事说他们有个新需求&#xff0c;需要对接口进行加解密&#xff0c;所以他给项目配置了一个拦截器&#xff0c;但这个拦截器直接导致了每个接口鉴权失败&#xff0c;每次调用接口都是提示没有session信息。 公司内的所有java项目是公用同一套基础依赖&#xff0c;所以我也…

蚂蚁分类信息系统二开仿么么街货源客模板微商货源网源码(带手机版)

源码介绍 网站采用蚂蚁分类信息系统二次开发&#xff0c;模板仿么么街货源客模板&#xff0c;微商货源网定制版。 模板设计风格简洁&#xff0c;分类信息采用列表形式发布&#xff0c;这种设计方式非常符合度娘 SEO 规则。收录效果是杠杠的。 这个网站风格目前是用来做货源推…

【网络安全】【深度学习】【入侵检测】SDN模拟网络入侵攻击并检测,实时检测,深度学习【一】

文章目录 1. 前言2. Mininet 和 Ryu 的区别2.1 Mininet2.2 Ryu2.3 总结 3. 模拟攻击3.1 环境准备3.2 创建 Mininet 网络拓扑3.2 启动 Ryu 控制器3.3 模拟网络攻击3.4 捕获流量 4. 实时异常检测4.1 在 Ryu 控制器中4.2 在 h2 机器上的实验结果4.3 深度学习模型部署上h2机器 帮助…

ArcGIS Pro SDK (三)Addin控件 4 工程项目结构类

25 ArcGIS Pro 自定义项目 目录 25 ArcGIS Pro 自定义项目25.1 添加控件25.2 Code26 ArcGIS Pro 自定义工程项目26.1 添加控件26.2 Code25.1 添加控件 25.2 Code ProCustomItemTest.cs using ArcGIS.Desktop.Core; using ArcGIS.Desktop

分布式文件存储 - - - MinIO从入门到飞翔

MinIO从入门到飞翔 文章目录 MinIO从入门到飞翔0、前言1、分布式文件系统2、MinIO 介绍3、 MinIO安装&#xff08;docker&#xff09;4、基本概念5、通过代码上传文件到MinIO6、封装MinIO为starter7、在其他项目中集成封装好的模块 0、前言 对象存储是一种数据存储架构&#x…

互联网应用主流框架整合之SpringMVC基础组件开发

多种传参方式 在前一篇文章互联网应用主流框架整合之SpringMVC初始化及各组件工作原理中讨论了最简单的参数传递&#xff0c;而实际情况要复杂的多&#xff0c;比如REST风格&#xff0c;它往往会将参数写入请求路径中&#xff0c;而不是以HTTP请求参数传递&#xff1b;比如查询…

audio标签隐藏播放器尾部的三个点

问题&#xff1a; 在谷歌浏览器上&#xff0c;展示audio音频控件时&#xff0c;后面有三个点&#xff0c;点击后会显示下载和播放速度&#xff0c;想隐藏这两个控件。 注意&#xff1a; 不是所有版本都有这三个点&#xff0c;甚至有的版本里面三个点里面的控件只有下载。 解…

【Windows10】查看WIFI密码

操作步骤 电脑上查看已连接Wi-Fi的密码的步骤如下: 连接需要查看密码的Wi-Fi。右键点击任务栏上的 [网络] 图标&#xff0c;选择 [开启"网络和Internet"设置]。在 高级网络设置 项目中&#xff0c;点选 [网络和共享中心]。开启网络和共享中心的窗口后&#xff0c;点…

vue打包exe实战记录

vue项目不支持直接打包exe,可以依靠electron进行打包,处理方式是将vue打包的dist文件夹放到electron项目中,通过配置后打包electron.先看下本地环境 下面是实操记录: 1.vue项目打包 vue.config.js中设置项目路径为 module.exports {//publicPath: /chat_pc/, // 前端项目…

苍穹外卖笔记-13-导入地址簿功能代码、用户下单、订单支付

文章目录 1. 导入地址簿功能代码1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计1.1.3 表设计 1.2 代码导入1.2.1 Mapper层1.2.2 Service层1.2.3 Controller层 1.3 功能测试 2. 用户下单2.1 需求分析和设计2.1.1 产品原型2.1.2 接口设计2.1.3 表设计 2.2 代码开发2.2.1 DTO设计…

Spotify 音乐平台宣布成立内部创意机构,测试生成式人工智能配音广告

Spotify是一家流媒体音乐平台&#xff0c;提供广泛的音乐、播客和视频内容。用户可以通过订阅服务Spotify Premium来享受更多高级功能&#xff0c;如无广告播放、离线听歌等。 Spotify 周四宣布&#xff0c;它将通过其首家名为 Creative Lab 的内部创意机构进一步进军广告领域…

集合查询-并(UNION)集运算、交(INTERSECT)集运算、差(EXCEPT)集运算

一、概述 集合查询是对两个SELECT语句的查询结果进行再进行处理的查询 二、条件 1、两个SELECT语句的查询结果必须是属性列数目相同 2、两个SELECT语句的查询结果必须是对应位置上的属性列必须是相同的数据类型 三、并(UNION)运算 1、语法格式&#xff1a; SELECT 语句1…

Vite - 项目打包从 0 到 1(完美解决打包后访问白屏问题)

目录 开始 修改资源相对地址 引入 vitejs/plugin-legacy 插件并配置 修改打包指令 修改 router 中的 history 前端配置跨域相关 打包后成功访问 开始 修改资源相对地址 在 vite.config.js 文件中配置如下&#xff1a; export default defineConfig({base: ./, //1.打包…

揭秘循环购模式:为何商家愿“送钱”,用户能边消费边赚钱?

大家好&#xff0c;我是你们的电商专家吴军。今天&#xff0c;我将带大家走进一个神秘而又吸引人的商业模式——循环购模式。你可能会疑惑&#xff0c;为什么消费者能在这里“消费1000送2000”&#xff0c;每天还能领取现金并提现&#xff1f;商家真的在“送钱”吗&#xff1f;…

(css)el-tabs滚动按钮浮动问题

(css)el-tabs滚动按钮浮动问题 修改前&#xff1a; 修改后&#xff1a; 思路&#xff1a;找到相应元素&#xff0c;降低层级 css写法&#xff1a; ::v-deep .el-tabs__nav {z-index: 1; }

MySql出现的问题

1.在控制面吧输入mysql显示不是内部命令 2.找到mysql安装的目录,复制目录路径 3.打开系统属性设置环境变量中的Path将路径添加到里面 4.添加好以后将控制面板重新打开输入命令 2.解决安装mysql错误 导致多个mysql服务删除教程 1.用管理员身份打开cmd命令板 2.在…

各地区城乡居民基本养老保险情况数据,Shp+excel格式

基本信息. 数据名称: 各地区城乡居民基本养老保险情况数据 数据格式: Shpexcel 数据几何类型: 面 数据坐标系: WGS84 数据时间&#xff1a;2008-2018年 数据来源&#xff1a;网络公开数据 数据可视化.

Android Studio Koala | 2024.1.1 发布,快来看看有什么更新吧

自从三年前 Android Studio 更改了版本方案之后&#xff0c;从 Arctic Fox 开始每个主要版本都发布一个动物代号&#xff0c;同时版本迭代更新的节奏也越来越快&#xff0c;当然“填坑”的速度和“开坑”的速度几乎也“持平”&#xff0c;可以说每个版本都有痛点&#xff0c;都…

68. UE5 RPG 优化敌人角色的表现效果

我们现在已经有了四个敌人角色&#xff0c;接下来&#xff0c;处理一下在战斗中遇到的问题。 处理角色死亡后还会攻击的问题 因为我们有角色溶解的效果&#xff0c;角色在死亡以后的5秒钟才会被销毁掉。所以在这五秒钟之内&#xff0c;角色其实还是会攻击。主要时因为AI行为树…

【踩坑】修复Ubuntu远程桌面忽然无法Ctrl C/V复制粘贴及黑屏

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 说在前面&#xff1a; 需要注意的是&#xff0c;我发现他应该是新开了一个窗口给我。我之前打开的东西&#xff0c;在这个新窗口里都没有了&#xff0c…