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

news2025/7/18 13:50:00

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.coloradmin.cn/o/1822319.html

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

相关文章

关于印发农业中央预算内投资专项管理办法的通知

国家发展改革委关于 印发农业中央预算内投资专项 管理办法的通知 发改农经规〔2024〕744号 农业农村部、海关总署、国家林草局&#xff0c;各省、自治区、直辖市及计划单列市、新疆生产建设兵团发展改革委&#xff0c;北大荒农垦集团有限公司&#xff1a; 为全面贯彻党的二十…

AI时代的程序员,复合型技术大咖该具备哪些本领与魅力?

AI时代对程序员和互联网时代对程序员的要求有不同 在AI时代的今天&#xff0c;程序员所面临的挑战已经有了翻天覆地的变化。 与互联网时代相比&#xff0c;AI时代对程序员的要求更为全面与多元化 回顾互联网时代&#xff0c;程序员主要需要掌握技术的专业知识和编程技能。他…

安卓/iOS/Linux系统影音边下边播P2P传输解决方案

在当今的数字时代&#xff0c;IPTV 影音行业正经历着快速的发展和变革&#xff0c;但影音行业的流量带宽成本一直很高&#xff0c;有没有什么办法既能保证现有的用户观看体验&#xff0c;又能很好降低流量带宽成本呢? P2P技术可能是一个很好的选择&#xff0c;它不仅仅可以提…

vue+showdown展示Markdown 文本

前言&#xff1a; vueshowdown展示Markdown 文本&#xff0c;资料整理 使用教程-vditor&#xff1a; 1、安装 npm install vditor --save 2、使用 <template><div id"vditor" name"description" ></div> </template> <scri…

Ransac(随机抽样一致性算法)多项式拟合附近的点

Ransac&#xff08;随机抽样一致性算法&#xff09;多项式拟合附近的点 RANSAC&#xff08;RANdom SAmple Consensus&#xff09;算法是一种用于拟合数学模型的迭代方法&#xff0c;尤其适用于对数据中有噪声的情况。RANSAC的核心思想是通过迭代从数据集中随机抽取一小部分样本…

计算机图形学入门11:图形管线与着色器

1.什么是图形管线 把场景中的物体经过一系列的处理&#xff0c;最后一张图像的形式在屏幕上显示出来&#xff0c;这一系列过程就是图形管线(Graphics Pipeline)&#xff0c;也叫实时渲染管线(Real-time Rendering Pipeline)。如下图所示&#xff0c;为整个渲染管线的过程。 渲染…

Python:从头创建 Asyncio (2)

引言 现在&#xff0c;asyncio 已成为 Python 社区中的热门话题&#xff0c;并且名副其实——它提供了一种非常出色的处理 I/O 密集型程序的方法&#xff01;在我探索 asyncio 的过程中&#xff0c;我起初并不太明白它的工作原理。但随着深入学习&#xff0c;我意识到 asyncio …

go interface

package mainimport "fmt"// 接口 interface func main() {c : Chinese{} //创建一个中国人实例u : American{} //创建一个美国人实例greet(c) //中国人打招呼greet(u) //美国人打招呼 }// 接收具备SayHello接口能力的变量 func greet(s SayHello) {…

sslh一键在一个端口上运行多个服务(KALI工具系列二十三)

目录 1、KALI LINUX 简介 2、sslh工具简介 3、信息收集 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、操作示例 4.1 监听特定端口 4.2 配置SSH 4.3 配置apache 4.4 配置sshl 4.5 验证配置 5、总结 1、KALI LINUX 简介 Kali Linux 是一个功能强大、…

腾讯云对象存储不绑定自定义备案域名不给下载应该如何处理?

从2024年1月1日起&#xff0c;腾讯云对象存储&#xff08;COS&#xff09;将实施新政策&#xff1a;新创建的存储桶不再支持使用path-style域名&#xff08;即存储桶绝对路径&#xff09;。此外&#xff0c;使用默认域名访问的新存储桶将不再支持任意类型文件的预览&#xff0c…

夏日炎炎 水域守护:北斗守护安全防线——为生命撑起智能保护伞

随着夏季的来临&#xff0c;炎热的天气让许多人纷纷寻求水的清凉。清凉的河流与广阔的海域成为了不少人消暑降温的向往之地。然而&#xff0c;私自下河、下海的行为却暗藏着巨大的安全隐患&#xff0c;每年夏季溺水事故频发&#xff0c;给无数家庭带来不可挽回的悲痛。为有效遏…

QT绘图项目 - 汽车表盘

目录 前言: 整体代码 widget.h widget.cpp 效果演示 实现刻度文字正确排版 优化代码 达到效果 封装整理代码结构: widget.h widget.cpp 指针样式美化 优化后的指针API 效果演示 设置高速刻度为红色 优化刻度API 效果演示 速度显示优化 给内圈画上黑色 优化速度…

【java计算机专业毕设】房屋租赁系统代码源码MySQL springboot vue html maven送文档ppt

1项目功能 【java计算机专业毕设】房屋租赁系统javaweb MySQL springboot vue html maven 送报告 2项目介绍 系统功能&#xff1a; 房屋租赁系统包括管理员和用户和房东三种角色。 该系统包含多个功能模块&#xff0c;分别为管理员、用户和房东提供服务。管理员功能包括个人中…

智能创作引领潮流,抓住时机!TikTok矩阵源码带来自动定时发布的成功策略

智能创作是当今社交媒体平台发展的重要趋势&#xff0c;而TikTok作为最受欢迎的短视频平台之一&#xff0c;通过其独特的创作方式和大量的用户&#xff0c;已经成为广告主和内容创作者的首选平台。在这个竞争激烈的市场&#xff0c;抓住时机并实现成功的关键是自动定时发布&…

遗传算法求解车间调度问题(附python代码)

背景介绍 车间调度问题&#xff08;Job Shop Scheduling Problem, JSSP&#xff09;是一类经典的组合优化问题&#xff0c;它在制造业和生产管理中有着广泛的应用。JSSP 的目标是对车间中的一系列作业进行排程&#xff0c;以使得作业在不同机器上的加工顺序是最优的&#xff0…

03 Tricks

一&#xff1a;Auto-ML的一般形式 还可以支持这个CV啦lp啦&#xff0c;还有多模态啦&#xff0c;都还有很多很多任务啊&#xff0c;都可以支持啊 Auto-Sklearn Auto-Pytorch 结构搜所&#xff1a;神经网络搜所算法&#xff1a; AutoGluon 02 >自动特征工程 Tsfresh Boru…

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

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

Mybatis中#和$的区别

在MyBatis中&#xff0c;#{} 和 ${} 是两种用于参数替换的占位符&#xff0c;但它们在处理方式和安全性上有所不同 #{} 预编译处理&#xff1a;MyBatis在处理#{}时&#xff0c;会将其中的内容作为参数进行预编译处理。这意味着MyBatis会生成一个PreparedStatement对象&#x…

Python武器库开发-武器库篇之SSH服务暴力破解(五十四)

Python武器库开发-武器库篇之SSH服务暴力破解(五十四) SSH&#xff08;Secure Shell&#xff09;是一种加密的网络协议&#xff0c;用于在不安全的网络上提供安全的远程登录和文件传输功能。SSH可以在客户端和服务器之间建立安全的通信连接&#xff0c;确保通信数据的机密性和…

Web应用安全测试-防护功能失效

Web应用安全测试-防护功能失效 1、账号弱锁定机制 漏洞描述&#xff1a;系统帐号锁定时间太短 测试方法&#xff1a;登录时多次输入错误密码&#xff0c;触发账户锁定机制&#xff0c;查看锁定时间是否低于3分钟。 风险分析&#xff1a;若账户锁定时间过短&#xff0c;攻击…