首页 理论教育 STM系列:软件触发中断

STM系列:软件触发中断

时间:2023-11-23 理论教育 版权反馈
【摘要】:软件中断指通过编程触发的中断,包括手工产生的普通中断,能以多种方式产生。①使用中断挂起寄存器ISPR;②使用软件触发中断寄存器STIR;③SVC命令方式。STIR:软件触发中断寄存器,向此寄存器写入中断号,使该中断号呈挂起状态,在符合条件的情况下执行该中断,见表6.8。表6.8软件触发中断寄存器SVC指令称为系统服务调用,用于产生一个SVC异常。图6.20使用PendSV控制上下文切换③当CPU退出SVC后,它立即进入PendSV,从而执行上下文切换。

STM系列:软件触发中断

软件中断指通过编程触发的中断,包括手工产生的普通中断,能以多种方式产生。

①使用中断挂起寄存器ISPR;

②使用软件触发中断寄存器STIR;

③SVC命令方式。

ISPR对应了ARM的SETPEND寄存器,将某位写1表示悬起对应的中断源,触发了对应的中断。

例如:NVIC->ISPR[0]|=1<<7表示外中断7即EXTI Line 1中断悬起;NVIC->ISPR[1]|=1<<5表示外中断37,即USART1中断悬起。

STIR:软件触发中断寄存器,向此寄存器写入中断号,使该中断号呈挂起状态,在符合条件的情况下执行该中断,见表6.8。STIR修改的效果也通过影响ISPR体现,二者功能相同。

表6.8 软件触发中断寄存器(0xE000EF00)

SVC(Supervisor Call)指令称为系统服务调用,用于产生一个SVC异常。它是用户模式代码中的主进程,用于创造对特权操作系统代码的调用。SVC是用于呼叫操作系统所提供API的正道。用户程序只需知道传递给操作系统的参数,而不必知道各API函数的地址

SVC指令带一个8位的立即数,可以视为是它的参数,被封装在指令自身,如:SVC 3;呼叫3号系统服务。

SVC用于产生系统函数的调用请求。例如,操作系统不让用户程序直接访问硬件,而是通过提供一些系统服务函数,用户程序使用SVC发出对系统服务函数的呼叫请求,以这种方法调用它们来间接访问硬件。因此,当用户程序想要控制特定的硬件时,它就会产生一个SVC异常,然后操作系统提供的SVC异常服务例程得到执行,它再调用相关的操作系统函数,后者完成用户程序请求的服务。

SVC常和另一个相关的异常PendSV(可悬起的系统调用)协同使用。一方面,SVC异常是必须立即得到响应的,应用程序执行SVC时都是希望所需的请求立即得到响应;另一方面,PendSV则不同,它是可以像普通的中断一样被悬起的。OS可以利用它“缓期执行”一个异常,直到其他重要的任务完成后才执行动作。悬起PendSV的方法是:手工往NVIC的PendSV悬起寄存器中写1。悬起后,如果优先级不够高,则将缓期等待执行。

PendSV的典型使用场合是在上下文切换时(在不同任务之间切换)。例如,一个系统中有两个就绪的任务,上下文切换被触发的场合可以是:

①执行一个SVC系统调用;

②系统滴答定时器(SYSTICK)中断,实现轮转调度。

以一个简单的例子来辅助理解:假设有一个系统,里面有两个就绪的任务,并且通过SysTick异常启动上下文切换,如图6.18所示。

图6.18 两个任务间通过SysTick进行轮转调度的简单模式(www.xing528.com)

图6.18是两个任务轮转调度的示意图。但若在产生SysTick异常时正在响应一个中断,则SysTick异常会抢占其ISR。在这种情况下,OS不得执行上下文切换,否则将使中断请求被延迟,而且在真实系统中延迟时间还往往不可预知,影响系统的实时性。如果OS在某中断活跃时尝试切入线程模式,将触发用法fault异常,如图6.19所示。

图6.19 发生IRQ时上下文切换的问题

为解决此问题,早期的OS大多会检测当前是否有中断在活跃中,只有在无任何中断需要响应时,才执行上下文切换(切换期间无法响应中断)。然而,这种方法的弊端在于,它可以把任务切换动作拖延很久(因为如果抢占了IRQ,则本次SysTick在执行后不得作上下文切换,只能等待下一次SysTick异常),尤其是当某中断源的频率和SysTick异常的频率比较接近时,会发生“共振”,使上下文切换迟迟不能进行。

CM3通过PendSV来解决这个问题。PendSV异常会自动延迟上下文切换的请求,直到其他的ISR都完成了处理后才放行。为实现这个机制,需要把PendSV编程为最低优先级的异常。如果OS检测到某IRQ正在活动并且被SysTick抢占,它将悬起一个PendSV异常,以便“缓期执行”上下文切换,如图6.20所示。

在图6.20中,由PendSV充当SysTick完成上下文切换,具体过程如下:

①任务A呼叫SVC来请求任务切换(例如,等待某些工作完成)。

②OS接收到请求,做好上下文切换的准备,并且悬起一个PendSV异常。

图6.20 使用PendSV控制上下文切换

③当CPU退出SVC后,它立即进入PendSV,从而执行上下文切换。

④当PendSV执行完毕后,将返回到任务B,同时进入线程模式。

⑤发生了一个中断,并且中断服务程序开始执行。

⑥在ISR执行过程中,发生SysTick异常,并且抢占该ISR。

⑦OS执行必要的操作,然后悬起PendSV异常以做好上下文切换的准备。

⑧当SysTick退出后,回到先前被抢占的ISR中,ISR继续执行。

⑨ISR执行完毕并退出后,PendSV服务例程开始执行,并且在该执行过程中执行上下文切换。

⑩当PendSV执行完毕后,回到任务A,同时系统再次进入线程模式。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈