全部文档
OneOS简介 硬件支持 编译构造工具 API参考文档 高级语言 用户编程手册 应用笔记 FAQ

Clockevent设备


API 列表

函数 说明
os_device_find() 查找Clockevent设备
os_device_open() 打开Clockevent设备
os_device_close() 关闭Clockevent设备
os_clockevent_register_isr() 设置Clockevent设备超时中断函数
os_clockevent_start_oneshot() 单次触发方式启动Clockevent设备
os_clockevent_start_period() 周期触发方式启动Clockevent设备
os_clockevent_stop() 停止Clockevent设备

os_device_find

该函数根据 Clockevent设备名查找对应的 Clockevent设备,函数原型如下:

os_device_t *os_device_find(const char *name);
参数 说明
name 硬件clockevent设备名称
返回 说明
clockevent设备指针 查找到对应设备将返回相应的设备指针
OS_NULL 没有找到设备

os_device_open

该函数通过设备指针打开设备,第一次打开设备会调用设备初始化接口,函数原型如下:

os_err_t os_device_open(os_device_t *dev, os_uint16_t oflag);
参数 说明
dev 硬件clockevent设备指针
oflag 0
返回 说明
OS_EOK 设备打开成功
其他错误码 设备打开失败

os_device_close

该函数用于关闭Clockevent设备,函数原型如下:

os_err_t os_device_close(os_device_t *dev);
参数 说明
dev clockevent设备指针
返回 说明
OS_EOK 关闭设备成功
OS_ERROR 设备已经完全关闭,不能重复关闭设备
其他错误码 关闭设备失败

os_clockevent_register_isr

该函数用于设置Clockevent超时中断函数,当Clockevent超时将会调用,函数原型如下:

void os_clockevent_register_isr(os_clockevent_t *ce, void (*event_handler)(os_clockevent_t *ce));
参数 说明
ce clockevent设备指针
event_handler 超时中断函数
返回 说明

os_clockevent_start_oneshot

该函数用于单次触发方式启动Clockevent,函数原型如下:

void os_clockevent_start_oneshot(os_clockevent_t *ce, os_uint64_t nsec);
参数 说明
ce clockevent设备指针
nsec 定时事件,单位:纳秒
返回 说明

os_clockevent_start_period

该函数用于周期触发方式启动Clockevent,函数原型如下:

void os_clockevent_start_period(os_clockevent_t *ce, os_uint64_t nsec);
参数 说明
ce clockevent设备指针
nsec 定时事件,单位:纳秒
返回 说明

os_clockevent_stop

该函数用于停止Clockevent设备,函数原型如下:

void os_clockevent_stop(os_clockevent_t *ce);
参数 说明
ce clockevent设备指针
返回 说明

使用示例

Clockevent设备使用示例

硬件Clockevent设备的具体使用方式和步骤如下所示:

  1. 首先根据Clockevent设备名称tim15查找设备获取设备指针。
  2. 打开设备tim15。
  3. 设置Clockevent超时中断函数。
  4. 以单次触发模式启动Clockevent,超时时间为1秒,观察1秒后的中断回调。
  5. 以周期触发模式启动Clockevent,周期为1秒,中断回调每隔1秒触发一次。
#include <drv_cfg.h>
#include <os_device.h>
#include <os_errno.h>
#include <os_clock.h>
#include <stdlib.h>
#include <timer/clocksource.h>
#include <timer/clockevent.h>
#include <shell.h>

#define DRV_EXT_LVL DBG_EXT_INFO
#define DRV_EXT_TAG "clockevent_test"
#include <drv_log.h>

static int timeout_count = 0;
static int timeout_callback_print = 1;

static void timeout_callback(os_clockevent_t * ce)
{
    timeout_count++;

    if (timeout_callback_print)
    {
        LOG_EXT_I("clockevent timeout callback");
    }
}

static int clockevent_test(int argc, char *argv[])
{
    int i;
    int ret;

    os_clockevent_t *ce;

    if (argc != 2)
    {
        LOG_EXT_I("usage: clockevent_test <dev>");
        LOG_EXT_I("       clockevent_test tim1");
        return -1;
    }

    ce = (os_clockevent_t *)os_device_find(argv[1]);
    if (ce == OS_NULL)
    {
        LOG_EXT_I("invalid device %s", argv[1]);
        return -2;
    }

    ret = os_device_open((os_device_t *)ce, 0);
    if (ret != OS_EOK)
    {
        LOG_EXT_I("device %s open failed:%d", argv[1], ret);
        return -3;
    }

    os_task_t *self = os_task_self();
    os_uint8_t task_prio = self->current_priority;
    os_uint8_t high_prio = 1;
    os_task_control(self, OS_TASK_CTRL_CHANGE_PRIORITY, &high_prio);

    os_clockevent_register_isr(ce, timeout_callback);

    /* sync tick */
    os_task_msleep(1);

    /* 1.oneshot mode */
    for (i = 0; i < 3; i++)
    {
        LOG_EXT_I("clockevent onshot start %d", i);        
        os_clockevent_start_oneshot(ce, NSEC_PER_SEC);
        os_task_msleep(2000);
    }

    LOG_EXT_I("clockevent onshot before stop.");

    os_clockevent_stop(ce);
    os_task_msleep(2000);

    LOG_EXT_I("clockevent onshot after stop.");

    /* 2.period mode */
    LOG_EXT_I("clockevent period start...");    
    os_clockevent_start_period(ce, NSEC_PER_SEC);
    os_task_msleep(10500);

    LOG_EXT_I("clockevent period before stop.");

    os_clockevent_stop(ce);
    os_task_msleep(2000);

    LOG_EXT_I("clockevent period after stop.");

    os_device_close((os_device_t *)ce);

    os_task_control(self, OS_TASK_CTRL_CHANGE_PRIORITY, &task_prio);

    return 0;
}

SH_CMD_EXPORT(clockevent_test, clockevent_test, "clockevent_test");

运行结果如下:

sh>
sh>clockevent_test tim15
[2426] I/clockevent_test tshell: clockevent onshot start 0 [clockevent_test][91]
[2526] I/clockevent_test ISR: clockevent timeout callback [timeout_callback][46]
[2626] I/clockevent_test tshell: clockevent onshot start 1 [clockevent_test][91]
[2726] I/clockevent_test ISR: clockevent timeout callback [timeout_callback][46]
[2826] I/clockevent_test tshell: clockevent onshot start 2 [clockevent_test][91]
[2926] I/clockevent_test ISR: clockevent timeout callback [timeout_callback][46]
[3026] I/clockevent_test tshell: clockevent onshot before stop. [clockevent_test][96]
[3226] I/clockevent_test tshell: clockevent onshot after stop. [clockevent_test][101]
[3226] I/clockevent_test tshell: clockevent period start... [clockevent_test][104]
[3327] I/clockevent_test ISR: clockevent timeout callback [timeout_callback][46]
[3427] I/clockevent_test ISR: clockevent timeout callback [timeout_callback][46]
[3527] I/clockevent_test ISR: clockevent timeout callback [timeout_callback][46]
[3627] I/clockevent_test ISR: clockevent timeout callback [timeout_callback][46]
[3727] I/clockevent_test ISR: clockevent timeout callback [timeout_callback][46]
[3827] I/clockevent_test ISR: clockevent timeout callback [timeout_callback][46]
[3927] I/clockevent_test ISR: clockevent timeout callback [timeout_callback][46]
[4027] I/clockevent_test ISR: clockevent timeout callback [timeout_callback][46]
[4127] I/clockevent_test ISR: clockevent timeout callback [timeout_callback][46]
[4227] I/clockevent_test ISR: clockevent timeout callback [timeout_callback][46]
[4277] I/clockevent_test tshell: clockevent period before stop. [clockevent_test][108]
[4478] I/clockevent_test tshell: clockevent period after stop. [clockevent_test][113]
sh>

results matching ""

    No results matching ""

    返回顶部