VxWorks下的辅助时钟

概述

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左右。

下一篇
« Prev Post
上一篇
Next Post »