本文参考课程为李述铜老师的《自己动手写从0到1写嵌入式操作系统》,仅用作个人笔记复习和分享。
C2.03 双时间片的运行原理
1、SysTick定时器
以下内容摘自CM3权威手册:
系统滴答定时器是一个非常基本的倒计时定时器,用于每隔一定时间产生一个中断,即使在系统睡眠模式也能工作。它是的OS在各CM3期间之间的移植中不必修改系统定时器代码,移植工作一下子容易多了。SysTick定时器也是作为NVIC的一部分实现的。
寄存器分布:
源码中SysTick_Type对应的CTRL、LOAD、VAL、CALIB就是由低到高对应图中四个寄存器。
Systick->LOAD的配置公式为(f/T)-1,f为系统时钟频率,T希望发生中断的时间间隔,单位为s。
Systick->VAL的作用是读取时候返回当前计数的值,写它则会将计数清零同时清除在SysTick控制以及状态寄存器中的COUNTFLAG标志。
Systick->CTRL,源码中置位了三个MASK,分别对应的作用是设置时钟源为内核时钟(CLKSOURCE=1),倒数至0时产生SysTick异常请求(TICKINT=1),使能SysTick定时器(定时器使能位)。
2、SystemInit函数中多了一段条件编译
#ifdef UNALIGNED_SUPPORT_DISABLE
SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk;
#endif
可能不是很重要,但还是简单分析一下,这段代码的含义是在禁用未对齐支持的情况下,会把启用未对齐访问陷阱打开,当设置这个位时,如果发生未对齐的内存访问,CPU会产生一个异常。
C2.04 双任务延时原理与空闲任务
1、空闲任务
在所有其他任务处于阻塞状态时,空闲任务作为最低优先级会开始运行。
空闲任务的作用:1、防止CPU空转;2、统计任务负荷;
2、钩子函数
源码中未看到这个的使用,但别的文章介绍中有讲解,也一起补充下
通过空闲任务钩子函数(或称回调,hook, or call-back),可以直接在空闲任务中添加应用程序相关的功能。空闲任务钩子函数会被空闲任务每循环一次就自动调用一次。
通常空闲任务钩子函数被用于:
~ 执行低优先级,后台或需要不停处理的功能代码。
~ 测试出系统处理裕量(空闲任务只会在所有其它任务都不运行时才有机会执行,所以测量出空闲任务占用的处理时间就可以清楚的知道系统有多少富余的处理时间)。
~ 将处理器配置到低功耗模式——提供一种自动省电方法,使得在没有任何应用功能需要处理的时候,系统自动进入省电模式。
空闲任务钩子函数的实现限制
空闲任务钩子函数必须遵从以下规则
1. 绝不能阻塞或挂起。空闲任务只会在其它任务都不运行时才会被执行(除非有应用任务共享空闲任务优先级)。以任何方式阻塞空闲任务都可能导致没有任务能够进入运行态!
2. 如果应用程序用到了 vTaskDelete() API 函数,则空闲钩子函数必须能够尽快返回。因为在任务被删除后,空闲任务负责回收内核资源。如果空闲任务一直运行在钩子函数中,则无法进行回收工作。