FreeRtos进阶——中断的内部逻辑
中断与非中断API的区别
BaseType_t xQueueSendToBack(QueueHandle_t xQueue,const void *pvItemToQueue,TickType_t xTicksToWait);
BaseType_t xQueueSendToBackFromISR(QueueHandle_t xQueue,const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken);
以写队列的API为例,在非中断的api中最后一项参数为等待时间,而在中断api中最后一项参数仅仅是说明有无优先级更高的任务被唤醒。
在非中断api中,执行的逻辑是这样,如果遇到更高优先级的任务被唤醒,那么更高优先级的任务将会抢占当前任务。而在中断api中,会先记录更高优先级的任务,在中断里的任务处理完成后,在中断末尾对任务进行切换。
中断的范围
在FreeRtos中,关中断并不是关闭所有中断,能够关闭的中断都是对于系统来说都是等级相对较低的,等级高的中断不能关断。因为在FrerRtos中,根本就没有涉及到高等级的中断,在操作系统的api中仅仅只包含了低级的中断。
注意:即使最低优先级的中断 也比最高优先级的任务 优先级要高
中断服务函数 xPortPendSVHandler()
在系统滴答定时器中断服务函数中调用API函数xPortSysTickHandler(),xPortSysTickHandler()函数中通过向中断和状态寄存器的bit28写入1来启动PendSV中断,具体PendSV中断服务函数是 PendSV_Handler,并且任务切换的具体任务是在PendSV中断服务函数中完成的。
#define xPortPendSVHandler PendSV_Handler _asm void xPortPendSVHandler( void )
{extern uxCriticalNesting;extern pxCurrentTCB;extern vTaskSwitchContext;PRESERVE8mrs r0, pspisb/* Get the location of the current TCB. */ldr r3, =pxCurrentTCBldr r2, [r3]/* Is the task using the FPU context? If so, push high vfp registers. */tst r14, #0x10it eqvstmdbeq r0!, {s16-s31}/* Save the core registers. */stmdb r0!, {r4-r11, r14}/* Save the new top of stack into the first member of the TCB. */str r0, [r2]stmdb sp!, {r3}mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITYmsr basepri, r0dsbisbbl vTaskSwitchContext //在此处 调用函数vTaskSwitchContext() ,该函数用来获取下一个要运行的任务,并将 pxCurrentTCB更新为这个要运行的任务。mov r0, #0msr basepri, r0ldmia sp!, {r3}/* The first item in pxCurrentTCB is the task top of stack. */ldr r1, [r3]ldr r0, [r1]/* Pop the core registers. */ldmia r0!, {r4-r11, r14}/* Is the task using the FPU context? If so, pop the high vfp registerstoo. */tst r14, #0x10it eqvldmiaeq r0!, {s16-s31}msr psp, r0isb#ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */#if WORKAROUND_PMU_CM001 == 1push { r14 }pop { pc }nop#endif#endifbx r14 //至此,任务切换成功。
}
在PendSV中断服务函数中实现了一下的功能,首先保存现场,然后调用了函数vTaskSwitchContext()来获取下一个要运行的任务,也就是查找已经就绪了的优先级最高的任务,最后切换新的任务。
相关文章:

FreeRtos进阶——中断的内部逻辑
中断与非中断API的区别 BaseType_t xQueueSendToBack(QueueHandle_t xQueue,const void *pvItemToQueue,TickType_t xTicksToWait); BaseType_t xQueueSendToBackFromISR(QueueHandle_t xQueue,const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWok…...
Centos7对比Ubuntu一些常用操作差异点
Centos7对比Ubuntu一些常用操作差异点 CentOS 7将于2024年6月30日停止维护,CentOS8已经转为Rhel的上游项目。同时Centos7的软件仓库中,部分软件版本较老。后续使用过程中可以考虑切换到Ubuntu。 下面总结了一些两个系统的常见差异点,包括软…...

24、matlab二维和三维网格(meshgrid函数)以及散点数据插值 griddata()函数
1、二维和三维网格(meshgrid函数) 语法 语法1:[X,Y] = meshgrid(x,y) 基于向量 x 和 y 中包含的坐标返回二维网格坐标。 语法2:[X,Y] = meshgrid(x) 与 [X,Y] = meshgrid(x,x) 相同,并返回网格大小为 length(x)length(x) 的方形网格坐标。 语法3:[X,Y,Z] = meshgrid(x,y,…...
Codeforces Round 950 (Div. 3)
好久没写题解了,今天来写个题解。 A - 问题 Generator #include "bits/stdc.h" using namespace std;#define int long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0); #define all(x) x.begin(),x.end() #define pi pair<in…...

弘君资本炒股开户:如何看待股价波动?
在股票商场上股价的动摇无疑是投资者最为关心的话题之一,面临股价的起伏不定投资者往往会感到迷茫和焦虑。关于怎么看待股价动摇,弘君资本下面就为大家详细介绍一下。 股价动摇是股市运行的常态,股市是国民经济的晴雨表,股票价格…...

操作系统实验六 文件系统验证实验
前言 当时由于假期的原因,我们不需要做实验五,所以实验六是我们做的最后一个实验,因此实验五就需要靠大家自己完成了。 1.实验目的 初步掌握Linux系统文件权限和IO操作。 2.实验内容 熟悉Linux系统文件权限和使用相关IO函数进行文件创建和…...

python中的循环控制语句break与continue
学习这两个语句之前,我们要先了解这两个语句是什么意思: break:中断、打破的意思。所以它的跳出循环的意思 continue:继续的意思,意思是跳过当前条件,继续循环 新需求来了!我们不仅要告诉 Py…...

C语言笔记23 •文件操作•
1.为什么要使用文件? 文件,顾名思义就是存储我们所写在电脑上的文本内容。如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失 了,等再次运⾏程序&#x…...

新项目来了,JDK 17和JDK 21 该如何选择?
博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …...

友顺科技(UTC)分立器件与集成IC产品选型和应用
友顺科技股份有限公司成立于1990年,是全球领先的集成电路与功率半导体厂商 ,集团总部位于台北,生产基地位于福州、厦门。 友顺科技具有完整模拟组件产品线,其中类比IC涵盖各种稳压器、PWM控制IC, 放大器、比较器、逻辑IC、Voltage Translato…...
并发与多线程:创建多个线程,数据共享
数据共享问题分析 1. 只读的数据:安全稳定的,不需要特殊处理; 2. 又读又写的数据:2个线程写,8个线程读,写不好程序会崩。 c11并发于多线程_2章_4节_哔哩哔哩_bilibili...

【机器学习数据挖掘】基于ARIMA 自回归积分滑动平均模型的销售价格库存分析报告 附完整python代码
资源地址:Python数据分析大作业 4000字 图文分析文档 销售分析 完整python代码 完整代码分析 同时销售量后1000的sku品类占比中(不畅销产品)如上,精品类产品占比第一,达到66.7%,其次是香化类产品&#…...
LightGBM 进行回归建模的流程
LightGBM 进行回归建模的流程 文章最前: 我是Octopus,这个名字来源于我的中文名–章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有…...
【Linux】多进程基础--信号
文章目录 信号常见信号信号定时函数 信号 发生事件时通过信号向进程进行通知,在软件层次上模拟中断,也叫软件中断,处理优先级较高对于前台进程可以通过特殊的字符发送信号,例如CtrlC即给当前进程发送一个SIGINT中断信号。kill命令…...

若依项目部署(Linux2.0)
解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 配置Java环境变量: vim /etc/profile 设置环境变量生效: source /etc/profile 查看一下jdk版本: java -version 解压tomcat tar -zxvf apache-tomcat-8.5.20.tar.gz 防火墙设置: …...

python小练习03
1.绘制奥运五环旗 #奥运五环的绘制 import turtle as t t.pensize(3) t.speed(0) def draw_circles():i0while i <4:args [[-60,0,"blue"],[0,0,"black"],[60,0,"red"],[-30,-30,"yellow"],[30,-30,"green"]]#定义一个…...

【机器学习】机器学习在深度学习领域中的作用:半监督学习的视角
👀时空之门👀 🔍引言🎈半监督学习概述🚝机器学习在深度学习领域中的作用☘特征提取与表示学习🍀复杂任务建模❀结合半监督学习提升性能 🚀半监督学习在深度学习中的应用场景📕图像识…...

C#WPF数字大屏项目实战01--开发环境与项目创建
1、学习目标 -界面布局 ,- 模板调整,- 控件封装,- 图表,- 通信对接,- 动态更新 2、开发环境 开发工具:Visual Studio-2022-17.8.6-Community 运行时框架:.Net 6或Framework 4.5以上 UI框…...

python中字符串的各类方法
大小写转换方法 upper() 用于将字符串中的小写字母转为大写字母。 abcd.upper() # ABCD aBcD.upper() # ABCD lower() 用于将字符串中的大写字母转为小写字母。 ABCD.lower() # abcd aBcD.lower() # abcd capitalize() 用于将字符串的第一个字母变成大写࿰…...

DataGrip 数据库连接客户端
I DataGrip 安装 1.1安装 打开dmg镜像,将“DataGrip.app”拖入应用程序中; 1.2 Act 打开应用程序,点击试用模式启动软件,然后将“jetbrains-agent-latest”拖到任意位置,然后拖入,弹出对话框,点击“Rest…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...