详细剖析Linux和RTOS(RT-Thread)的时钟和定时器的使⽤
Linux发烧友
1.RTOS篇
1.1RT-Thread简介
RT-Thread 是⼀个集实时操作系统(RTOS)内核、中间件组件和开发者社区于⼀体的技术平台,由熊谱翔先⽣带领并集合开源社区⼒量开发⽽成,RT-Thread 也是⼀个组件完整丰富、⾼度可伸缩、简易开发、超低功耗、⾼安全性的物联⽹操作系统。RT-Thread 具备⼀个 IoT OS 平台所需的所有关键组件,例如GUI、⽹络协议栈、安全传输、低功耗组件等等。经过11年的累积发展,RT-Thread 已经拥有⼀个国内最⼤的嵌⼊式开源社区,同时被⼴泛应⽤于能源、车载、医疗、消费电⼦等多个⾏业,累积装机量超过 8亿台,成为国⼈⾃主开发、国内最成熟稳定和装机量最⼤的开源 RTOS。
1.2时钟管理
1.2.1时钟节拍
任何系统都有⼀个时钟节拍,负责处理和时间相关的事件,在RT-Thread中时钟节拍可以根据RT_TICK_PER_SECOND宏来定义,下⾯设定为频率时1000HZ节拍是1ms
和裸机的STM32⼀样,有⼀个系统滴答定时器,每1ms触发⼀次中断
在滴答中断函数⾥⾯会有⼀个全局变量,中断⼀次就加⼀
1.3获取系统节拍
我们可以通过下⾯⼀个函数获取滴答定时器⾥⾯的全局变量。
rt_tick_t rt_tick_get(void)
1.4定时器分类
定时器可以分为硬件定时器和软件定时器
1. 硬件定时器:从代码的⾓度上看,硬件定时器更加精确,可以到达纳妙级别,因为他是通过外部晶振提供给芯⽚提供时钟。芯⽚提供⼀
组寄存器,到达设定时钟后产⽣中断
2. 软件定时器:建⽴在硬件定时器的基础上,可以提供多个定时器
1.5定时器源码分析
1. 在RT-Thread启动的时候,会调⽤rtthread_startup函数,⾥⾯初始化了许多事件,如定时器初始化函数rt_system_timer_init();
2. 可以看到定时器初始化就是遍历rt_timer_list,对每⼀个rt_timer_list的内容进⾏ rt_list_init(rt_timer_list + i)操作
3. 那么rt_timer_list是什么呢,其实就是⼀个队列链表
struct rt_list_node
{
struct rt_list_node *next;/**< point to next node. */
struct rt_list_node *prev;/**< point to prev node. */
};
typedef struct rt_list_node rt_list_t;
4. rt_list_init⾥⾯⼜执⾏什么操作呢
t_inline void rt_list_init(rt_list_t *l)
{
l->next = l->prev = l;
}
5. rt_system_timer_thread_init软件定时器初始化,其实就是把软件定时器放⼊rt_list_init中,然后给每⼀个软件定时器定时器开启线
程。
void rt_system_timer_thread_init(void)
{
#ifdef RT_USING_TIMER_SOFT
int i;
for(i =0;
i <sizeof(rt_soft_timer_list)/sizeof(rt_soft_timer_list[0]);
i++)
{
rt_list_init(rt_soft_timer_list + i);
}
/* start software timer thread */
rt_thread_init(&timer_thread,
"timer",
rt_thread_timer_entry,
RT_NULL,
&timer_thread_stack[0],
sizeof(timer_thread_stack),
RT_TIMER_THREAD_PRIO,
10);
/* startup */
rt_thread_startup(&timer_thread);
#endif
}
1.6定时器相关函数
1.61动态创建⼀个定时器和删除定时器
添加定时器
/**
* This function will create a timer
*
* @param name the name of timer
timeout on t2 timer* @param timeout the timeout function
* @param parameter the parameter of timeout function
* @param time the tick of timer
* @param flag the flag of timer
* #define RT_TIMER_FLAG_ONE_SHOT        0x0            /**< one shot timer */
* #define RT_TIMER_FLAG_PERIODIC          0x2/**< p eriodic timer **/
* #define RT_TIMER_FLAG_HARD_TIMER      0x0/**< hard timer,the timer's callback function will be called in tick isr. */
* #define RT_TIMER_FLAG_SOFT_TIMER      0x4/**< soft timer,the timer's callback function will be called in timer thread. */ * @return the created timer object
**/
rt_timer_t rt_timer_create(const char*name,
void(*timeout)(void*parameter),
void*parameter,
rt_tick_t  time,
rt_uint8_t  flag)
定时器删除
/**
* This function will delete a timer and release timer memory
*
* @param timer the timer to be deleted
*
* @return the operation status, RT_EOK on OK; RT_ERROR on error
*/
rt_err_t rt_timer_delete(rt_timer_t timer)
1.7初始化和脱离定时器
静态初始化
/
**
* This function will initialize a timer, normally this function is used to
* initialize a static timer object.
*
* @param timer the static timer object  (typedef struct rt_timer *rt_timer_t;)
* @param name the name of timer
* @param timeout the timeout function
* @param parameter the parameter of timeout function
* @param time the tick of timer
* @param flag the flag of timer
*/
void rt_timer_init(rt_timer_t  timer,
const char*name,
void(*timeout)(void*parameter),
void*parameter,
rt_tick_t  time,
rt_uint8_t  flag)
定时器脱离
/**
* This function will detach a timer from timer management.
*
* @param timer the static timer object
*
* @return the operation status, RT_EOK on OK; RT_ERROR on error
*/
rt_err_t rt_timer_detach(rt_timer_t timer)
1.8启动和停⽌定时器
启动定时
**
* This function will start the timer
*
* @param timer the timer to be started
*
* @return the operation status, RT_EOK on OK,-RT_ERROR on error
*/
rt_err_t rt_timer_start(rt_timer_t timer)
停⽌定时器
/**
* This function will stop the timer
*
* @param timer the timer to be stopped
*
* @return the operation status, RT_EOK on OK, -RT_ERROR on error
*/
rt_err_t rt_timer_stop(rt_timer_t timer)
``
## 定时器控制
当定时器启动后我们想更改定时器的某些状态,可以调⽤下⾯的函数
```c
/**
* This function will get or set some options of the timer
*
* @param timer the timer to be get or set
* @param cmd the control command
* @param arg the argument
* #define RT_TIMER_CTRL_SET_TIME          0x0            /**< set timer control command */
* #define RT_TIMER_CTRL_GET_TIME          0x1/**< get timer control command */
* #define RT_TIMER_CTRL_SET_ONESHOT      0x2/**< change timer to one shot */
* #define RT_TIMER_CTRL_SET_PERIODIC      0x3/**< change timer to periodic */
* @return RT_EOK
*/
rt_err_t rt_timer_control(rt_timer_t timer,int cmd,void*arg)
1.9⾼精度延时
注意:这个函数只⽀持低于1个OS Tick的延时, 否则SysTick会出现溢出⽽不能够获得指定的延时时间
/**
This function will delay for some us.
@param us the delay time of us
*/
void rt_hw_us_delay(rt_uint32_t us)
1.10实战篇:RTOS定时器代码演⽰
效果:定时打印结果,当打印⼗次后调⽤rt_timer_control(&tm2, RT_TIMER_CTRL_SET_ONESHOT,NULL);变为⼀次性的定时器。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。