FreeRTOS 延迟中断处理
采用二值信号量同步
二值信号量可以在某个特殊的中断发生时,让任务解除阻塞,相当于让任务与中断
 同步。这样就可以让中断事件处理量大的工作在同步任务中完成,中断服务例程(ISR)
 中只是快速处理少部份工作。如此,中断处理可以说是被”推迟(deferred)”到一个”处理
 (handler)”任务。
 如果某个中断处理要求特别紧急,其延迟处理任务的优先级可以设为最高,以保证
 延迟处理任务随时都抢占系统中的其它任务。这样,延迟处理任务就成为其对应的 ISR
 退出后第一个执行的任务,在时间上紧接着 ISR 执行,相当于所有的处理都在 ISR 中
 完成一样。这种方案在图 图 26 中展现。

延迟处理任务对一个信号量进行带阻塞性质的”take”调用,意思是进入阻塞态以等
 待事件发生。当事件发生后,ISR 对同一个信号量进行”give”操作,使得延迟处理任务
 解除阻塞,从而事件在延迟处理任务中得到相应的处理。
 “获取(Taking,带走,按通常的说法译为获取)”和”给出(Giving)”信号量从概念上讲,
不同的应用场合有不同的含义。在经典的信号量术语中,获取信号量等同于一个 P()
 操作,而给出信号量等同于一个 V()操作。
在这种中断同步的情形下,信号量可以看作是一个深度为 1 的队列。这个队列由于
 最多只能保存一个数据单元,所以其不为空则为满(所谓”二值”)。延迟处理任务调用
 xSemaphoreTake()时,等效于带阻塞时间地读取队列,如果队列为空的话任务则进入
 阻塞态。当事件发生后,ISR 简单地通过调用 xSemaphoreGiveFromISR()放置一个令
 牌(信号量)到队列中,使得队列成为满状态。这也使得延迟处理任务切出阻塞态,并移
 除令牌,使得队列再次成为空。当任务完成处理后,再次读取队列,发现队列为空,又
 进入阻塞态,等待下一次事件发生。整个流程在图 图 27 中有所展现。
 如图 图 27 所示,中断给出信号量,甚至是在信号量第一次被获取之前就给出;而任
 务在获取信号量之后再也不给回来。这就是为什么说这种情况与读写队列相似。这也经
 常会给大家造成迷惑,因为这种情形和其它信号量的使用场合大不相同。在其它场合下,
 任务获得(Take)了信号量之后,必须得给(Give)回来——如同第四章描述一样。
vSemaphoreCreateBinary() API 函数
 FreeRTOS 中各种信号量的句柄都存储在 xSemaphoreHandle 类型的变量中。
 在 使 用 信 号 量 之 前 , 必 须 先 创 建 它 。 创 建 二 值 信 号 量 使 用
 vSemaphoreCreateBinary()API 函数
 void vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore );
xSemaphore 创建的信号量
 需要说明的是 vSemaphoreCreateBinary()在实现上是一个宏,所以
 信号量变量应当直接传入,而不是传址。本章中包含本函数调用的示
 例可用于参考进行复制。

xSemaphoreTake() API 函数
 “带走(Taking)”一个信号量意为”获取(Obtain)”或”接收(Receive)”信号量。只有当信
 号量有效的时候才可以被获取。在经典信号量术中,xSemaphoreTake()等同于一次 P()
 操作。
 除互斥信号量(Recursive Semaphore,直译为递归信号量,按通常的说法译为互
 斥信号量)外,所有类型的信号量都可以调用函数 xSemaphoreTake()来获取。
 但 xSemaphoreTake()不能在中断服务例程中调用。
portBASE_TYPE xSemaphoreTake( xSemaphoreHandle xSemaphore, portTickType xTicksToWait );
xSemaphore 获取得到的信号量
 信号量由定义为 xSemaphoreHandle 类型的变量引用。信号量在使
 用前必须先创建。
 xTicksToWait 阻塞超时时间。任务进入阻塞态以等待信号量有效的最长时间。
 如果 xTicksToWait 为 0,则 xSemaphoreTake()在信号量无效时会
 立即返回。
 阻塞时间是以系统心跳周期为单位的,所以绝对时间取决于系统心
 跳频率。常量 portTICK_RATE_MS 可以用来把心跳时间单位转换
 为毫秒时间单位。
 如 果 把 xTicksToWait 设 置 为 portMAX_DELAY , 并 且 在
 FreeRTOSConig.h 中设定 INCLUDE_vTaskSuspend 为 1,那么阻
 塞等待将没有超时限制。
返回值 有两个可能的返回值:
 1. pdPASS
 只有一种情况会返回 pdPASS,那就是成功获得信号量。
 如果设定了阻塞超时时间(xTicksToWait 非 0),在函数返回之前任务
 将被转移到阻塞态以等待信号量有效。如果在超时到来前信号量变
 为有效,亦可被成功获取,返回 pdPASS。
 2. pdFALSE
 未能获得信号量。
 如果设定了阻塞超时时间(xTicksToWait 非 0),在函数返回之前任
 务将被转移到阻塞态以等待信号量有效。但直到超时信号量也没有
 变为有效,所以不会获得信号量,返回 pdFALSE。
xSemaphoreGiveFromISR() API 函数
 除互斥信号量外,FreeRTOS 支持的其它类型的信号量都可以通过调用
 xSemaphoreGiveFromISR()给出。
 xSemaphoreGiveFromISR()是 xSemaphoreGive()的特殊形式,专门用于中断服务
 例程中。
 portBASE_TYPE xSemaphoreGiveFromISR( xSemaphoreHandle xSemaphore,
 portBASE_TYPE *pxHigherPriorityTaskWoken );
xSemaphore 给出的信号量
 信号量由定义为 xSemaphoreHandle 类型的变量引用。
 信号量在使用前必须先创建。
 pxHigherPriorityTaskWoken 对某个信号量而言,可能有不止一个任务处于阻塞态在
 等待其有效。调用 xSemaphoreGiveFromISR()会让信
 号量变为有效,所以会让其中一个等待任务切出阻塞
 态。如果调用 xSemaphoreGiveFromISR()使得一个任
 务解除阻塞,并且这个任务的优先级高于当前任务(也就
 是被中断的任务),那么 xSemaphoreGiveFromISR()会
 在 函 数 内 部 将 *pxHigherPriorityTaskWoken 设 为
 pdTRUE。
 如 果 xSemaphoreGiveFromISR() 将 此 值 设 为
 pdTRUE,则在中断退出前应当进行一次上下文切换。
 这样才能保证中断直接返回到就绪态任务中优先级最
 高的任务中。
 返回值 有两个可能的返回值:
 1. pdPASS
 xSemaphoreGiveFromISR()调用成功。
 2. pdFAIL
 如果信号量已经有效,无法给出,则返回 pdFAIL。
相关文章:
FreeRTOS 延迟中断处理
采用二值信号量同步 二值信号量可以在某个特殊的中断发生时,让任务解除阻塞,相当于让任务与中断 同步。这样就可以让中断事件处理量大的工作在同步任务中完成,中断服务例程(ISR) 中只是快速处理少部份工作。如此,中断处理可以说是…...
计网体系结构
计算机网络的概述 概念 网络:网状类的东西或系统。 计算机网络:是一个将分散的、具有独立性功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。即计算机网络是互连(通过通信链路互连…...
linux系统zabbix工具监控web页面
web页面监控 内建key介绍浏览器配置浏览器页面查看方式 监控指定的站点的资源下载速度,及页面响应时间,还有响应代码; web Scenario: web场景(站点)web page :web页面,一个场景有多…...
VMware虚拟机网络配置
VMware虚拟机网络配置 桥接模式NAT网络 桥接模式 桥接模式其实就是借助你宿主机上的网卡进行联网和通信,所以相当于虚拟机和宿主机平级,处于同一个网段中。 配置要点: 注意选择正确的宿主机网卡 查看宿主机的网络信息,这些信息指…...
代码随想录算法训练营DAY18 | 二叉树 (5)
一、LeetCode 513 找树左下角的值 题目链接:513.找树左下角的值https://leetcode.cn/problems/find-bottom-left-tree-value/ 思路一:递归回溯全局变量比深度。 class Solution {int Max_depth 0;int result 0;public int findBottomLeftValue(TreeNo…...
企业微信自动推送机器人的应用与价值
随着科技的快速发展,企业微信自动推送机器人已经成为了企业数字化转型的重要工具。这种机器人可以自动推送消息、执行任务、提供服务,为企业带来了许多便利。本文将探讨企业微信自动推送机器人的应用和价值。 一、企业微信自动推送机器人的应用 企业微信…...
Matplotlib plt.plot:从入门到精通,只需一篇文章!
Matplotlib plt.plot:从入门到精通,只需一篇文章! 利用Matplotlib进行数据可视化示例 🌵文章目录🌵 📊 1. 引言:为什么Matplotlib在数据可视化中如此重要?📊✨ 2. plt.pl…...
Linux中sigaction函数和SIGCHLD信号的使用
sigaction函数: 函数说明:注册一个信号处理函数 函数原型:int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 函数参数: signum:捕捉的信号act:传入参数,…...
【MySQL】操作库 —— 表的操作 -- 详解
一、增加表 1、创建表 mysql> create database [if not exists] table_name ( -> field1 datatype, -> field2 datatype, -> field3 datatype -> ) character set 字符集 collate 校验规则 engine 存储引擎; 注意 :最后一行也可以写成&#x…...
ZigBee学习——在官方例程实现组网
✨Z-Stack版本:3.0.2 ✨IAR版本:10.10.1 ✨这篇博客是在善学坊BDB组网实验的基础上进行完善,并指出实现的过程中会出现的各种各样的问题! 善学坊教程地址: ZigBee3.0 BDB组网实验 文章目录 一、基础工程选择二、可能遇…...
ES实战--wildcard正则匹配exists过滤字段是否存在
wildcard 通配符中的 * 表示任意数量的字符 ?表示任意单个字符 #正则匹配 GET /wildcard-test/_search {"query": {"wildcard": {"title": {"wildcard": "ba*n"}}} } #响应:"hits": {"total": {"…...
C++学习:二分查找
二分查找的前提 库函数只能对数组进行二分查找。 对一个数组进行二分查找的前提是这个数组中的元素是单调的。 一般为单调不减,当然如果是单调不增也可以(需要修改比较函数) 例如: [1,5,5,9,18]是单调的 [1 , 9, 9,…...
语言与科技创新(大语言模型对科技创新的影响)
1.语言因素对科技创新的影响 科技创新中的语言因素至关重要,具体体现在以下几个方面: 科技文献交流: 英语作为全球科学研究的通用语言,极大地推动了科技成果的国际传播与合作。在国际上,科学家们在发表论文、报告研究…...
【C语言】简单贪吃蛇实现保姆级教学!!!
关注小庄 顿顿解馋૮(˶ᵔ ᵕ ᵔ˶)ა 新年快乐呀小伙伴 引言: 小伙伴们应该都有一个做游戏的梦吧?今天让小庄来用C语言简单实现一下我们的童年邪典贪吃蛇,顺便巩固我们的C语言知识,请安心食用~ 文章目录 贪吃蛇效果一.游戏前工作…...
rtt设备io框架面向对象学习-uart设备
目录 1.uart设备基类2.uart设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.uart设备基类 此层处于设备驱动框架层。也是抽象类。 在/ components / drivers / include / drivers 下的serial.h定义了如下uart设备基类 struc…...
Innodb下修改事务工作流程(buffer pool、redo log、undolog)
1、在Buffer Pool中读取数据:当InnoDB需要更新一条记录时,首先会在Buffer Pool中查找该记录是否在内存中。如果没有在内存中,则从磁盘读取该页到Buffer Pool中。 2、记录UndoLog:在修改操作前,InnoDB会在Undo Log中记…...
redis为什么使用跳跃表而不是树
Redis中支持五种数据类型中有序集合Sorted Set的底层数据结构使用的跳跃表,为何不使用其他的如平衡二叉树、b树等数据结构呢? 1,redis的设计目标、性能需求: redis是高性能的非关系型(NoSQL)内存键值数据…...
【matalab】基于Octave的信号处理与滤波分析案例
一、基于Octave的信号处理与滤波分析案例 GNU Octave是一款开源软件,类似于MATLAB,广泛用于数值计算和信号处理。 一个简单的信号处理与滤波分析案例,说明如何在Octave中生成一个有噪声的信号,并设计一个滤波器来去除噪声。 首…...
Elasticsearch:特定领域的生成式 AI - 预训练、微调和 RAG
作者:来自 Elastic Steve Dodson 有多种策略可以将特定领域的知识添加到大型语言模型 (LLM) 中,并且作为积极研究领域的一部分,正在研究更多方法。 对特定领域数据集进行预训练和微调等方法使 LLMs 能够推理并生成特定领域语言。 然而&#…...
HarmonyOS—UI 开发性能提升的推荐方法
开发者若使用低性能的代码实现功能场景可能不会影响应用的正常运行,但却会对应用的性能造成负面影响。本章节列举出了一些可提升性能的场景供开发者参考,以避免应用实现上带来的性能劣化。 使用数据懒加载 开发者在使用长列表时,如果直接采用…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
