CMSIS-RTOS 时间管理之虚拟定时器Virtual Timers

虚拟定时器Virtual Timers

CMSIS-RTOS API里有几个向下计数的虚拟定时器,它们实现计数完成时用户的回调功能。每个定时器都可以配置成单次计数或重复计数模式,它们可以在定义定时器结构体的时候被创建:

osTimerDef(timer0, led_function);

在上面的代码中给定时器定义了一个名字timer0,并同时定义了回调函数led_function,紧接着必须对这个定时器进行实例化:

osTimerId timer0_handle = osTimerCreate(timer(timer0), osTimerPeriodic,(void*)0);

上面的代码创建了这个定时器,并把它定义成周期性定时器(还可以定义成单次定时器–osTimerOnce),最后一个参数0是传递给回调函数的实参,当定时器定时结束时会用的用到。

osTimerStart(timer0_handle, 0x100);

定时器可以在线程的任意位置启动,从上面的代码中可以看到,定时器启动函数使用的是timer0的句柄,并定义了0x100ms的周期定时。

练习:虚拟定时器

在这个练习里,我们将配置一些虚拟定时器以不同的频率来触发回调函数。

打开Pack Installer,并选择“Ex 6 Virtual Timers”,然后把它安装到自定义路径

代码依旧是原来的LED闪烁程序,在代码中添加四个虚拟定时器来触发回调函数。当某个定时器定时完成时,这个回调函数就会执行翻转LED的程序。

定时器在启动代码中定义:

osTimerDef(timer0_handle, callback);
osTimerDef(timer1_handle, callback);
osTimerDef(timer2_handle, callback);
osTimerDef(timer3_handle, callback);

在main函数中初始化:

osTimerId timer0 = osTimerCreate(osTimer(timer0_handle), osTimerPeriodic, (void*)0);
osTimerId timer0 = osTimerCreate(osTimer(timer0_handle), osTimerPeriodic, (void*)1);
osTimerId timer0 = osTimerCreate(osTimer(timer0_handle), osTimerPeriodic, (void*)2);
osTimerId timer0 = osTimerCreate(osTimer(timer0_handle), osTimerPeriodic, (void*)3);

每个定时器都有不同的句柄和ID号,并且给回调函数传递不同的参数:

void callback(void const *param){
    switch((uint32_t)param) {
        case 0: GPIOB->ODR ^=0x02; break;
        case 1: GPIOB->ODR ^=0x04; break;
        case 2: GPIOB->ODR ^=0x08; break;
        case 3: GPIOB->ODR ^= 0x10;break;
    }
}

当触发发生时,回调函数就会通过传递过来的参数来控制相应的LED翻转。

另外,在程序中配置虚拟定时器前,需要在RTX配置文件中使能定时器线程。

打开RTX_Conf_CM.c 文件,并切换到配置向导标签页

这里写图片描述

展开System Configuration,勾选User Timers。

编译工程,并打开debugger仿真。

全速运行!打开GPIOB仿真窗口。

这里写图片描述
从上图可以看到这几个管脚的设置是按照周期变化的。

打开System and Thread Viewer window

这里写图片描述

需要注意的是,osDelay()产生相对延时,而虚拟定时器产生绝对延时,利用这一点,你可以加入固定时间间隔的代码。

亚毫秒延时

前面介绍的各种CMSIS-RTOS时间管理函数时间精度都是以ms为单位的,如果想产生微秒级别的延时,可以使用系统节拍计数SysTick。这种延时并不产生任务的调度,它只是暂停执行一段时间。
首先,我们需要获取SysTick计数:

int32_t tick, delayPeriod;
tick = osKernelSysTick();//获取内核系统节拍起始值

然后,获取系统节拍微秒值的标定值:

delayPeriod = osKernelTickMicroSec(100);

最后,根据需要创建时间延时:

do{
    //100us延时
}wile((osKernelSysTick())-tick < delayPeriod);
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CMSIS-RTOS》是一本PDF文档,本文将以300字回答有关此文档的问题。 《CMSIS-RTOS》是一本关于Cortex微控制器软件接口标准(CMSIS)中的实时操作系统(RTOS)的PDF文档。该文档详细介绍了CMSIS-RTOS的特性、结构、API和使用方法。 CMSIS-RTOS是一种用于嵌入式系统的实时操作系统,它提供了一套标准化的API和接口,用于编写和管理多任务、多线程和中断驱动的应用程序。该文档介绍了如何使用CMSIS-RTOS构建可靠和高效的嵌入式系统。 文档首先介绍了CMSIS-RTOS的基本概念,包括任务、线程、中断和事件。然后,它详细描述了每个概念的特性和用法,包括任务管理、内存管理、同步和互斥机制等。 此外,文档还介绍了CMSIS-RTOS的结构和组件,如内核、调度器和定时器。它说明了每个组件的功能和使用方法,以及它们之间的关系和依赖关系。 最后,文档提供了一些示例代码和实践指南,以帮助读者更好地理解和应用CMSIS-RTOS。它演示了如何创建、启动和管理任务,以及如何使用互斥锁和信号量进行任务间的数据共享和同步。 总而言之,《CMSIS-RTOS》是一本全面且实用的PDF文档,它为开发人员提供了使用CMSIS-RTOS构建嵌入式系统的详细指南和参考资料。无论是初学者还是有经验的开发人员,都能从中获得关于实时操作系统的深入了解和实际应用的指导。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值