rtt——时钟管理

freertos

嘀嗒时钟

时钟tick的频率一般由RT_TICK_PER_SECOND宏定义决定,系统默认设置RT_TICK_PER_SECOND为1000,注意RT_TICK_PER_SECOND不能大于1000,防止嘀嗒硬件溢出,无返回值

定时器

我们首先要区分操作系统定时器和芯片上的硬件定时器:

  • 硬件定时器:是芯片本身提供的定时功能,一般由外部晶振提供芯片输入时钟,当到达设定的时间值后芯片中断控制器产生时钟中断;硬件定时器的精度都很高,都可以达到ns级别,并且是中断触发的方式,但是定时器数量有限

  • 操作系统定时器:是由操作系统提供给的一类接口,在硬件定时器基础上,使系统能够提供不受数量限制的定时器服务

RT-thread实时操作系统提供了软件定时器接口

创建定时器

rt_timer_t rt_timer_create(const char *name,
                           void (*timeout)(void *parameter),
                           void       *parameter,
                           rt_tick_t   time,
                           rt_uint8_t  flag);

flag的参数宏定义为:

#define RT_TIMER_FLAG_ONE_SHOT          0x0             /**< 单次定时 */
#define RT_TIMER_FLAG_PERIODIC          0x2             /**< 周期定时 */

#define RT_TIMER_FLAG_HARD_TIMER        0x0             /**< 硬件定时器 */
#define RT_TIMER_FLAG_SOFT1_TIMER        0x4             /**< 软件定时器 */

初始化定时器

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);

删除定时器

rt_err_t rt_timer_delete(rt_timer_t timer);

使用create创建的定时器,调用这个函数,会将定时器从rt_timer链表中删除,并释放该定时器控制块占用的内存

脱离定时器

rt_err_t rt_timer_detach(rt_timer_t timer);

使用init初始化的定时,使用该函数会将定时器从内核对象容器中脱离出,但定时器对象所占用的空间不会释放

启动/关闭定时器

rt_err_t rt_timer_start(rt_timer_t timer);
rt_err_t rt_timer_stop(rt_timer_t timer);

启动定时器后,定时器的状态,会改为激活状态RT_TIMER_FLAG_ACTIVATED,并按照超时顺序插入到rt_timer队列链表中

停止定时器后,定时器的状态会更改为停止状态RT_TIMER_FLAG_DEACTIVATED,并从rt_timer链表中脱离出来不参与定时器超时检查;周期定时器在定时器到期时,可以待用这个函数停止该定时器

#define RT_TIMER_FLAG_DEACTIVATED       0x0             /**< timer 激活状态 */
#define RT_TIMER_FLAG_ACTIVATED         0x1             /**< timer 停止状态 */

控制定时器

rt_err_t rt_timer_control(rt_timer_t timer, int cmd, void *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             /**< 周期定时 */

相关文章

rtt——线程间通信(互斥量)

互斥量的概念 在 RT-Thread 中,互斥量(Mutex,互斥锁)用于确保共享资源在任意时刻只被一个线程访问 - **确保共享资源的互斥访问**:互斥量用于保护对共享资源的访问,确保在任意时刻只有一个线程可以访问该资源;避免多个线程同时修改共享资源而导致的数据不一致或竞态条件 - 实现临界区保护:互斥量通常用于实现临界区保护,将对共享资源的访问限制在临界区内。**只有获取了互斥量的线程...

freertos

rtt——线程间通信(消息队列)

**消息队列是一种线程间的通信方式,是邮箱的扩展** 消息队列的工作机制 消息队列能够接收来自线程或中断服务例程中**不固定长度的消息**,**并把消息缓存在自己的内存空间中**。其他线程也能够从消息队列中读取相应的消息,而当消息队列为空时,可挂起读取线程。当有新的消息到达时,挂起的线程将被唤醒为接收并处理消息 **消息队列是一种异步的通信方式** 通常将先进入消息队列的消息先传给线程...

freertos

rtt——线程间的通信(邮箱)

邮箱 **邮箱是实时操作系统中的一种典型的线程间的通信方式** **邮箱的通信方式除了可以一对一,也可以一对多通信,或者多对多通信** 邮箱的工作机制 在RT-thread操作系统中,邮箱是开销较低、效率较高的一种线程间通信方式。 **邮箱中的每一封邮件的容量固定为4字节(刚好容下一个32位系统的指针)** 线程或中断服务程序把一封长度为4字节的邮件发送到指定邮箱中,而其他一...

freertos