【UCOSIII操作系统】软件定时器篇

UCOSIII其他内容导航不迷路
UCOSIII操作系统-简介
【UCOSIII操作系统】任务篇(1)创建任务
【UCOSIII操作系统】任务篇(2)相关API函数
【UCOSIII操作系统】系统初始化篇(1)系统初始化
【UCOSIII操作系统】系统初始化篇(2)CPU,SysTick,内存初始化
【UCOSIII操作系统】硬件初始化篇(1)硬件初始化以及开始运行系统
【UCOSIII操作系统】消息队列篇(1)消息队列
【UCOSIII操作系统】消息队列篇(2)任务消息队列
【UCOSIII操作系统】信号量与互斥量篇(1)信号量
【UCOSIII操作系统】信号量与互斥量篇(2)互斥量
【UCOSIII操作系统】信号量与互斥量篇(3)任务信号量
【UCOSIII操作系统】事件篇
【UCOSIII操作系统】中断管理篇
【UCOSIII操作系统】临界段篇
【UCOSIII操作系统】内存管理篇
已完结

说在前面:
这个内容不适合0基础的人,因为这里只讲了应用层面的东西,并没有深入内核讲解,所以要从零开始学UCOSIII的朋友,可以先去学完入门内容,再来观看这个笔记加深印象。
这篇文章是个人学习整理,如有错误请指正

UCOSIII操作系统——软件定时器篇

软件定时器,软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受硬件定时器资源限制的定时器服务,它实现的功能与硬件定时器也是类似的。
使用硬件定时器时,每次在定时时间到达之后就会自动触发一个中断,用户在中断中处理信息;而使用软件定时器时,需要我们在创建软件定时器时指定时间到达后要调用的函数(也称超时函数/回调函数,为了统一,下文均用回调函数描述),在回调函数中处理信息。

  • 当到达设定时钟计数值后会触发用户定义的回调函数
  • 一般利用SysTick作为软件定时器的基础时钟
  • 回调函数类似于硬件的中断服务函数
  • 回调函数也要快进快出,不能有阻塞任务运行的情况或者删除定时器任务的情况

uCOS软件定时器的精度(分辨率)决定于系统时基频率,也就是变量OS_CFG_TMR_TASK_RATE_HZ的值,它是以Hz为单位的。如果软件定时器任务的频率(OS_ CFG_TMR_TASK_RATE_HZ)设置为10Hz,系统中所有软件定时器的精度为十分之一秒。事实上,这是用于软件定时器的推荐值,因为软件定时器常用于不精确时间尺度的任务

  • 时间计算是用os_cfg_app.h里面的OS_CFG_TMR_TASK_RATE_HZ来设置的,比如说100HZ(一般),定时器的基准时间就是10ms,然后定时只能定10的倍数的时间,只能是10ms,20ms,30ms,不能是5ms,15ms,等。

  • 注意:定时器任务的频率OS_CFG_TMR_TASK_RATE HZ的值不能大于系统时基频率OS_CFG_TMR_TASK_RATE_HZ的值。

  • 我们知道,在系统初始化函数中,有一个定时任务,要使能相应的宏,才能正常使用软件定时器功能。

软件定时器的API函数

函数描述
OSTmrCreat()创建定时器并设置运行模式
OSTmrDel()删除定时器
OSTmrStart()启动定时器计数
OSTmrStop()停止定时器倒计时
OSTmrRemainGet()获取定时器剩余时间
OSTmrStateGet()获取当前定时状态

定义一个定时器的控制块(句柄)

OS_TMR   my_tmr;   //声明软件定时器句柄

创建定时器->OSTmrCreat()

  • 函数原型
void  OSTmrCreate (OS_TMR               *p_tmr,				//定时器控制块指针
                   CPU_CHAR             *p_name,			//命名定时器,有助于调试
                   OS_TICK               dly,				//初始定时节拍数
                   OS_TICK               period,			//周期定时重载节拍数
                   OS_OPT                opt,				//选项
                   OS_TMR_CALLBACK_PTR   p_callback,		//定时到期时的回调函数
                   void                 *p_callback_arg,	//传给回调函数的参数
                   OS_ERR               *p_err)				//返回错误类型

要注意有初始化节拍数和没初始化节拍数的区别
opt选项:
定时器运行选项,这里有两个模式可以选择。
OS_OPT_TMR_ONE_SHOT 单次定时器
OS_OPT_TMR_PERIODIC 周期定时器
在单次定时模式时,就写初始化节拍数就好,重装载节拍数为0

  • 应用实例
#define  OS_CFG_TMR_TASK_RATE_HZ         100u 		// 基准时间10ms 
	//创建定时器1
	OSTmrCreate((OS_TMR		*)&tmr1,				//定时器1
                (CPU_CHAR	*)"tmr1",				//定时器名字
                (OS_TICK	 )20,					//20*10=200ms
                (OS_TICK	 )100,         			//100*10=1000ms
                (OS_OPT		 )OS_OPT_TMR_PERIODIC, 	//周期模式
                (OS_TMR_CALLBACK_PTR)tmr1_callback,	//定时器1回调函数
                (void	    *)0,					//参数为0
                (OS_ERR	    *)&err);				//返回的错误码
	//创建定时器2
	OSTmrCreate((OS_TMR		*)&tmr2,		
                (CPU_CHAR	*)"tmr2",		
                (OS_TICK	 )200,			//200*10=2000ms	
                (OS_TICK	 )0,   					
                (OS_OPT		 )OS_OPT_TMR_ONE_SHOT, 	//单次定时器
                (OS_TMR_CALLBACK_PTR)tmr2_callback,	//定时器2回调函数
                (void	    *)0,			
                (OS_ERR	    *)&err);	

启动定时器->OSTmrStart()

  • 函数原型
CPU_BOOLEAN  OSTmrStart (OS_TMR  *p_tmr,		//定时器控制块指针
                         OS_ERR  *p_err)		//返回错误类型
  • 应用实例
OSTmrStart(&tmr1,&err);	//开启定时器1
OSTmrStart(&tmr2,&err);	//开启定时器2

停止定时器->OSTmrStop()

  • 函数原型
CPU_BOOLEAN  OSTmrStop (OS_TMR  *p_tmr,				//定时器控制块指针
                        OS_OPT   opt,				//选项
                        void    *p_callback_arg,	//传给回调函数的新参数
                        OS_ERR  *p_err)				//返回错误类型
  • 应用实例
OSTmrStop(&tmr1,
		OS_OPT_TMR_NONE,
		0,
		&err);	//关闭定时器1
OSTmrStop(&tmr2,OS_OPT_TMR_NONE,0,&err);	//关闭定时器2

删除定时器->OSTmrDel()

OSTmrDel0用于删除一个已经被创建成功的软件定时器,删除之后就无法使用该定时并且定时器相应的信息也会被系清空。要想使用OSTmrDel()函 数必须在头文件os_ cfg.h中把宏OS_CFG_TMR_DEL_EN定义为1

  • 函数原型
#if OS_CFG_TMR_DEL_EN > 0u					//如果使能了 OSTmrDel() 函数
CPU_BOOLEAN  OSTmrDel (OS_TMR  *p_tmr,		//定时器控制块指针
                       OS_ERR  *p_err)		//返回错误类型

回调函数

  • 回调函数类似于硬件的中断服务函数
  • 回调函数也要快进快出,不能有阻塞任务运行的情况或者删除定时器任务的情况
void tmr1_callback(void *p_tmr, void *p_arg)	//函数名随意取,里面的形参严格按照这种方式写
{
	//	用户自己的代码
}
  • 应用实例
/*
*********************************************************************************************************
*                                          TMR TASK
*********************************************************************************************************
*/
void TmrCallback (OS_TMR *p_tmr, void *p_arg) //软件定时器MyTmr的回调函数
{
	CPU_INT32U       cpu_clk_freq;	
	CPU_SR_ALLOC();      //使用到临界段(在关/开中断时)时必需该宏,该宏声明和定义一个局部变
											 //量,用于保存关中断前的 CPU 状态寄存器 SR(临界段关中断只需保存SR)
											 //,开中断时将该值还原。  
  printf ( "%s", ( char * ) p_arg );
	
	cpu_clk_freq = BSP_CPU_ClkFreq();                   //获取CPU时钟,时间戳是以该时钟计数
	
	macLED1_TOGGLE (); 
	
  ts_end = OS_TS_GET() - ts_start;     //获取定时后的时间戳(以CPU时钟进行计数的一个计数值)
	                                     //,并计算定时时间。
	OS_CRITICAL_ENTER();                 //进入临界段,不希望下面串口打印遭到中断
	
	printf ( "\r\n定时1s,通过时间戳测得定时 %07d us,即 %04d ms。\r\n", 
						ts_end / ( cpu_clk_freq / 1000000 ),     //将定时时间折算成 us 
						ts_end / ( cpu_clk_freq / 1000 ) );      //将定时时间折算成 ms 
	
	OS_CRITICAL_EXIT();                               

	ts_start = OS_TS_GET();                            //获取定时前时间戳
	
}
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值