声明:此文档只做学习交流使用,请勿用作其他商业用途
author:朝阳_tony
E-mail : linzhaolover@gmail.com
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~