前言
了解RT-Thread的时钟节拍实现,以及如何获取时钟节拍
一、时钟节拍是什么?
时钟节拍 (OS Tick)是RT-Thread操作系统的最小时间单位,任何操作系统都需要提供一个时钟节拍,以供系统处理所有和时间有关的事件,如线程的延时、线程的时间片轮转调度以及定时器超时等。
RT-Thread 中,时钟节拍的长度(就是一个节拍需要多少秒)可以根据 RT_TICK_PER_SECOND 的定义来调整,等于 1/RT_TICK_PER_SECOND 秒。
在rtconfig.h中可以找到时钟节拍的宏定义,更改其值,可以更改时钟节拍的长度
二、时钟节拍怎么产生的?
1、时钟节拍是由配置为中断模式的系统滴答定时器产生的,在系统滴答定时器初始化函数里会使用到RT_TICK_PER_SECEND这个宏,观察该初始化函数可知,_systick_ms就是多久进一次滴答定时器中断的时间,它是以ms为单位的。所以当我们配置RT_TICK_PER_SECEND宏为1000时,则滴答定时器中断会1ms进一次。
2、下面是系统滴答定时器中断函数,当我们配置RT_TICK_PER_SECEND为1000时,每过1ms就会进一次这个函数。
3、在系统滴答定时器中断函数里做了什么呢,我们主要关注如下函数
进去看看,在rt_tick_increase(void)这个函数里,我们主要关注如下我框起来的变量,每次进一次滴答定时器中断都会使rt_tick变量自加,而我们的中断是1ms产生一次(根据我们配置),所以rt_tick变量就是每过1ms就会自加一次,所以我们只要知道rt_tick的值是多少,就可以知道当前系统运行了多长时间了,可想而知rt_tick应该是一个全局变量
我们找一下rt_tick,发现它确实是一个全局变量,一上电初始化为0
三、获取时钟节拍(实验)
1、新建RTT项目
2、主函数写入如下代码
/*
* Copyright (c) 2006-2023, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-12-14 RT-Thread first version
*/
#include <rtthread.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
int main(void)
{
while(1)
{
rt_tick_t tick = 0;
tick = rt_tick_get();
rt_kprintf("tick:%u\n",tick);
rt_thread_mdelay(1000);
}
return RT_EOK;
}