- 简述
- 定时器:是指从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户可以自定义定时器的周期与频率
- 分类:
- 硬件定时器:
- 芯片本身提供的功能
- 每次在定时时间到达之后就会自动触发一个中断,用户在中断中处理信息
- 软件定时器:
- 由操作系统提供的一类系统接口,构建在硬件定时器(SysTick)基础上
- 软件定时器指定时间到过后要调用的函数(也称超时函数/回调函数,为了统一,下文均用回调函数),在回调函数中处理信息
- 硬件定时器:
- uC/OS定时模式
- 单次模式:启动定时器,时间到达,只执行一次回调函数后,将不再重复执行
- 周期模式:定时器会按照设置的定时时间,循环执行回调函数,直到用户将定时器删除
- 应用场景
- 适合于对时间精度要求不高的任务
- 软件定时器的精度
- 系统节拍是系统的心跳节拍,表示系统时钟的频率,OS_CFG_TICK_RATE_HZ,默认是1000,周期1ms
- 精度决定于系统时基频率,也就是变量OS_CFG_TMR_TASK_RATE_HZ的值,默认100,周期10ms
- 定时器任务的频率不能大于系统时基频率
- 相关函数
- OSTmrCreat(); 创建定时器
- OSTmrDel(); 删除定时器
- OSTmrStart(); 启动定时器计数
- OSTmrStop(); 停止定时器计时
- OSTmrRemainGet(); 获取定时器剩余时间
- OSTmrStateGet(); 获取当前定时状态
- 例程
- 创建,启动
/************************************************** * 函数名:static void AppTaskTmr(void *p_arg) * 描述 :创建软件定时器 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ static void AppTaskTmr(void *p_arg) { OS_ERR err; OS_TMR my_tmr; //声明软件定时器对象 (void)p_arg; //创建软件定时器 OSTmrCreate( (OS_TMR *)&my_tmr, //软件定时器对象 (CPU_CHAR *)"MySoftTimer", //命名软件定时器 (OS_TICK )100, //定时器初始值,依10hz时基计算,即为1S (OS_TICK )100, //定时器周期重装值,依10Hz时基计算,即为1S (OS_OPT )OS_OPT_TMR_PERIODIC, //周期性定时 (OS_TMR_CALLBACK_PTR)TmrCallback, //回调函数 (void *)"Time over!!!", //传递实参给回调函数 (OS_ERR *)&err); //返回错误类型 //启动软件定时器 OSTmrStart( (OS_TMR *)&my_tmr, //软件定时器对象 (OS_ERR *)&err); //返回错误类型 ts_start = OS_TS_GET(); //获取定时前时间戳 while(DEF_TRUE) { OSTimeDly(1000, OS_OPT_TIME_DLY, &err);; //不阻塞该任务 } }
- 回调函数
/************************************************** * 函数名:void TmrCallback (OS_TMR *p_tmr, void *p_arg) * 描述 :软件定时器的回调函数 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ void TmrCallback (OS_TMR *p_tmr, void *p_arg) { CPU_INT32U cpu_clk_freq; printf("%s", (char *)p_arg); cpu_clk_freq = BSP_CPU_ClkFreq(); //获取CPU时钟 LED1_TOGGLE; ts_end = OS_TS_GET() - ts_start; //获取定时后的时间戳 printf("\r\n 定时1S,通过时间戳测得定时 %07d us, 即%04d ms; \r\n", ts_end / (cpu_clk_freq / 1000000), //将定时时间折算成us ts_end / (cpu_clk_freq / 1000) ); //将定时时间折算成Ms ts_start = OS_TS_GET(); //获取定时前的时间戳 }
- 创建,启动
- 下载验证
- 总结
- 软件定时器核心是在底层的硬件定时器(SysTick内核定时器)上进行软件分频
- 回调函数是在定时器任务中被调用,所以回调函数的上、下文环境是在任务中,并且运行回调函数时调度器处于被锁状态
- 回调函数越简短越好,并且不能在回函函数中等待消息队列、信号量、事件等操作
- 参考资料:
- 正点原子《STM32F767 UCOS开发手册》
- 野火《uC/OS-III内核应用与开发》
- 《嵌入式实时操作系统 uC/OS-II原理及应用(第二版)》
- 官方源码
- 硬件平台:
- 正点原子阿波罗F767
- 软件平台:
- MDK5.2.5
- 库版本:
- TM32Cube_FW_F7_V1.4.0
- uC/OS-III版本
- UCOSIII 3.04
【8】uC/OS-III应用开发————>软件定时器(STM32F767)
最新推荐文章于 2023-09-25 19:13:26 发布