基于STM32结合CubeMX学习Free-RT-OS的源码之两类中断解析

news2024/9/21 2:50:15

目录

认识

 常见的中断应用场景

进入与退出临界区(开中断与关中断)

Free RTOS的systick中断 和 PendSV中断。

Cortex-M3/4的工作模式以及双堆栈指针MSP和PSP(CPU与OS的相辅相成与互相成就)

为什么要引入这两种工作状态?

为什么区分出MSP与PSP?


认识

        Free RT OS提供了OS级别的API(比如信号量,队列,互斥量等等),有些以FromISR为后缀的API能够在中断中使用,那么他们到底是适用于所有的中断?还是仅仅只是在一些中断中可以适用?

        我们知道在裸机开发中,中断是可以抢占的,这种抢占也就是中断嵌套。Free RT OS里也遵循这个规则。Free-RT-OS里的中断可以人为的去设置其优先级。( Free-RT-OS里有任务的优先级,优先级设置地越大则优先级越高),而Free RT OS里的中断与裸机一样,设置的数字越小则优先级越高,以前我习惯性地把裸机开发的那些中断(比如硬件定时器,串口,DMA,系统滴答定时器产生的中断等这些中断)称为硬件中断。裸机开发中不一定需要滴答定时器去计时。而RTOS则一定需要一个定时器去计时 ,构成系统的心跳。在Free RTOS中最低优先级的中断也可以打断最高优先级的任务。

而Free RT OS把这些"硬件中断"又分为两类。 以一个临界值  configMAX_PRIORITES

 划分为更高优先级的中断,和在它之下的中断。 如下图

 大于这个临界值(越大优先级越低)则可以适用Free RTOS的API(也就是下图中的B类中断)

小于这个临界值(越小优先级越高) 则不允许适用于Free  RTOS的API,也就是下图中的A类中断。

一旦在A类中断(更高优先级的中断)中使用Free RTOS的API则导致死循环。)

 在以ISR为后缀的API中通常带有校验机制(判断此时中断的优先级是否有效。) 

为什么Free RTOS禁止更高优先级的中断中使用Free RTOS的API?

中断从设计之出是为了解决及时性情况而创造出来的,作为一个开源免费的操作系统,它不希望承担任何责任,比如汽车的临时刹车中断,Free RTOS说明请用户在更高优先级的中断中使用自己的代码,而不是它的api。

 而B类中断,则可以使用Free RTOS的API。  而B类中断包括systick的中断,PendSV中断,定时器溢出中断,串口中断等等。

 常见的中断应用场景

进入与退出临界区(开中断与关中断)

taskENTER_CRITICAL() 进入临界区。

taskEXIT_CRITICAL();  退出临界区。

他们对应宏

 

这里的开关中断只是禁止CPU去响应中断,因为中断标记位并没有清除,待开启中断后会立刻响应之前的中断并把标记位清零。

Free RTOS的systick中断 和 PendSV中断。

准确的说是systick中断做任务调度。PendSV进行任务上下文的切换。

Free RTOS默认以systick作为系统时基

void xPortSysTickHandler( void )
{
uint32_t ulPreviousMask;

	ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR();
	{
		/* Increment the RTOS tick. */
		if( xTaskIncrementTick() != pdFALSE )
		{
			/* Pend a context switch. */
			*(portNVIC_INT_CTRL) = portNVIC_PENDSVSET;
		}
	}
	portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask );
}

最终调用    xTaskIncrementTick()

在解除阻塞链表的阻塞任务时,通过xNextTaskUnblockTime  (当前阻塞链表最有可能第一个解除阻塞的时间)来减少判断次数。

在当前时间<xNextTaskUnblockTime  时不做阻塞任务的唤醒。

否则执行:

判断是否有任务在阻塞链表中阻塞,若有则取出阻塞链表的第一个任务也是第一个会解决阻塞的任务(阻塞链表按阻塞时间升序排列),若是则判断当前是否能解除阻塞,若不能则从阻塞链表中更新xNextTaskUnblockTime。 若能解除阻塞,能加入到它所在优先级的就绪链表中。  

在判断是否需要唤醒阻塞任务后,判断当前任务优先级的就绪链表中是否有与当前优先级一样的任务,若是,则在配置为可抢占和时间片轮转成立的同时执行相同时间片轮转算法。

PendSV (切换任务,且有中断触发则延期执行)

PendSV(可悬起的系统调用),它是一种CPU系统级别的异常,它可以像普通外设中断一样被悬起,而不会像SVC服务那样,因为没有及时响应处理,而触发Fault。

为什么需要PendSV缓期执行?

引用

SVC(系统服务调用)和PendSV(可悬起系统调用)_宁静以致墨的博客-CSDN博客_svc和pendsv

根据 权威指南。PendSV是为系统设备而设的“可悬挂请求”(pendable request)。

上下文切换 不能在中断中进行,会导致中断延期。为了解决这个问题,使用 PendSV。PendSV可以挂起,也就是等到别的 ISR结束后缓期执行。
为了实现缓期执行PendSV,PendSV一定要被设置为最低优先级的异常。
=

众所周知,在C/C++值可直接嵌入汇编代码。

 PendSV(功能:将当前任务(寄存器的值)入任务栈,把新任务的任务栈的值取出装载进寄存器)

见代码: 

__asm void xPortPendSVHandler( void )
{
	extern vTaskSwitchContext
	extern pxCurrentTCB

	PRESERVE8

	mrs r0, psp

	ldr	r3, =pxCurrentTCB 	/* Get the location of the current TCB. */
	ldr	r2, [r3]

	subs r0, #32			/* Make space for the remaining low registers. */
	str r0, [r2]			/* Save the new top of stack. */
	stmia r0!, {r4-r7}		/* Store the low registers that are not saved automatically. */
	mov r4, r8				/* Store the high registers. */
	mov r5, r9
	mov r6, r10
	mov r7, r11
	stmia r0!, {r4-r7}

	push {r3, r14}
	cpsid i
	bl vTaskSwitchContext
	cpsie i
	pop {r2, r3}			/* lr goes in r3. r2 now holds tcb pointer. */

	ldr r1, [r2]
	ldr r0, [r1]			/* The first item in pxCurrentTCB is the task top of stack. */
	adds r0, #16			/* Move to the high registers. */
	ldmia r0!, {r4-r7}		/* Pop the high registers. */
	mov r8, r4
	mov r9, r5
	mov r10, r6
	mov r11, r7

	msr psp, r0				/* Remember the new top of stack for the task. */

	subs r0, #32			/* Go back for the low registers that are not automatically restored. */
	ldmia r0!, {r4-r7}      /* Pop low registers.  */

	bx r3
	ALIGN
}

Cortex-M3/4的工作模式以及双堆栈指针MSP和PSP(CPU与OS的相辅相成与互相成就)

我们听说过SP。在平时的裸机开发中SP就是MSP,而PSP则是为了OS而产生的。

SP:Stack Pointer,堆栈指针,也是通用寄存器,用于入栈和出栈操作。在任何情况下,SP只会指向MSP与PSP其中一种。所以SP属于逻辑指针。

来着Cortex-M3权威指南 

它们都在寄存器R13,于是干脆用SP去引用R13,

PSP与MSP对应CPU的两种特权分级(对应CPU的两种工作模式)

用户态 (目态)  只能使用PSP指针 (不给程序员操作OS的机会)

系统态(管理态,管态) PSP与MSP都能使用。当发生异常或中断时一定使用MSP,裸机程序开发则一直使用MSP。

为什么要引入这两种工作状态?

引入这两个工作状态的原因是:为了避免用户程序错误地使用特权指令,保护操作系统不被用户程序破坏。具体规定为,当CPU处于用户态时,不允许执行特权指令;当CPU处于系统态时,可执行包括特权指令在内的一切机器指令。

为什么区分出MSP与PSP?

为了安全,裸机开发则完全对寄存器开发,属于CPU的内核工作模式。而OS的多线程(任务)则有其自己的任务栈,这样CPU的两种工作模式都使用不同的堆栈,它们的堆栈分离更加安全。

 

PSP的堆栈用用户在创建任务(线程)时划分。而MSP的堆栈则在启动文件中划分。

 

关于PSP与MSP的切换

若CPU工作在用户态,则使用的是PSP堆栈指针,SP此时为PSP。中断或异常发生后,中断或异常必定打断用户任务(最低优先级的中断也会打断最高优先级的任务),CPU切换为系统态,PSP管理用户任务程序进栈(由寄存器进栈), 此时PSP切换为MSP,管理中断或异常处理程序的出栈。(由栈取出到寄存器)

区分SP此时为PSP还是MSP,取决于CPU的工作状态(系统态还是用户态)。总的规律:中断异常处理程序必定使用MSP.用户任务程序只能使用PSP。

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

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

相关文章

Debian Linux 的安装

Debian Linux 的安装 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;Debian Linux 的安装 CSDN&#xff1a;Debian Linux 的安装 说明 本安装说明是基于 Windows 10 下 VMware workstation 16 安装 Linux&#xff0c;Linux 版本是 Debian 11&#xff0c;需…

K8s集群环境搭建

K8s集群环境搭建 修改hosts文件 [rootmaster ~]# vim /etc/hosts [rootmaster ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.…

TCO点击试剂(4E)-TCO-PEG4-amine, 2243569-24-4,反式环辛烯-四聚乙二醇-氨基

【产品描述】 (4E)-反式环辛烯-四聚乙二醇-氨基&#xff0c;胺与活性NHS酯或在活化剂suh&#xff08;如EDC&#xff09;存在下与羧酸非常反应&#xff0c;TCO部分使四嗪分子实现快速点击化学。亲水性PEG间隔臂提高了水溶性&#xff0c;并提供了一个长而灵活的连接。西安凯新生物…

软件测试的几种模型

1.V模型 在软件测试方面&#xff0c;V模型是最广为人知的模型。如图&#xff0c;V模型从左到右描述了开发过程和测试行为。V模型的价值在于它非常明确的表明了测试过程中存在的不同级别&#xff0c;并且清楚的描述了这些测试阶段和开发过程各阶段的对应关系。缺点&#xff1a;把…

Selenium基础 — POM设计模式(一)

&#xff08;一&#xff09;POM模式介绍 1、什么是POM&#xff1f; POM是Page Object Model页面对象模型的简称。 POM是为Web UI元素创建Object Repository的设计模式 。 在这个模型下&#xff0c;对于应用程序中的每个网页&#xff0c;应该有相应的页面类。 此Page类将会找到…

ES新特性与TypeScript、JS性能优化

一、ECMAScript 新特性 1、作用域 1、全局作用域 2、函数作用域 3、块级作用域2、var、let和const的区别 1、let和var用来声明变量&#xff0c;const用来声明常量&#xff08;变量就是赋值后可以改变它的值&#xff0c;常量就是赋值后就不能改变它的值&#xff09; 2、const…

Unity 资源热更新

热更新流程 启动游戏根据当前版本号&#xff0c;和平台号去版本服务器上检查是否有热更从热更服务器上下载md5文件&#xff0c;比对需要热更的具体文件列表从热更服务器上下载需要热更的资源&#xff0c;解压到热更资源目录游戏运行加载资源&#xff0c;优先到热更目录中加载&…

windows下载redis、windows安装redis、windows启动redis

一、下载并解压 下载网址&#xff1a;https://github.com/tporadowski/redis/releases 下载后解压并重命名文件夹为redis 二、打开redis文件夹 找到redis.windows.conf配置文件&#xff0c;作如下修改 protected-mode no // 将yes改为no 部分配置信息说明 bind 127.0.…

Ubuntu服务器下安装FastDFS及nginx配置访问等问题记录

Ubuntu服务器下安装FastDFS及nginx配置访问下载对应包编译环境包解压环境配置配置nginx模块和安装nginx来进行访问该图片下载对应包 下载方式一&#xff1a;直接使用 wget 下载&#xff0c;如果太慢&#xff0c;可以去github下载&#xff0c;然后上传到服务器上即可。 wget -…

Mybatis三大执行器介绍

Mybatis三大执行器介绍Mybatis相关全览一、执行器介绍执行器的选择入口设置执行器两种方式全局配置&#xff08;不建议&#xff09;局部设置&#xff08;建议&#xff09;二、三个执行器区别SimpleExecutorReuseExecutorBatchExecutor总结三、效率测试四、平时开发使用本文用的…

老机器摇身一变成局域网下低配服务器,并稳定访问GitHub

老机器摇身一变成局域网下低配服务器&#xff0c;并稳定访问GitHub 搭建场景&#xff1a; 问题背景&#xff1a; 最近用腾讯云服务器访问GitHub经常挂&#xff0c;试了很多解决方案如换host文件ip等办法提速效果都不明显。后来想通过腾讯云服务器实现kexueshangwang&#xff0…

wechaty-puppet-whatsapp的uos协议使用中常见问题

常见问题 常见问题解决基本方案 先检查node版本是否大于16确认npm已经配置好淘宝源存在package-lock.json文件先删除删除node_modules后重新执行npm install 或cnpm install配置文件是否按照要求设置本地网络是否存在限制&#xff0c;是否开启了代理服务本地防火墙是否关闭 我…

智能微型断路器的功能有哪些?和网关搭配的作用在哪?

安科瑞 华楠 ASCB1 系列智能微型断路器是安科瑞电气股份有限公司 全新推出的智慧用电产品&#xff0c;产品由智能微型断路器与智 能网关两部分组成&#xff0c;可用于对用电线路的关键电气因 素&#xff0c;如电压、电流、功率、温度、漏电、能耗等进行实 时监测&#xff0c;具…

[附源码]java毕业设计剧本杀门店管理系统-

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

三种常规用的矢量网络分析仪系统误差校准方法

我们在使用矢量网络分析仪是会发现测量出来的数据有误差&#xff0c;要想矫正&#xff0c;首先我我们要知道矢量网络分析仪的误差来源有哪些?主要有以下三个方面&#xff1a;漂移误差、随机误差、系统误差 1、漂移误差&#xff1a;是由于进行校准之后仪器或测试系统性能发生变…

网络基础--笔记

文章目录一、网络基础1.1 二层交换网络1.1.1 HUB1.1.2 Switch1.1. 3 ARP协议1.1. 4 VLAN IEEE802.1Q协议1.1. 5 链路接口类型1.1. 6 链路聚合模式1.1. 7 链路聚合的类型1.1. 8 STP 生成树协议 &#xff08;Spanning Tree protocol&#xff09; IEEE 802.1D1.2 三层路由网络1.2.…

HDLC协议的特点及功能,让你一看就会

一 HDLC概述 1.1 HDLC的发展历史 高级数据链路控制(High-Level Data Link Control或简称HDLC)&#xff0c;是一个在同步网上传输数据、面向比特的数据链路层协议&#xff0c;它是由国际标准化组织(ISO)根据IBM公司的SDLC(SynchronousData Link Control)协议扩展开发而成的.其最…

[附源码]Python计算机毕业设计《数据库系统原理》在线学习平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

2.1 Vision-Language Pre-Training for Multimodal Aspect-Based Sentiment Analysis

Vision-Language Pre-Training for Multimodal Aspect-Based Sentiment Analysis 1、基本信息 作者&#xff1a;Yan Ling, Jianfei Yu, Rui Xia 会议&#xff1a;ACL 2022 单位&#xff1a;南京理工大学 2、主要框架 任务&#xff1a;Multimodal Aspect-Based Sentiment …

FITC-PEG-N3,Fluorescein-PEG-Azide,荧光素-聚乙二醇-叠氮可用于点击化学

1、名称 英文&#xff1a;Fluorescein-PEG-Azide&#xff0c;FITC-PEG-N3 中文&#xff1a;荧光素-聚乙二醇-叠氮 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Azide PEG Fluorescent PEG 4、分子量&#xff1a;可定制&#xff0c;荧光素-peg 20000-叠氮/Fluoresce…