一、时钟管理

时钟节拍(OS Tick)是特定的周期性中断,这个中断可以看做是系统心跳,中断之间的时间间隔取决于不同的应用,一般是 1ms–100ms。
RT-Thread 中,时钟节拍的长度可以根据 RT_TICK_PER_SECOND 的定义来调整,等于 1/RT_TICK_PER_SECOND 秒

时钟节拍由配置为中断触发模式的硬件定时器产生,当中断到来时,将调用一次rt_tick_increase(void),通知操作系统已经过去一个系统时钟。

所有定时器在定时超时后都会从定时器链表中被移除,而周期性定时器会在它再次启动时被加入定时器链表。

获取时钟节拍
由于全局变量 rt_tick 在每经过一个时钟节拍时,值就会加 1,通过调用 rt_tick_get 会返回当前 rt_tick 的值,即可以获取到当前的时钟节拍值。此接口可用于记录系统的运行时间长短,或者测量某任务运行的时间。
接口函数:rt_tick_t rt_tick_get(void); 返回值:当前时钟节拍值

RTT的软件定时器的定时数值必须是 OS Tick 的整数倍。
RT-Thread 定时器默认的方式是 HARD_TIMER 模式,即定时器超时后,超时函数是在系统时钟中断的上下文环境中运行的。这就决定了定时器的超时函数不应该调用任何会让当前上下文挂起的系统函数,也不能够执行非常长的时间,否则会导致其他中断的响应时间加长或抢占了其他线程执行的时间。

SOFT_TIMER 模式可由用户配置,通过宏定义 RT_USING_TIMER_SOFT 来决定是否启用该模式。该模式被启用后,系统会在初始化时创建一个 timer 线程,对应的定时器超时函数都会在 timer 线程的上下文环境中执行。
可以在初始化 / 创建定时器时使用参数 RT_TIMER_FLAG_SOFT_TIMER 来指定设置 SOFT_TIMER 模式。

定时器的创建时间可以由用户自己决定。

在系统启动时需要初始化定时器管理系统。可以通过下面的函数接口完成:
void rt_system_timer_init(void); (默认硬件模式)
void rt_system_timer_thread_init(void); (SOFT_TIMER模式下用这个函数)

RTT学习笔记(三)——时钟/中断管理 - 图1

rt_timer_t rt_timer_create(const char* name,
void (timeout)(void parameter),
void* parameter,
rt_tick_t time,
rt_uint8_t flag);
重点看两个参数:

void (timeout) (void parameter) 定时器超时函数指针(当定时器超时时,系统会调用这个函数)
flag 定时器创建时的参数,支持的值包括单次定时、周期定时、硬件定时器、软件定时器等(可以用 “或” 关系取多个值)

注意:
rt_err_t rt_timer_delete(rt_timer_t timer); //动态定时器不再使用
调用这个函数接口后,系统会把这个定时器从 rt_timer_list 链表中删除,然后释放相应的定时器控制块占有的内存
rt_err_t rt_timer_detach(rt_timer_t timer);//静态定时器不再使用
脱离定时器时,系统会把定时器对象从内核对象容器中脱离,但是定时器对象所占有的内存不会被释放

rt_err_t rt_timer_start(rt_timer_t timer);//创建定时器后需要激活
rt_err_t rt_timer_stop(rt_timer_t timer);//停止定时器(可放在超时函数中) 不参与超时检查,但不是删除

rt_err_t rt_timer_control(rt_timer_t timer, rt_uint8_t cmd, void* arg); //控制定时器
重点为后两个参数:

cmd 用于控制定时器的命令,当前支持四个命令,分别是设置定时时间,查看定时时间,设置单次触发,设置周期触发
arg 与 cmd 相对应的控制命令参数 比如,cmd 为设定超时时间时,就可以将超时时间参数通过 arg 进行设定

cmd:
#define RT_TIMER_CTRL_SET_TIME 0x0 / 设置定时器超时时间 /
#define RT_TIMER_CTRL_GET_TIME 0x1 / 获得定时器超时时间 /
#define RT_TIMER_CTRL_SET_ONESHOT 0x2 / 设置定时器为单次定时器 /
#define RT_TIMER_CTRL_SET_PERIODIC 0x3 / 设置定时器为周期型定时器 /

高精度延时(举例):
image.png

二、中断管理

全局中断开关

全局中断开关也称为中断锁,是禁止多线程访问临界区最简单的一种方式,即通过关闭中断的方式,来保证当前线程不会被其他事件打断(因为整个系统已经不再响应那些可以触发线程重新调度的外部事件),也就是当前线程不会被抢占,除非这个线程主动放弃了处理器控制权。当需要关闭整个系统的中断时,可调用下面的函数接口:

  1. rt_base_t rt_hw_interrupt_disable(void);