完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
|
|
相关推荐
|
|
|
17.1 定时器组介绍
RTX提供的定时器功能仅支持单次定时器,也就是用户创建了定时器并启动了定时器后,定时时间到将不再重新执行,此定时器会被删除掉并且就执行一次,下次使用要重新的创建,这个就是单次定时器的含义。另外就是单次定时时间到后会调用定时器的回调函数,用户可以回调函数中加入需要执行的工程代码。 使用此定时器组注意以下问题: u 定时器回调函数os_tmr_call在文件RTX_Conf_CM.c文件中。 u 定时器回调函数os_tmr_call中仅支持isr_开头的系统函数,os_开头的不支持,因为回调函数是在滴答定时器中断中执行的。 u RTX的定时器仅支持单次,不支持周期性执行,如果需要周期执行,需要重复创建。 u 可以创建的定时器个数可以在RTX配置向导中设置: |
|
|
|
|
|
|
|
|
17.2 定时器组API函数
使用如下3个函数可以实现RTX的定时器组: u os_tmr_create u os_tmr_kill u os_tmr_call 关于这3个函数的讲解及其使用方法可以看教程第3章3.3小节里面说的参考资料rlarm.chm文件 这里我们重点的说一下函数os_tmr_create和os_tmr_call。 |
|
|
|
|
|
|
|
|
17.2.1 函数os_tmr_create
函数原型: 复制代码 OS_ID os_tmr_create ( U16 tcnt, /* 定时器的时钟节拍个数 */ U16 info ); /* 定时器回调函数的参数,可用于区分不同的定时器 */ 函数描述: 函数os_tmr_create用于创建定时器组并启动定时器,定时时间到后调用回调函数os_tmr_call。函数os_tmr_create的第二个参数也会传递给回调函数os_tmr_call用于区分不同的定时器。 u 第1个参数填写定时器的时钟节拍个数。范围0-0xFFFF。 u 第2个参数填写回调函数的参数,可用于区分不同的定时器。 u 定时器创建成功的话会返回定时器的ID标识,失败的话返回NULL。 使用举例: 复制代码 #include /* 定时器句柄 */ OS_ID OneShotTimerID1; __task void task1 (void) { .. OneShotTimerID1= os_tmr_create (10, 1); if (OneShotTimerID1 == NULL) { printf ("创建失败n"); } .. } |
|
|
|
|
|
|
|
|
17.2.2 函数os_tmr_call
函数原型: 复制代码 void os_tmr_call ( U16 info ); /*定时器回调函数的参数,可用于区分不同的定时器*/ 函数描述: 当函数os_tmr_create设置的定时时间到后调用回调函数os_tmr_call。函数os_tmr_create的第二个参数也会传递给回调函数os_tmr_call用于区分不同的定时器。此函数执行完毕后,通过函数os_tmr_create创建的定时器会被删除,下次使用需要重新创建。 u 此函数的参数不需要用户去添加,系统会自动将函数os_tmr_create第二个参数赋值给这个参数。 使用举例: 复制代码 #include void os_tmr_call (U16 info) { /* 定时器回调函数中仅支持isr_开头的系统函数,os_开头的不支持,此回调函数是在 滴答定时器中断中执行的。 */ switch(info) { case 1: /* 参数为1 */ isr_sem_send (&semaphore); break; case 2: /* 参数为2 */ bsp_LedToggle(1); break; } } |
|
|
|
|
|
|
|
|
17.3 实验例程说明
17.3.1 STM32F103开发板实验 配套例子: V4-416_RTX实验_定时器组 实验目的: 1. 学习RTX的定时器组 2. RTX的定时器仅支持单次,不支持周期性执行,如果需要周期执行,需要重复创建 3. 定时器回调函数os_tmr_call中仅支持isr_开头的系统函数,os_开头的不支持,此回调函数是在滴答定时器中断中执行的。 4. 回调函数os_tmr_call在文件RTX_Conf_CM.c文件中。 实验内容: 1.K1按键按下,串口打印。 2.K2键按下,创建单次定时器,10个系统时钟节拍后在定时器回调函数中给任务AppTaskMsgPro发信号量同步信号。 3.K3键按下,创建单次定时器,10个系统时钟节拍后在定时器回调函数翻转LED1。 4.各个任务实现的功能如下: AppTaskUserIF任务 :按键消息处理。 AppTaskLED任务 :LED闪烁。 AppTaskMsgPro任务 :消息处理,等待RTX定时器发来的信号量同步信号。 AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。 |
|
|
|
|
|
|
|
|
RTX配置:
RTX配置向导详情如下: u Task Configuration l Number of concurrent running tasks 允许创建4个任务,实际创建了如下四个任务: AppTaskUserIF任务 :按键消息处理。 AppTaskLED任务 :LED闪烁。 AppTaskMsgPro任务 :消息处理,等待RTX定时器发来的信号量同步信号。 AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。 l Number of tasks with user-provided stack 创建的4个任务都是采用自定义堆栈方式。 l Number of user timers 范围1 – 250,表示用户定时器个数。 这里创建了1个用户定时器。 |
|
|
|
|
|
|
|
|
RTX初始化:
复制代码 /* ********************************************************************************************************* * 函 数 名: main * 功能说明: 标准c程序入口。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ int main (void) { /* 初始化外设 */ bsp_Init(); /* 创建启动任务 */ os_sys_init_user (AppTaskStart, /* 任务函数 */ 4, /* 任务优先级 */ &AppTaskStartStk, /* 任务栈 */ sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */ while(1); } |
|
|
|
|
|
|
|
|
RTX任务创建:
复制代码 /* ********************************************************************************************************* * 函 数 名: AppTaskCreate * 功能说明: 创建应用任务 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ static void AppTaskCreate (void) { HandleTaskUserIF = os_tsk_create_user(AppTaskUserIF, /* 任务函数 */ 1, /* 任务优先级 */ &AppTaskUserIFStk, /* 任务栈 */ sizeof(AppTaskUserIFStk)); /* 任务栈大小,单位字节数 */ HandleTaskLED = os_tsk_create_user(AppTaskLED, /* 任务函数 */ 2, /* 任务优先级 */ &AppTaskLEDStk, /* 任务栈 */ sizeof(AppTaskLEDStk)); /* 任务栈大小,单位字节数 */ HandleTaskMsgPro = os_tsk_create_user(AppTaskMsgPro, /* 任务函数 */ 3, /* 任务优先级 */ &AppTaskMsgProStk, /* 任务栈 */ sizeof(AppTaskMsgProStk)); /* 任务栈大小,单位字节数 */ } |
|
|
|
|
|
|
|
|
创建信号量:
复制代码 OS_SEM semaphore; /* ********************************************************************************************************* * 函 数 名: AppObjCreate * 功能说明: 创建任务通信机制 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ static void AppObjCreate (void) { /* 创建信号量计数值是0, 用于任务同步 */ os_sem_init (&semaphore, 0); } |
|
|
|
|
|
|
|
|
定时器回调函数的实现,在文件RTX_Conf_CM.c:
复制代码 /*--------------------------- os_tmr_call -----------------------------------*/ #include "bsp.h" extern OS_SEM semaphore; void os_tmr_call (U16 info) { /* This function is called when the user timer has expired. Parameter */ /* 'info' holds the value, defined when the timer was created. */ /* HERE: include optional user code to be executed on timeout. */ /* 定时器回调函数中仅支持isr_开头的系统函数,os_开头的不支持,此回调函数是在 滴答定时器中断中执行的。 */ switch(info) { case 1: /* 参数为1 */ isr_sem_send (&semaphore); break; case 2: /* 参数为2 */ bsp_LedToggle(1); break; } } |
|
|
|
|
|
|
|
|
17.3.2 STM32F407开发板实验
配套例子: V4-416_RTX实验_定时器组 实验目的: 1. 学习RTX的定时器组。 2. RTX的定时器仅支持单次,不支持周期性执行,如果需要周期执行,需要重复创建。 3. 定时器回调函数os_tmr_call中仅支持isr_开头的系统函数,os_开头的不支持,此回调函数是在滴答定时器中断中执行的。 4. 回调函数os_tmr_call在文件RTX_Conf_CM.c文件中。 实验内容: 1.K1按键按下,串口打印。 2.K2键按下,创建单次定时器,10个系统时钟节拍后在定时器回调函数中给任务AppTaskMsgPro发信号量同步信号。 3.K3键按下,创建单次定时器,10个系统时钟节拍后在定时器回调函数翻转LED1。 4.各个任务实现的功能如下: AppTaskUserIF任务 :按键消息处理。 AppTaskLED任务 :LED闪烁。 AppTaskMsgPro任务 :消息处理,等待RTX定时器发来的信号量同步信号。 AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。 |
|
|
|
|
|
|
|
|
RTX配置:
RTX配置向导详情如下: u Task Configuration l Number of concurrent running tasks 允许创建4个任务,实际创建了如下四个任务: AppTaskUserIF任务 :按键消息处理。 AppTaskLED任务 :LED闪烁。 AppTaskMsgPro任务 :消息处理,等待RTX定时器发来的信号量同步信号。 AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。 l Number of tasks with user-provided stack 创建的4个任务都是采用自定义堆栈方式。 l Number of user timers 范围1 – 250,表示用户定时器个数。 这里创建了1个用户定时器。 |
|
|
|
|
|
|
|
|
程序设计:
u 任务栈大小分配: staticuint64_t AppTaskUserIFStk[512/8]; /* 任务栈 */ staticuint64_t AppTaskLEDStk[256/8]; /* 任务栈 */ staticuint64_t AppTaskMsgProStk[512/8]; /* 任务栈 */ staticuint64_t AppTaskStartStk[512/8]; /* 任务栈 */ 将任务栈定义成uint64_t类型可以保证任务栈是8字节对齐的,8字节对齐的含义就是数组的首地址对8求余等于0。如果不做8字节对齐的话,部分C语言库函数,浮点运算和uint64_t类型数据运算会出问题。 u 系统栈大小分配: |
|
|
|
|
|
|
|
|
RTX初始化:
复制代码 /* ********************************************************************************************************* * 函 数 名: main * 功能说明: 标准c程序入口。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ int main (void) { /* 初始化外设 */ bsp_Init(); /* 创建启动任务 */ os_sys_init_user (AppTaskStart, /* 任务函数 */ 4, /* 任务优先级 */ &AppTaskStartStk, /* 任务栈 */ sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */ while(1); } |
|
|
|
|
|
|
|
528 浏览 0 评论
654 浏览 0 评论
858 浏览 0 评论
837 浏览 0 评论
RT-Thread与英飞凌(infineon)合作得板子PSOC 6 板子学习
770 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
17060 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-14 13:00 , Processed in 1.157685 second(s), Total 105, Slave 86 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖