返回首页

cortex-M3 的SVC、PendSV异常与RTOS

时间:2018-11-24 21:37来源:知行网www.zhixing123.cn 编辑:麦田守望者

SVC和PendSV

SVC(系统服务调用,亦简称系统调用)和PendSV(可悬起系统调用),它们多用于在操作系统之上的软件开发中。

SVC:

SVC 用于产生系统函数的调用请求。

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

这种“提出要求——得到满足”的方式,很好、很强大、很方便、很灵活、很能可持续发展。

首先,它使用户程序从控制硬件的繁文缛节中解脱出来,而是由操作系统 负责控制具体的硬件。

第二,操作系统的代码可以经过充分的测试,从而能使系统更加健壮和可靠。

第三,它使用户程序无需在特权级下执行,用户程序无需承担因误操作而瘫痪整个系统的风险。

第四,通过SVC 的机制,还让用户程序变得与硬件无关,因此在开发应用程序时无需了解硬件的操作细节,从而简化了开发的难度和繁琐度,并且使应用程序跨硬件平台移植成为可能。开发应用程序唯一需要知道的就是操作系统提供的应用编程接口(API),并且了解各个请求代号和参数表,然后就可以使用SVC 来提出要求了(事实上,为使用方便,操作系统往往会提供一层封皮,以使系统调用的形式看起来和普通的函数调用一致。各封皮函数会正确使用SVC指令来执行系统调用——译者注)。

其实,严格地讲,操作硬件的工作是由设备驱动程序完成的,只是对应用程序来说,它们也是操作系统的一部分。如图7.14 所示(点击图片可看大图)

svc

SVC 异常通过执行”SVC”指令来产生。该指令需要一个立即数,充当系统调用代号。SVC异常服务例程稍后会提取出此代号,从而解释本次调用的具体要求,再调用相应的服务函数。例如,


SVC 0x3 ; 调用3 号系统服务

在SVC 服务例程执行后,上次执行的SVC 指令地址可以根据自动入栈的返回地址计算出。找到了SVC 指令后,就可以读取该SVC 指令的机器码,从机器码中萃取出立即数,就获知了请求执行的功能代号。如果用户程序使用的是PSP,服务例程还需要先执行


MRS Rn,PSP

指令来获取应用程序的堆栈指针。通过分析LR 的值,可以获知在SVC 指令执行时,正在使用哪个堆栈。
由CM3 的中断优先级模型可知,你不能在SVC 服务例程中嵌套使用SVC 指令(事实上这样做也没意义),因为同优先级的异常不能抢占自身。这种作法会产生一个用法fault。同理,在NMI 服务例程中也不得使用SVC,否则将触发硬fault。

PendSV:

另一个相关的异常是PendSV(可悬起的系统调用),它和SVC 协同使用。 一方面,SVC异常是必须立即得到响应的(若因优先级不比当前正处理的高,或是其它原因使之无法立即响应,将上访成硬fault——译者注),应用程序执行SVC 时都是希望所需的请求立即得到响应。 另一方面,PendSV 则不同,它是可以像普通的中断一样被抢占挂起的(不像SVC 那样会上访)。 操作系统 可以利用它“缓期执行”一个异常——直到其它重要的任务完成后才执行动作。

PendSV是什么?

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

  • 上下文切换 不能在中断中进行,会导致中断延期。为了解决这个问题,使用 PendSV。PendSV可以挂起,也就是等到别的 ISR结束后缓期执行。
  • 为了实现缓期执行PendSV,PendSV一定要被设置为最低优先级的异常。
  • 挂起PendSV 的方法是:软件实现OSIntCtxSw()函数,向NVIC 的PendSV 悬起寄存器中写1。

    
    NVIC_INT_CTRL EQU 0xE000ED04 ; Interrupt control state register.
    NVIC_PENDSVSET EQU 0x10000000 ; Value to trigger PendSV exception.
    OSIntCtxSw
    LDR R0, =NVIC_INT_CTRL ; Trigger the PendSV exception (causes context switch)
    LDR R1, =NVIC_PENDSVSET
    STR R1, [R0]
    BX LR
    
    

    挂起后,如果优先级不够高,则将缓期等待执行。

    PendSV 的典型使用场合是在上下文切换时(在不同任务之间切换)。

    操作系统,上下文切换 实例:

    场景假设:一个系统(按时间片轮转调度的系统)中有两个就绪的任务(A任务、B任务),
    上下文切换被触发的场合可以是:

  • 执行一个系统调用
  • 系统滴答定时器(SYSTICK)中断,(轮转调度中需要)
  • A、B两个就绪任务,通过SysTick 异常启动上下文切换。如图7.15 所示。(点击图片可看大图)

    systick

    上图是两个任务轮转调度的示意图。 但若在产生SysTick 异常时正在响应一个中断,则SysTick 异常会抢占其ISR。
    在这种情况下,操作系统 不可以执行上下文切换,否则将使中断请求被延迟, 而且在真实系统中延迟时间还往往不可预知——任何有一丁点实时要求的系统都决不能容忍这种事。 因此,在CM3 中也是严禁没商量——如果操作系统 在某中断活跃时尝试切入线程模式,将触犯用法fault 异常。(点击图片可看大图)

    irq

    为解决此问题,早期的操作系统 大多会在SysTick 异常中 检测当前是否有中断在活跃中,只有没有任何中断需要响应时,才执行上下文切换(切换期间无法响应中断)。

    然而,这种方法的弊端在于, 它可能把任务切换动作拖延很久(因为如果抢占了IRQ,则本次SysTick 在执行后不得作上下文切换,只能等待下一次SysTick 异常),尤其是当某中断源的频率和SysTick 异常的频率比较接近时,会发生“共振”。 现在好了,PendSV 来完美解决这个问题了(产生SysTick 异常时正在响应一个中断,SysTick 异常会抢占其ISR。此时,操作系统 不可以执行上下文切换,否则将使中断请求被延迟):

    把PendSV 编程为最低优先级的异常,PendSV 异常会自动延迟上下文切换的请求,直到其它的ISR 都完成了处理后才放行。 如果操作系统 检测到某IRQ 正在活动并且被SysTick 抢占,它将悬起一个PendSV 异常,以便缓期执行上下文切换。如图7.17 所示(点击图片可看大图)

    pendsv

    流水账记录如下:

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

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

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

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

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

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

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

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

    9. ISR 执行完毕并退出后,PendSV 服务例程开始执行,并且在里面执行上下文切换

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

    ------分隔线----------------------------
    标签(Tag):电脑知识 电脑教程
    ------分隔线----------------------------
    推荐内容
  • 一图看懂开源许可协议:GPL、BSD、MIT、Mozilla、Ap

    以下是上述协议的简单介绍( 单击图片可看大图 ): BSD开源协议 BSD开源协议是一个给...

  • 程序员必备的5款软件简介

    我不是一个程序员,没有码农的那种才华,但是经常也会折腾网站,有的时候可以说的为了...

  • 几个用于诊断HTTP响应时间情况的小工具

    如果有人说你的 HTTP 接口响应慢,那可能是他的电脑慢,也可能是网络本身慢,还可能是...

  • 什么是EV 代码签名证书?

    什么是EV 代码签名证书? EV代码签名证书是指扩展验证代码签名证书,具有标准代码签名...

  • 知行网告诉你 机器学习最流行的语言是……?

    应该掌握哪门编程语言,才能获得机器学习或数据科学的工作机会呢?这是一个银弹的问题...

  • 从一个范例看XML的应用详解教程

    如果你已经看了Asp.Net Ajax的两种基本开发模式 这篇文章,你可能很快会发现这样一个...

  • 猜你感兴趣
  • 教育技术学动态
  • 教育技术学论文
  • 理论研究
  • 应用研究
  • 资源收藏
  • 百家观点
  • 英文文献
  • 中国电化教育
  • 电化教育研究
  • 中国远程教育
  • 开放教育研究
  • 现代教育技术
  • 远程教育杂志
  • 现代远距离教育
  • 中国教育信息化
  • 中国信息技术教育
  • 中小学信息技术
  • Flash龙8国际平台入口
  • Photoshop龙8国际平台入口
  • 3DMAX龙8国际平台入口
  • AutoCAD龙8国际平台入口
  • CorelDRAW龙8国际平台入口
  • Matlab龙8国际平台入口
  • 其他龙8国际平台入口
  • .Net龙8国际平台入口
  • Asp龙8国际平台入口
  • Php龙8国际平台入口
  • Jsp龙8国际平台入口
  • Ajax龙8国际平台入口
  • Android教程
  • 其他龙8国际平台入口
  • Word教程
  • Excel教程
  • PowerPoint教程
  • Ubuntu教程
  • 其他教程
  • 课件下载
  • 软件下载
  • 视频教程下载
  • 其他下载
  • 教案大全
  • 试题大全
  • 课件大全
  • 其他大全
  • 人像摄影
  • 风光摄影