概述
VxWorks系统为开发人员提供了一个辅助时钟(Auxiliary Clock),这个辅助时钟与系统时钟使用不同的时钟源,供用户在需要时间精度较高的场合定时使用。
注意
小编认为,对于vxWorks实时系统而言,定时是很有必要的,在对一些任务进行周期控制的时候,考虑到定时的准确性和精度,小编的大部分做法是通过辅助时钟定时,然后使用同步信号量,唤醒任务,达到定时的目的。
接口
官方提供的关于辅助时钟的相关接口主要包含在timerDev.h和bsp.h头文件中。
重要宏定义
/* 重要宏定义 bsp.h */
# define AUX_CLK_RATE_MIN (2) /* minimum auxiliary clock rate */
# define AUX_CLK_RATE_MAX (8192) /* maximum auxiliary clock rate */
使能和失能辅助时钟
/**
* @使能/失能辅助时钟 sysAuxClkDisable(失能) sysAuxClkEnable(使能)
*/
IMPORT void sysAuxClkDisable (void);
IMPORT void sysAuxClkEnable (void);
辅助时钟中断挂接
/**
* @辅助时钟中断挂接
* @routine: 中断处理函数 arg:参数。
* @成功返回OK,失败返回其它。
*/
IMPORT STATUS sysAuxClkConnect (FUNCPTR routine, _Vx_usr_arg_t arg);
获取和设定辅助时钟片
/**
* @获取辅助时钟片的值
* @返回辅助时钟片的值
*/
IMPORT int sysAuxClkRateGet (void);
/**
* @设定辅助时钟片
* @ticksPerSecond: 以秒为单位,表示1s内辅助时钟中断次数。
* @成功返回OK,失败返回其它。
*/
IMPORT STATUS sysAuxClkRateSet (int ticksPerSecond);
示例
- 示例通过辅助时钟定时中断为time_cnt计数,主任务每隔1s钟输出time_cnt的计数值,从而判断定时是否准确。
- 示例仅用于展示辅助时钟的应用,代码内容并无实际意义,在实际应用中,中断与任务之间最好通过信号量进行同步,而且不推荐使用全局变量,容易造成资源竞争的问题。
- 包含演示程序main.c(已验证通过)。
/**
* @Filename : main.c
* @Revision : $Revision: 1.00 $
* @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅)
* @Description : 辅助时钟使用示例
**/
#include
#include
#include "stdioLib.h"
#include "strLib.h"
#include "feng_type.h"
#include
#include
#include
#define SYS_TIMER_MAX 72000 /* 定时器计数最大值 72s */
#define SYS_TIMER_PERIOD 1024 /* 1秒钟中断1024次 */
static u64_t timer_cnt = 0;
/**
* @ 定时器中断服务线程
**/
static void timer_isr(void)
{
timer_cnt++;
if (timer_cnt >= SYS_TIMER_MAX) /* 计数值达到最大,清空重新计数 */
timer_cnt = 0;
}
/**
* @ 设置系统辅助时钟,挂接ISR和时钟基准设置
* @ time - 定时周期
**/
static void set_aux_time(u32_t time)
{
sysAuxClkDisable();
sysAuxClkConnect((FUNCPTR)timer_isr, 0); /* 挂接ISR */
sysAuxClkRateSet(time); /* 设置辅助时钟时间片 */
sysAuxClkEnable(); /* 使能辅助时钟 */
}
/**
* @ 时钟初始化,设置定时周期,挂接中断函数等
**/
static void aux_timer_init(void)
{
set_aux_time(SYS_TIMER_PERIOD);
}
int main(void)
{
aux_timer_init(); /* 初始化辅助时钟 */
while (1) {
printf("timer_cnt is %d...\n", timer_cnt);
taskDelay(sysClkRateGet()); /* 延时1s */
}
return 0;
}
验证
镜像工程
1. 打开镜像工程,打开kernel Configuration。
2. 按住Ctrl+F,输入AUX,找到Auxillary clock,双击组件。
3. 选择Auxillary clock右键,选择Include,添加组件,由于小编已经添加过了,所以此处显示为灰色,添加成功后,组件会加粗显示。
4. 另外,我们可以看到辅助时钟设定范围为2-8192。该值跟bsp硬件有关。
5. 打开bsp的config.h文件,我们同样可以看到辅助时钟设定范围。
应用工程
1. 新建工程文件夹
2. 启动workbench,选择工程目录,然后点击OK。
3. 在Project Explorer窗口空白处右键,选择New->VxWorks Downloadable Kernel Module Project。
4. 输入Project name,选择Create project in workspace,然后点击Next。
5. 一路点击Next,直到出现如下界面,选择Active build spec为SIMNT diab,然后点击Finish。
6. 在工程名右键,依次点击New->File。
7. 输入文件名,然后点击Finish。
8. 输入相关测试代码。
9. 右键工程,选择Rebuild Project,开始编译工程。
10. 等待编译完成,终端会提示工程是否有错。
11. 此时,我们启动vxWorks。
12. 回到workbench,点击连接按钮,连接下位机。
13. 右键工程,依次点击Download->VxWorks Kernel Task。
14. 选择Launch the selected launch configuration,然后点击OK。
15. 回到vxWorks,输入入口函数,main,我们可以看到每隔1s输出time_cnt的值差为1024左右。