博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TI-RTOS 定时器的使用
阅读量:4311 次
发布时间:2019-06-06

本文共 6073 字,大约阅读时间需要 20 分钟。

定时器 在TI-RTOS中属于内核的一部分,因此想了解它的使用还是要阅读Bios_User_Guide.pdf.

主要用到这么几个API, 加粗字体 更多的定义可以在 ..\packages\ti\sysbios\knl\Clock中查看。

#define Clock_construct ti_sysbios_knl_Clock_construct

#define Clock_create ti_sysbios_knl_Clock_create
#define Clock_handle ti_sysbios_knl_Clock_handle
#define Clock_struct ti_sysbios_knl_Clock_struct
#define Clock_Handle_label ti_sysbios_knl_Clock_Handle_label
#define Clock_Handle_name ti_sysbios_knl_Clock_Handle_name
#define Clock_Instance_init ti_sysbios_knl_Clock_Instance_init
#define Clock_Object_count ti_sysbios_knl_Clock_Object_count
#define Clock_Object_get ti_sysbios_knl_Clock_Object_get
#define Clock_Object_first ti_sysbios_knl_Clock_Object_first
#define Clock_Object_next ti_sysbios_knl_Clock_Object_next
#define Clock_Object_sizeof ti_sysbios_knl_Clock_Object_sizeof
#define Clock_Params_copy ti_sysbios_knl_Clock_Params_copy
#define Clock_Params_init ti_sysbios_knl_Clock_Params_init

 

工作模式可是单次溢出,也可以是反复溢出。Clock_create()第二个参数用来指定首次溢出的时间,单位应该还是10us, 如果想要反复的事件,则要在第三个参数中指明周期,赋值.period为0,表示单次,非0的值就会产生周期事件了。一旦溢出产生,则会执行一次溢出功能函数, 这个函数是Clock_create的第一个参数所指向的函数。它的工作原理示意图如下:

 

好了,我们老规矩,来演示一下它的应用。这里用定时器来控制灯,500ms状态改变一次。全部的代码如下:

/**************************************************************************************************

Filename:       timerDemoTask.c
Editor:         Tome @ newbit
Revised:        $Date: 2016-8-10 11:20:02 +0800  $
Revision:       $Revision: 00001 $

Description:    了解 TI-RTOS的使用之,Timer

History:       
Notes:          要了解到这部分的接口,可阅读TI文档
                1. TI-RTOS 2.20  User's Guide.pdf
                2. Bios User Guide.pdf

 硬件平台  CC1130_LAUNCHPAD Rev1.3   

**************************************************************************************************/

 

/**************************************************************************************************

// INCLUDES
**************************************************************************************************/
/* XDCtools Header files */
#include <xdc/std.h>
#include <xdc/runtime/System.h>
#include <xdc/runtime/Error.h> //新加

/* BIOS Header files */

#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
#include <ti/sysbios/knl/Clock.h>       // 新加

/* TI-RTOS Header files */

#include <ti/drivers/PIN.h>

 

#include "board.h"

/**************************************************************************************************
// TYPEDEF
**************************************************************************************************/

 

/**************************************************************************************************

// CONSTANTS
**************************************************************************************************/
#define TASKSTACKSIZE     768

/**************************************************************************************************
// LOCAL VERIABLE
**************************************************************************************************/
Task_Struct timerDemoTaskStruct;
Char timerDemoTaskStack[TASKSTACKSIZE];               // 本任务的栈空间,静态分配

PIN_Handle ledPinHandle;                                // 将LED操作句柄作为全局变量

/* Global memory storage for a PIN_Config table */

static PIN_State ledPinState;

/*
 * Application timerDemo pin configuration table:
 *   - All timerDemos board timerDemos are off.
 */
PIN_Config ledPinTable[] = {
    Board_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
    Board_LED2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
    PIN_TERMINATE
};

/**************************************************************************************************
// FUNCTIONS DECLERATION
**************************************************************************************************/
Void timerDemoFxn(UArg arg0, UArg arg1);
void myHandler(xdc_UArg arg0);

/**************************************************************************************************
// FUNCTIONS
**************************************************************************************************/

 

/**************************************************************************************************

 * @fn      timerDemoTaskAdd
 *
 * @brief  
 *
 * @param   void
 *
 * @return  void
 **************************************************************************************************/
void timerDemoTaskAdd(void)
{
  Task_Params taskParams;
 
  /* Construct BIOS objects */
    Task_Params_init(&taskParams); // 创建任务所要的参数,都设置为默认值
    taskParams.stackSize = TASKSTACKSIZE; // 栈空间
    taskParams.stack = &timerDemoTaskStack;     // 栈地址
    // 向bios 传递参数,建立控制灯的任务
    Task_construct(&timerDemoTaskStruct, (Task_FuncPtr)timerDemoFxn, &taskParams, NULL);
}

 

// 演示定时器的任务
Void timerDemoFxn(UArg arg0, UArg arg1)
{
 
  // 这里不是为了初始化,而是为了拿到操作的句柄 (handle)
  // 函数说明:Allocate one or more pins for a driver or an application.
  ledPinHandle = PIN_open(&ledPinState, ledPinTable);
  if(!ledPinHandle) {
    System_abort("Error initializing board LED pins\n");
  }   
 
  // 点亮第一个LED灯
  PIN_setOutputValue(ledPinHandle, Board_LED1, 1); 
 
 
  // 开始初始化一个 Timer
  Clock_Params clockParams;
  Clock_Handle myClock;
  Error_Block  eb;
 
  Error_init(&eb);
 
  Clock_Params_init(&clockParams);
  clockParams.period = 100 * 500;       // 500ms, 闪灯的频率为1hz
  clockParams.startFlag = TRUE;
  clockParams.arg  = (UArg)0x5555;
  myClock = Clock_create(myHandler, 5, &clockParams, &eb);
  if ( myClock == NULL )
  {
    System_abort("Clock create failed\n");
  }
  // Timer 配置结束
 
 
  // 该任务的主体只有休眠
  while(1)
  {
    // 任务休眠 1 秒,  1000000us, 下面函数的单位是10us
    Task_sleep(100000);
  }
 
}

/**************************************************************************************************
 * @fn      myHanlder
 *
 * @brief   定时器溢出时的执行函数
 *
 * @param   xdc_UArg arg0
 *
 * @return  void
 **************************************************************************************************/
void myHandler(xdc_UArg arg0)
{
 
  uint_t ledState;
    // 读LED 灯的状态,再设置为相反的状态
    ledState = PIN_getOutputValue(Board_LED2);
    ledState = !ledState;
    // 设置的操作需要 handle
    PIN_setOutputValue(ledPinHandle, Board_LED2, ledState);
   
}

/**************************************************************************************************
Copyright 2016 Newbit Studio. All rights reserved.
**************************************************************************************************/

 

转载于:https://www.cnblogs.com/newbit/p/ti_rtos_clock.html

你可能感兴趣的文章
详细理解“>/dev/null 2>&1”
查看>>
suse如何创建定时任务?
查看>>
suse搭建ftp服务器方法
查看>>
centos虚拟机设置共享文件夹并通过我的电脑访问[增加smbd端口修改]
查看>>
文件拷贝(IFileOperation::CopyItem)
查看>>
MapReduce的 Speculative Execution机制
查看>>
大数据学习之路------借助HDP SANDBOX开始学习
查看>>
Hadoop基础学习:基于Hortonworks HDP
查看>>
为什么linux安装程序 都要放到/usr/local目录下
查看>>
Hive安装前扫盲之Derby和Metastore
查看>>
永久修改PATH环境变量的几种办法
查看>>
大数据学习之HDP SANDBOX开始学习
查看>>
Hive Beeline使用
查看>>
Centos6安装图形界面(hdp不需要,hdp直接从github上下载数据即可)
查看>>
CentOS7 中把yum源更换成163源
查看>>
关于yum Error: Cannot retrieve repository metadata (repomd.xml) for repository:xxxxxx.
查看>>
2020-11-18
查看>>
Docker面试题(二)
查看>>
【NOI 2018】归程(Kruskal重构树)
查看>>
注册用户
查看>>