Q群:
电话:
邮箱:
地址:
函数 | 说明 |
---|---|
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设备 |
该函数根据 Clockevent设备名查找对应的 Clockevent设备,函数原型如下:
os_device_t *os_device_find(const char *name);
参数 | 说明 |
---|---|
name | 硬件clockevent设备名称 |
返回 | 说明 |
clockevent设备指针 | 查找到对应设备将返回相应的设备指针 |
OS_NULL | 没有找到设备 |
该函数通过设备指针打开设备,第一次打开设备会调用设备初始化接口,函数原型如下:
os_err_t os_device_open(os_device_t *dev, os_uint16_t oflag);
参数 | 说明 |
---|---|
dev | 硬件clockevent设备指针 |
oflag | 0 |
返回 | 说明 |
OS_EOK | 设备打开成功 |
其他错误码 | 设备打开失败 |
该函数用于关闭Clockevent设备,函数原型如下:
os_err_t os_device_close(os_device_t *dev);
参数 | 说明 |
---|---|
dev | clockevent设备指针 |
返回 | 说明 |
OS_EOK | 关闭设备成功 |
OS_ERROR | 设备已经完全关闭,不能重复关闭设备 |
其他错误码 | 关闭设备失败 |
该函数用于设置Clockevent超时中断函数,当Clockevent超时将会调用,函数原型如下:
void os_clockevent_register_isr(os_clockevent_t *ce, void (*event_handler)(os_clockevent_t *ce));
参数 | 说明 |
---|---|
ce | clockevent设备指针 |
event_handler | 超时中断函数 |
返回 | 说明 |
无 | 无 |
该函数用于单次触发方式启动Clockevent,函数原型如下:
void os_clockevent_start_oneshot(os_clockevent_t *ce, os_uint64_t nsec);
参数 | 说明 |
---|---|
ce | clockevent设备指针 |
nsec | 定时事件,单位:纳秒 |
返回 | 说明 |
无 | 无 |
该函数用于周期触发方式启动Clockevent,函数原型如下:
void os_clockevent_start_period(os_clockevent_t *ce, os_uint64_t nsec);
参数 | 说明 |
---|---|
ce | clockevent设备指针 |
nsec | 定时事件,单位:纳秒 |
返回 | 说明 |
无 | 无 |
该函数用于停止Clockevent设备,函数原型如下:
void os_clockevent_stop(os_clockevent_t *ce);
参数 | 说明 |
---|---|
ce | clockevent设备指针 |
返回 | 说明 |
无 | 无 |
硬件Clockevent设备的具体使用方式和步骤如下所示:
#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>