linux kernel 获取时间函数api

学习链接:

https://www.kernel.org/doc/html/latest/core-api/timekeeping.html

 

最近在学习内核获取时间api函数随手挑了几个记录下方便以后用,如下:

内核态常用获取纳秒的函数。u64是unsigned long long类型的数据类型,打印用%llu。

基本的基于时间的接口:

ktime_t ktime_get(void)// 用于可靠的时间戳和精确测量短时间间隔。在系统启动时启动,但在挂起期间停止

ktime_t ktime_get_boottime(void)//类似于ktime_get,但是但在挂起时不会停止例如,这可用于需要通过挂起操作与其他计算机同步的密钥过期时间。

ktime_t ktime_get_real(void)//返回相对于1970年的时间,类似于用户态的gettimeofday.这适用于需要在重新启动期间保持的所有时间戳,如inode时间,但在内部使用时应避免使用,因为它可能由于从用户空间执行的闰秒更新、NTP adjustment settimeofday()操作而向后跳转

ktime_t ktime_get_raw(void)//类似于ktime_get,但运行速度与硬件时钟源相同,而不需要(NTP)调整时钟漂移。这在内核中也很少需要。

根据用户的要求,有一些变量以不同的格式返回时间:

u64 ktime_get_ns(void)

u64 ktime_get_boottime_ns(void)

u64 ktime_get_real_ns(void)

u64 ktime_get_clocktai_ns(void)

u64 ktime_get_raw_ns(void)

 

time64_t ktime_get_seconds(void)

time64_t ktime_get_boottime_seconds(void)

time64_t ktime_get_real_seconds(void)

time64_t ktime_get_clocktai_seconds(void)

time64_t ktime_get_raw_seconds(void)

 

计算程序的运行时间:

 unsigned long old_tns, old_ts,now_ns, now_ts;

       old_ns= ktime_get();    

{

程序段

}
now_ns= ktime_get();
时间差 diff = now_ns -old_ns;

另外还有一个宏做除法

比如需要打印时间戳时

old_ns= ktime_get();    

old_ts = do_div(old_ns, 1000000000);//宏做除法运算  old_ns 保留剩余的ns ,ts秒数

printk("time [%05lu:%06lu]----------- \n",old_ts, (old_ns/1000));//  (old_ns/1000) 是微秒   -----------》可以打印时间戳

注意:多核使用情况,如果你发现时间t1超前与t2,说明是多核影响的。

 

#include <linux/timer.h>
#include <linux/timex.h>
#include <linux/rtc.h>

/*添加到合适位置*/

struct timex  txc;
struct rtc_time tm;
do_gettimeofday(&(txc.time));
rtc_time_to_tm(txc.time.tv_sec,&tm);
printk(“UTC time :%d-%d-%d %d:%d:%d /n”,tm.tm_year+1900,tm.tm_mon, tm.tm_mday,tm.tm_hour,tm.tm_min,tm.tm_sec);

 

 

有不合适之处请指正

regmap_access_table函数Linux内核中regmap API提供的一个函数,用于定义寄存器访问表(register access table),即指定寄存器的访问权限。寄存器访问表是一个由struct regmap_access_table结构体数组组成的表格,每个结构体指定了一个寄存器的地址、大小和访问权限。 在Linux内核中,使用regmap_access_table函数需要按照以下步骤进行: 1. 定义struct regmap_access_table结构体数组:这个数组中的每个元素表示一个寄存器的访问权限。每个元素包含三个字段:reg(寄存器地址)、val_bits(寄存器大小)和writeable(写权限)。例如,以下代码定义了一个包含两个元素的struct regmap_access_table结构体数组: ``` static const struct regmap_access_table my_device_access_table[] = { { 0x00, 4, true }, { 0x04, 4, false }, }; ``` 这个结构体数组表示定义了两个寄存器,第一个寄存器的地址为0x00,大小为4字节,可读可写;第二个寄存器的地址为0x04,大小为4字节,只读不可写。 2. 在regmap_init函数中使用定义好的访问表:在调用regmap_init函数进行寄存器映射初始化,可以使用定义好的访问表作为参数传递给regmap_init函数的access_table参数,例如: ``` regmap_init_mmio(my_device->base_addr, ..., &my_device_access_table); ``` 这样,在访问寄存器,regmap API会根据访问表的定义来判断寄存器的访问权限,并做出相应的操作。 总的来说,使用regmap_access_table函数需要定义一个struct regmap_access_table结构体数组,并在regmap_init函数中使用访问表作为参数传递给regmap API。这样,在访问寄存器,regmap API会根据访问表的定义来判断寄存器的访问权限,并做出相应的操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值