系统滴答定时器(SYSTICK)

一、SysTick定时器
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常。他的作用是为各个不同任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期 的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时 器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问 它的寄存器,以维持操作系统“心跳”的节律。
SysTick系统定时器中有4个寄存器,分别是:
CTRL——SysTick控制及状态寄存器
LOAD——SysTick重装载数值寄存器
VAL——SysTick当前数值寄存器
CALIB——SysTick校准数值寄存器
在使用SysTick产生定时的时候,只需要配置前3个寄存器,最后一个校准寄存器不需要使用。
二、SVC和PendSV
SVC(系统服务调用,亦简称系统调用)和 PendSV(可悬起系统调用),它们多用于在 操作系统之上的软件开发中。SVC 用于产生系统函数的调用请求。例如,操作系统不让用户 程序直接访问硬件,而是通过提供一些系统服务函数,用户程序使用 SVC 发出对系统服务函 数的呼叫请求,以这种方法调用它们来间接访问硬件。因此,当用户程序想要控制特定的硬 件时,它就会产生一个 SVC 异常,然后操作系统提供的 SVC 异常服务例程得到执行,它再 调用相关的操作系统函数,后者完成用户程序请求的服务。
在一个系统中,如果有两个就绪的任务(任务A、任务B),通过SysTick的轮转调度启动两个任务的切换,如下图所示:
两个任务间通过SysTick轮转调度的简单模式
但是,如果在产生SysTick异常时正在响应一个中断,则SysTick异常会抢占其中断服务响应。在这时,系统会执行SysTick异常的上下文切换,而且在本次切换期间不能执行中断,只能等待下一次SysTick异常,因此中断请求就会被延迟,如下图所示:
发生IRQ时上下文切换问题
为解决上述问题,引入了PendSV来解决这个问题,PendSV异常会自动延迟上下文切换的请求,直到其它的 ISR 都完成了处理后才放行。为实现这个机制,需要把 PendSV 编程为最低优先级的异常。如果 OS 检测到某 IRQ 正在活动并且被 SysTick 抢占,它将悬起一个 PendSV 异常, 以便缓期执行上下文切换。如下图所示:
使用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,同时系统再次进入线程模式。
    三、使用SysTick
    1、要使用systick定时器,只需调用SysTick_Config(uint32_t ticks)函数即可,
    函数自动完成:重装载值的装载,时钟源选择,计数寄存器复位,中断优先级的设置(最低),开中断,开始计数的工作。
    2、要修改时钟源调用SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource),也可按照SysTick_Config()中默认设置FCLK不变。
    3、要修改中断优先级调用
    void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
    应用说明:
    1、因systick是一个24位的定时器,故重装值最大值为2的24次方=16 777 215,要注意不要超出这个值。
    2、systick是cortex_m3的标配,不是外设。故不需要在RCC寄存器组打开他的时钟。
    3、每次systick溢出后会置位计数标志位和中断标志位,计数标志位在计数器重装载后被清除,而中断标志位也会随着中断服务程序的响应被清除,所以这两个标志位都不需要手动清除。
    4、采用使用库函数的方法,只能采用中断的方法响应定时器计时时间到,如要采用查询的方法,那只能采用设置systick的寄存器的方法,具体操作以后再做分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值