intel dpdk api rte_eal_hpet_init() 函数介绍

声明:此文档只做学习交流使用,请勿用作其他商业用途

author:朝阳_tony
E-mail : [email protected]
Create Date: 2013-7-11 17:17:51  Thursday
Last Change: 2013-7-11 17:48:07 Thursday

转载请注明出处:http://blog.csdn.net/linzhaolover


此文中源码可以去http://dpdk.org/dev 网页中下载;更多官方文档请访问http://dpdk.org



1、hpet相关介绍


HPET时钟支持。允许内核使用 HPET 。HPET是替代8254芯片的新一代定时器,i686及以上级别的主板都支持,可以安全的选上。但是,HEPT只会在支持它的平台和BIOS上运行。如 果不支持,8254将会激活。选N,将继续使用8254时钟。

2、函数用途

rte_eal_hpet_init()主要用于系统hpet的初始化;包括打开设备描述符/dev/hpet;映射地址空间,创建hpet_msb_inc线程等;

3、函数详解

fd = open(DEV_HPET, O_RDONLY);
去打开/dev/hpet设备文件描述符;

 eal_hpet = mmap(NULL, 1024, PROT_READ, MAP_SHARED, fd, 0);
映射一块1024大小的内存空间;

ret = pthread_create(&msb_inc_thread_id, NULL, hpet_msb_inc, NULL);
创建hpet_msb_inc线程;

在线程里主要是更新eal_hpet_msb这全局的变量;
static __attribute__((noreturn)) void *
hpet_msb_inc(__attribute__((unused)) void *arg)
{
    uint32_t t;

    while (1) {
        t = (eal_hpet->counter_l >> 30);
        if (t != (eal_hpet_msb & 3))
            eal_hpet_msb ++;
        sleep(10);
    }
}


之所以用hpet模块,我想可能是dpdk需要一个更加精准的时钟;去执行延时等操作;

在程序中用的比较多的是下面这个函数,用于微妙的延迟;
void
rte_delay_us(unsigned us)
{
    uint64_t start;
    uint64_t ticks;
    ticks = (uint64_t)us * 1000ULL * 1000ULL * 1000ULL;
    ticks /= eal_hpet_resolution_fs;
    start = rte_get_hpet_cycles();
    while ((rte_get_hpet_cycles() - start) < ticks)
        rte_pause();
}

而上面用的rte_get_hpet_cycles()是为了获取那个全局的变量eal_hpet_msb的值,去确定延时是否到达;


技术水平有待提高,如有不对的地方希望读者指正,互相学习;O(∩_∩)O~


你可能感兴趣的:(intel,dpdk)