关于PendSV异常和SVC异常

本文详细介绍了STM32微控制器中的异常和中断机制,包括PendSV、SVC等核心概念及其工作原理,以及如何利用PendSV特性实现任务切换延迟。文章深入探讨了异常处理与中断管理在嵌入式系统中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里先说什么是异常,什么是中断?请下这张图

颜色加深的表项为异常,这些属于cm3内核自带的。其中-3,-2,-1异常的优先级固定,是不可更改的,其余的异常中断优先级可以设置。

颜色未加深的表项为中断,这些属于stm32带出的。优先级 可设置。表格最前面的数字用来记录是第几个中断。

PendSv:可悬挂异常。如果当前没有更高优先级的异常或者中断需要执行,那么就执行pendsv的异常服务函数。 可以看出它有个特点,就是 缓期执行。cpu先执行比它高的服务函数,然后在执行它,

OS 可以利用它“缓期执行”一个异常——直到其它重要的任务完成后才执行动 作。悬起 PendSV 的方法是:手工往 NVIC的 PendSV悬起寄存器中写 1。悬起后,如果优先级不够 高,则将缓期等待执行。

FreeRTOS就是利用了这个特性,来显示 任务切换的。请看下面systick异常中断服务函数的内容

void xPortSysTickHandler( void )
{
	vPortRaiseBASEPRI();
	{
		/* Increment the RTOS tick. */
		if( xTaskIncrementTick() != pdFALSE )
		{
			/* A context switch is required.  Context switching is performed in
			the PendSV interrupt.  Pend the PendSV interrupt. */
			portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
		}
	}
	vPortClearBASEPRIFromISR();
}

vPortRaiseBASEPRI();设置basepri寄存器,开启中断屏蔽作用,这里是大于等于5的优先级异常和中断都将被屏蔽。

portNVIC_INT_CTRL_REG=portNVIC_PENDSVSET_BIT就是悬起PendSv。

然后清除中断屏蔽 中断位,退出systick服务函数。

FreeRTOS为什么要这样延后切换, 而不是直接进行任务切换呢?因为任务切换的时间 开销较大,这样会导致其他中断迟迟不能执行。

 

SVC:系统服务异常。用户级想操作一些特权级的操作,是不可行的。假如修改底层寄存器的值是特权级操作,用户想修改底层的寄存器怎么办呢?方法就是用这个SVC 异常。OS会提供一些系统服务函数,用户调用这些服务函数,OS会发出SVC异常,从而进入异常服务函数里面, 再调用相关函数对寄存器进行 修改。如下图。

更多具体内容可以看这篇文章http://blog.sina.com.cn/s/blog_13e68b0390102xgrh.html

 

 

<think>好的,我现在需要帮助用户理解Cortex-M中的PendSV_HandlerSVC_Handler中断的作用。首先,我得回忆一下自己对这些概念的理解。根据用户提供的引用内容,PendSVSVC都是软件触发的中断,属于内中断。SVC通常用于系统调用,比如当用户程序需要请求操作系统服务时,通过执行SVC指令触发。而PendSV则用于挂起延迟的操作,比如任务切换,尤其是在实时操作系统中。 接下来,我应该整理这些信息,确保符合用户的要求。用户希望知道这两个中断的具体机制用途,所以需要分点说明。首先,SVC_Handler,也就是系统调用中断。根据引用[1][2],SVC是通过执行SVC指令触发的,这在ARM架构中常见的是SWI指令。它的主要用途是让用户模式下的程序请求特权模式下的服务,比如访问硬件资源或操作系统功能。例如,当应用程序需要执行一个文件操作时,可能会通过SVC指令触发一个中断,让操作系统内核处理请求。引用[3]中也提到SVC异常任务切换有关联,可能是在任务切换时使用。 然后是PendSV_Handler,即可挂起的系统调用。引用[1][2]都提到PendSV需要手动将悬起寄存器置1来触发中断。它的设计目的是延迟处理某些操作,直到没有更高优先级的中断需要处理。这在实时操作系统(如uC/OS)中非常有用,特别是在任务切换时。任务切换通常不能在普通的中断服务例程(ISR)中直接执行,因为可能打断重要的中断处理。通过将PendSV的优先级设为最低,可以确保所有高优先级中断处理完毕后再进行任务切换,从而保证系统的实时性。引用[3][4]也提到了PendSV在任务切换中的应用,以及通过ICSR寄存器控制PendSV的悬起状态。 用户还提到了uC/OS的任务切换时机实时性实现。结合引用[3],任务切换可能发生在系统调用或PendSV触发时。Systick定时器可能用于生成周期性的中断,触发任务切换,而实际切换操作可能委托给PendSV,以确保在合适的时间执行。此外,设置SystickPendSV的优先级也很关键,通常Systick的优先级较高,以准时触发,而PendSV的优先级较低,避免影响其他关键中断。 接下来,我需要确保回答的结构清晰,分点说明两者的机制用途,并引用相关的资料。同时,按照用户的要求,生成相关问题。问题可能需要涉及两者的区别、在RTOS中的应用、优先级设置以及触发方式等。 最后,检查LaTeX格式是否正确,所有行内公式用$...$,独立公式用$$...$$。不过当前内容似乎不涉及数学公式,可能不需要使用。但如果有变量或寄存器名称,可能需要用行内格式,比如$ICSR$。但根据引用内容,用户提供的资料中没有数学表达式,所以可能不需要处理这点,但需注意其他部分的格式是否符合要求。</think>### Cortex-M PendSV_Handler与SVC_Handler机制及用途解析 #### 1. **SVC_Handler(系统调用中断)** - **触发方式**:通过执行`SVC`指令触发(ARM中对应`SWI`指令)[^1][^2]。 - **核心用途**:实现**系统调用**(用户模式到特权模式的切换)。例如,应用程序通过`SVC`请求操作系统服务(如文件操作、硬件访问)[^2]。 - **机制特点**: - 立即响应:触发后立即进入中断服务程序。 - 优先级可配置:通常设为较高优先级,确保系统服务及时响应[^3]。 #### 2. **PendSV_Handler(可挂起系统调用中断)** - **触发方式**:通过向`NVIC`的`PendSV悬起寄存器`写1手动触发[^4]。 - **核心用途**:延迟处理**任务切换**或复杂操作,确保实时性。常用于实时操作系统(如uC/OS)中: - 在`Systick`中断中挂起PendSV,待高优先级中断完成后执行任务切换。 - 优先级设为最低,避免打断关键中断。 - **机制特点**: - 异步挂起:触发后不会立即响应,等待无更高优先级中断时执行。 - 通过`ICSR`寄存器控制悬起状态。 #### 3. **关键区别与协作** | 特性 | SVC_Handler | PendSV_Handler | |---------------------|---------------------------------|---------------------------------| | **触发方式** | 执行`SVC`指令 | 写悬起寄存器 | | **响应时机** | 立即 | 延迟(挂起后空闲时处理) | | **典型应用** | 系统服务调用 | 任务切换、非紧急操作 | | **优先级配置** | 较高 | 最低 | #### 4. **在uC/OS中的实现** - **任务切换时机**:由`Systick`中断触发时间片轮转,但实际切换操作委托给`PendSV`。 - **实时性保障**: - `Systick`高优先级:确保定时准确。 - `PendSV`低优先级:避免切换操作阻塞其他中断[^4]。 ```c // 示例:手动触发PendSV NVIC_INT_CTRL = NVIC_PENDSVSET; // 写悬起寄存器 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值