任务中断的两套API函数(改进FormISR的实时性)资源管理_互斥操作的本质(解决DH11经常出错的问题)

任务中断的两套API函数

为什么需要两套 API

在任务函数中,我们可以调用各类 API 函数,比如队列操作函数:xQueueSendToBack。
但是在 ISR 中使用这个函数会导致问题,应该使用另一个函数:xQueueSendToBackFromISR,
它的函数名含有后缀"FromISR",表示"从 ISR 中给队列发送数据"。
FreeRTOS 中很多 API 函数都有两套:一套在任务中使用,另一套在 ISR 中使用。后者的
函数名含有 "FromISR" 后缀。
为什么要引入两套 API 函数?
很多 API 函数会导致任务计入阻塞状态:
运行这个函数的 任务 进入阻塞状态
比如写队列时,如果队列已满,可以进入阻塞状态等待一会
ISR 调用 API 函数时, ISR 不是 " 任务 " ISR 不能进入阻塞状态
所以,在任务中、在 ISR 中,这些函数的功能是有差别的
FreeRTOS 使用两套函数,而不是使用一套函数,是因为有如下好处:
使用同一套函数的话,需要增加额外的判断代码、增加额外的分支,是的函
数更长、更复杂、难以测试
在任务、 ISR 中调用时,需要的参数不一样,比如:
在任务中调用:需要指定超时时间,表示如果不成功就阻塞一会
ISR 中调用:不需要指定超时时间,无论是否成功都要即刻返回
如果强行把两套函数揉在一起,会导致参数臃肿、无效
移植 FreeRTOS 时,还需要提供监测上下文的函数,比如 is_in_isr()
有些处理器架构没有办法轻易分辨当前是处于任务中,还是处于 ISR 中,就
需要额外添加更多、更复杂的代码
使用两套函数可以让程序更高效,但是也有一些缺点,比如你要使用第三方库函数时,
即会在任务中调用它,也会在 ISR 总调用它。这个第三方库函数用到了 FreeRTOS API 函数,
你无法修改库函数。这个问题可以解决:
把中断的处理推迟到任务中进行 (Defer interrupt processing) ,在任务中调用库
函数
尝试在库函数中使用 "FromISR" 函数:
在任务中、在 ISR 中都可以调用 "FromISR" 函数
反过来就不行,非 FromISR 函数无法在 ISR 中使用
第三方库函数也许会提供 OS 抽象层,自行判断当前环境是在任务还是在
ISR 中,分别调用不同的函数

两套 API 函数列表

 

区别

ISR

有任务的唤醒,但是不进行调度

在中断API中,中断的特性是必须快速执行,所以在运行中,如果有更高级的任务B来执行,那就会唤醒B,但是不会去执行B

ISR执行操作有唤醒任务,将任务放入Readylist,并记录是否有更高优先级的任务被唤醒,以便在中断结束后执行

非中断

有任务的唤醒,进行任务的调度

改进FormISR的实时性代码

void XXX_ISR()
{
 int i;
 BaseType_t xHigherPriorityTaskWoken = pdFALSE;//保证高优先级的任务被及时执行
 
 for (i = 0; i < N; i++)
 {
 xQueueSendToBackFromISR(..., &xHigherPriorityTaskWoken); /* 被多次调用 */
 }
 /* 最后再决定是否进行任务切换
 * xHigherPriorityTaskWoken 为 pdTRUE 时才切换
 */
 portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}










/**********************************************************************
 * 函数名称: GetKeyFromBuf
 * 功能描述: 从环形缓冲区读取按键数据
 * 输入参数: 无
 * 输出参数: 无
 * 返 回 值: 0xff - 读不到数据, 其他值-按键值(device或key)
 * 修改日期:      版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2023/08/04	     V1.0	  韦东山	      创建
 ***********************************************************************/
static unsigned char GetKeyFromBuf(void)
{
	unsigned char key = 0xff;
	if (!isKeysBufEmpty())
	{
		key = g_KeysBuf[g_KeysBuf_R];
		g_KeysBuf_R = NEXT_POS(g_KeysBuf_R);
	}
	return key;
}

void RegisterQueueHandle(QueueHandle_t queueHandle)
{
	if (g_queue_cnt < 10)
	{
		g_xQueues[g_queue_cnt] = queueHandle;
		g_queue_cnt++;
	}
}


static void DispatchKey(struct ir_data *pidata)
{
	BaseType_t xHigherPriorityTaskWoken = pdFALSE;
#if 0	
	extern QueueHandle_t g_xQueueCar1;
	extern QueueHandle_t g_xQueueCar2;
	extern QueueHandle_t g_xQueueCar3;

	xQueueSendFromISR(g_xQueueCar1, pidata, NULL);
	xQueueSendFromISR(g_xQueueCar2, pidata, NULL);
	xQueueSendFromISR(g_xQueueCar3, pidata, NULL);
#else
	int i;
	for (i = 0; i < g_queue_cnt; i++)
	{
		xQueueSendFromISR(g_xQueues[i], pidata, &xHigherPriorityTaskWoken);
	}
	
	portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
	
#endif	
}

资源管理_互斥操作的本质

在前面讲解互斥量时,引入过临界资源的概念。在前面课程里,已经实现了临界资源的
互斥访问。
本章节的内容比较少,只是引入两个功能:屏蔽 / 使能中断、暂停 / 恢复调度器。
要独占式地访问临界资源,有 3 种方法:
公平竞争:比如使用互斥量,谁先获得互斥量谁就访问临界资源,这部分内
容前面讲过。
谁要跟我抢,我就灭掉谁:
中断要跟我抢?我屏蔽中断
其他任务要跟我抢?我禁止调度器,不运行任务切换

屏蔽中断

屏蔽中断有两套宏:任务中使用、ISR 中使用:
任务中使用: taskENTER_CRITICA()/taskEXIT_CRITICAL()
ISR 中使用:
taskENTER_CRITICAL_FROM_ISR()/taskEXIT_CRITICAL_FROM_ISR()
void vAnInterruptServiceRoutine( void )
{
 /* 用来记录当前中断是否使能 */
 UBaseType_t uxSavedInterruptStatus;
 
 /* 在 ISR 中,当前时刻中断可能是使能的,也可能是禁止的
  * 所以要记录当前状态, 后面要恢复为原先的状态
  * 执行这句代码后,屏蔽中断
  */
 uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();
 
 /* 访问临界资源 */
 /* 恢复中断状态 */
 taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );
 /* 现在,当前 ISR 可以被更高优先级的中断打断了 */
}

暂停调度器

如果有别的任务来跟你竞争临界资源,你可以把中断关掉:这当然可以禁止别的任务运
行,但是这代价太大了。它会影响到中断的处理。
如果只是禁止别的任务来跟你竞争,不需要关中断,暂停调度器就可以了:在这期间,
中断还是可以发生、处理。
/* 暂停调度器 */
void vTaskSuspendAll( void );
/* 恢复调度器
* 返回值: pdTRUE 表示在暂定期间有更高优先级的任务就绪了
* 可以不理会这个返回值
*/
BaseType_t xTaskResumeAll( void );

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

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

相关文章

基于SpringBoot+Vue的高校社团管理系统

摘要 随着高校社团活动日益丰富多样&#xff0c;传统人工管理模式弊端凸显&#xff0c;迫切需要信息化的社团管理系统。本文介绍了基于 SpringBoot Vue 开发的高校社团管理系统。在技术选型方面&#xff0c;SpringBoot 作为后端框架&#xff0c;凭借其强大的自动配置功能&…

vscode插件Todo tree

# 需求 &#xff1a; 将注释形成可视化列表 快速找到相关代码位置 免搜索 # 使用步骤 1. 安装todo tree 插件 2. 使用 todo tree 按快捷键 ctrlshiftp 输入 todo tree:add tag 添加你打注释的开头关键字 比如 // 这是一条注释 示例可以添加搜索tag为 //空格 3. t…

Windows Server 2022 Web2

载入靶机&#xff0c;看到相关描述&#xff1a; 进入虚拟机发现桌面有phpstudy和解题两个软件&#xff1a; 先点击“解题.exe”&#xff1a; 1.攻击者的IP地址&#xff08;两个&#xff09;&#xff1f; 2.攻击者的webshell文件名&#xff1f; 3.攻击者的webshell密码&#x…

学习Prompt Turning

传统的微调因为代价很高&#xff0c;而且一旦权重很大&#xff0c;这种fine 微微的意思是调不动模型的&#xff0c;所以需要这种提示词调 mindnlp直接有 peft config peft_config PromptTuningConfig(task_type“SEQ_CLS”, num_virtual_tokens10) 方便我们进行prompt tunin…

分类算法——基于heart数据集实现

1 heart数据集——描述性统计分析 import matplotlib.pyplot as plt import pandas as pd# Load the dataset heart pd.read_csv(r"heart.csv", sep,)# Check the columns in the DataFrame print(heart.columns)aheart.loc[:, y].value_counts() print(a) heart.l…

POA-CNN-SVM鹈鹕算法优化卷积神经网络结合支持向量机多特征分类预测

分类预测 | Matlab实现POA-CNN-SVM鹈鹕算法优化卷积神经网络结合支持向量机多特征分类预测 目录 分类预测 | Matlab实现POA-CNN-SVM鹈鹕算法优化卷积神经网络结合支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现POA-CNN-SVM鹈鹕算法…

【SVN和GIT】版本控制系统详细下载使用教程

文章目录 ** 参考文章一、什么是SVN和GIT二、软件使用介绍1 SVN安装1.1 服务端SVN下载地址1.2 客户端SVN下载地址2 SVN使用2.1 服务端SVN基础使用2.1.1 创建存储库和用户成员2.1.2 为存储库添加访问人员2.2 客户端SVN基础使用2.2.1 在本地下载库中的内容2.2.2 版本文件操作--更…

设计模式:7、策略模式(政策)

目录 0、定义 1、策略模式的三种角色 2、策略模式的UML类图 3、示例代码 0、定义 定义一系列算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 1、策略模式的三种角色 策略&#xff08;Strategy&…

3、集线器、交换机、路由器、ip的关系。

集线器、交换机、路由器三者的关系 1、集线器2、交换机&#xff08;每个交换机是不同的广播域&#xff0c;ip地址起到划分广播域的作用&#xff09;3、 路由器4、ip地址 1、集线器 一开始两台电脑通信就需要网线就可以&#xff0c;但是三台或者更多主机通信时&#xff0c;就需…

mfc100u.dll是什么?分享几种mfc100u.dll丢失的解决方法

mfc100u.dll 是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;属于 Microsoft Foundation Classes (MFC) 库的一部分。MFC 是微软公司开发的一套用于快速开发 Windows 应用程序的 C 类库。mfc100u.dll 文件包含了 MFC 库中一些常用的函数和类的定义&#xff0c;这…

魔众题库系统 v10.0.0 客服条、题目导入、考试导航、日志一大批更新

魔众题库系统基于PHP开发&#xff0c;可以用于题库管理和试卷生成软件&#xff0c;拥有极简界面和强大的功能&#xff0c;用户遍及全国各行各业。 魔众题库系统发布v10.0.0版本&#xff0c;新功能和Bug修复累计30项&#xff0c;客服条、题目导入、考试导航、日志一大批更新。 …

opencv-python 分离边缘粘连的物体(距离变换)

import cv2 import numpy as np# 读取图像&#xff0c;这里添加了判断图像是否读取成功的逻辑 img cv2.imread("./640.png") # 灰度图 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 高斯模糊 gray cv2.GaussianBlur(gray, (5, 5), 0) # 二值化 ret, binary cv2…

YOLO-FaceV2: A Scale and Occlusion Aware Face Detector

《YOLO-FaceV2:一种尺度与遮挡感知的人脸检测器》 1.引言2.相关工作3.YOLO-FaceV23.1网络结构3.2尺度感知RFE模型3.3遮挡感知排斥损失3.4遮挡感知注意力网络3.5样本加权函数3.6Anchor设计策略3.7 归一化高斯Wasserstein距离 4.实验4.1 数据集4.2 训练4.3 消融实验4.3.1 SEAM块4…

CMake笔记:install(TARGETS target,...)无法安装的Debug/lib下

1. 问题描述 按如下CMake代码&#xff0c;无法将lib文件安装到Debug/lib或Release/lib目录下&#xff0c;始终安装在CMAKE_INSTALL_PREFIX/lib下。 install(TARGETS targetCONFIGURATIONS DebugLIBRARY DESTINATION Debug/lib) install(TARGETS targetCONFIGURATIONS Release…

网络编程 day1.2~day2——TCP和UDP的通信基础(TCP)

笔记脑图 作业&#xff1a; 1、将虚拟机调整到桥接模式联网。 2、TCP客户端服务器实现一遍。 服务器 #include <stdio.h> #include <string.h> #include <myhead.h> #define IP "192.168.60.44" #define PORT 6666 #define BACKLOG 20 int mai…

[Flux.jl] 非线性回归的拟合

调用第三方库 using Flux, Random using Plots设置随机种子以确保结果的可重复性 Random.seed!(1)生成数据集 x_data rand(Float32, 500) *20 .- 10 # 生成100个随机x值&#xff0c;范围在0到20之间 y_data sin.(x_data) ./ x_data # 生成y值 y_data reshape(y_data, …

如何创建一个项目用于研究element-plus的原理

需求&#xff1a;直接使用element-plus未封装成组件的源码&#xff0c;创建一个项目&#xff0c;可以使用任意的element-plus组件&#xff0c;可以深度研究组件的运行。例如研究某一个效果&#xff0c;如果直接在node_modules修改elment-plus打包之后的那些js、mjs代码&#xf…

借助算力云跑模型

算力平台&#xff1a;FunHPC | 算力简单易用 AI乐趣丛生 该文章只讲述了最基本的使用步骤&#xff08;因为我也不熟练&#xff09;。 【注】&#xff1a;进入平台&#xff0c;注册登录账号后&#xff0c;才能租用。学生认证&#xff0b;实名认证会有免费的算力资源&#xff0…

C语言:函数指针精讲

1、函数指针 一个函数总是占用一段连续的内存区域&#xff0c;函数名在表达式中有事也会被转换为该函数所在内存区域的首地址&#xff0c;这和数组名非常类似&#xff0c;我们可以把函数这个首地址&#xff08;或称入口地址&#xff09;赋予一个指针变量&#xff0c;使指针变量…

CPU命名那些事

一、Intel CPU命名 1. 命名结构 Intel CPU 的命名通常包含以下几个部分&#xff1a; 品牌 产品线 系列 代数 具体型号 后缀 例如&#xff1a;Intel Core i7-13700K 2. 各部分含义 品牌 Intel&#xff1a;表示厂商&#xff08;几乎所有命名中都有&#xff09;。不同品…