linux上的定时器上的jiffies,Linux kernel -- 定时器/jiffies

0. 测试环境

Linux 2.6.39 AT91SAM9G45

1. 定时器简单的测试例子

#include

#include

MODULE_LICENSE("GPL");

struct timer_list tm;

static int num;

static void func()

{

num++;

mod_timer(&tm, jiffies + HZ);

printk("Hello, timer :%d\n", num);

}

static int timer_init(void)

{

num = 0;

init_timer(&tm);

tm.expires = jiffies + HZ;

tm.function = func;

add_timer(&tm);

return 0;

}

static void timer_exit(void)

{

del_timer(&tm);

printk("remove timer\n");

}

module_init(timer_init);

module_exit(timer_exit);

Makefile

obj-m := timer.o

KERNEL := /Android/linux-2.6.39-android_altus

PWD := $(shell pwd)

modules:

$(MAKE) -C $(KERNEL) M=$(PWD) modules

.PHONEY:clean

clean:

rm -f *.o *.ko

insmod timer.ko

使用命令cat /proc/kmsg查看效果

2. jiffies和jiffies_64变量定义的位置

http://bbs.chinaunix.net/archiver/tid-1982818.html?page=2

jiffies_64获取的驱动部分代码

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define JIFFIES_64_DEVICE_NODE_NAME "jiffies_64"

#define JIFFIES_64_DEVICE_CLASS_NAME "jiffies_64"

#define JIFFIES_64_DEVICE_FILE_NAME "jiffies_64"

static unsigned long long value_of_jiffies_64;

static dev_t devno;

static struct class *jiffies_64_class;

static struct cdev jiffies_64_dev;

static ssize_t jiffies_64_read(struct file *filp, char __user *buf, size_t size, loff_t *f_pos)

{

if (buf == NULL || size != sizeof(value_of_jiffies_64))

return -EINVAL;

if (value_of_jiffies_64 == 0)

value_of_jiffies_64 = get_jiffies_64();

if (copy_to_user(buf, &value_of_jiffies_64, sizeof(value_of_jiffies_64)))

return -ENOMEM;

memset(&value_of_jiffies_64, 0, sizeof(value_of_jiffies_64));

return 0;

}

static ssize_t jiffies_64_open(struct inode *inode, struct file *filp)

{

return 0;

}

static ssize_t jiffies_64_release(struct inode *inode, struct file *filp)

{

return 0;

}

static struct file_operations jiffies_64_fops = {

.owner = THIS_MODULE,

.open = jiffies_64_open,

.read = jiffies_64_read,

.release = jiffies_64_release,

};

static ssize_t jiffies_64_val_show(struct device *dev, struct device_attribute *attr, char *buf);

static DEVICE_ATTR(val, S_IRUGO | S_IWUSR, jiffies_64_val_show, NULL);

static ssize_t jiffies_64_val_show(struct device *dev, struct device_attribute *attr, char *buf)

{

return snprintf(buf, PAGE_SIZE, "%lld\n", value_of_jiffies_64);

}

static int __init jiffies_64_init(void)

{

int err = -1;

struct device *device = NULL;

err = alloc_chrdev_region(&devno, 0, 1, JIFFIES_64_DEVICE_NODE_NAME);

if (err < 0) {

printk(KERN_ALERT"Failed to alloc char dev region.\n");

goto fail;

}

/* setup cdev */

cdev_init(&jiffies_64_dev, &jiffies_64_fops);

jiffies_64_dev.owner = THIS_MODULE;

err = cdev_add(&jiffies_64_dev, devno, 1);

if (err) {

printk(KERN_ALERT"cdev_add failed.\n");

goto unregister;

}

jiffies_64_class = class_create(THIS_MODULE, JIFFIES_64_DEVICE_CLASS_NAME);

if (IS_ERR(jiffies_64_class)) {

err = PTR_ERR(jiffies_64_class);

printk(KERN_ALERT"Failed to create jiffies_64 class\n");

goto destroy_cdev;

}

device = device_create(jiffies_64_class, NULL, devno, NULL, "%s", JIFFIES_64_DEVICE_FILE_NAME);

if (IS_ERR(device)) {

err = PTR_ERR(device);

printk(KERN_ALERT"Failed to create jiffies_64 device.\n");

goto destroy_class;

}

err = device_create_file(device, &dev_attr_val);

if (err < 0) {

printk(KERN_ALERT"Failed to create attribute val.\n");

goto destroy_device;

}

return 0;

destroy_device:

device_destroy(jiffies_64_class, devno);

destroy_class:

class_destroy(jiffies_64_class);

destroy_cdev:

cdev_del(&jiffies_64_dev);

unregister:

unregister_chrdev_region(devno, 1);

fail:

return err;

}

static void __exit jiffies_64_exit(void)

{

if (jiffies_64_class) {

device_destroy(jiffies_64_class, devno);

class_destroy(jiffies_64_class);

}

cdev_del(&jiffies_64_dev);

unregister_chrdev_region(devno, 1);

}

module_init(jiffies_64_init);

module_exit(jiffies_64_exit);

MODULE_LICENSE("GPL");

jiffies_64获取的应用部分代码

#include

#include

#include

#include

#include

#include

#define DEVICE_NODE_NAME "/dev/jiffies_64"

int main(int argc, char **argv)

{

unsigned long long jiffies_64; /* It's in userspace, so without trouble */

int fd = -1;

fd = open(DEVICE_NODE_NAME, O_RDONLY);

if (fd == -1) {

perror(DEVICE_NODE_NAME);

return -1;

}

read(fd, &jiffies_64, sizeof(jiffies_64));

printf("jiffies_64 = %lld\n", jiffies_64);

close(fd);

return 0;

}

在编译Linux内核,配置时:make menuconfig ---> Kernel hacking --> show timing information on printks

当选中这个选项后,启动内核,会在日志信息前面加上时间戳。

从linux启动信息可以看出,时间精确到微秒(us)。

讨论群:

Atmel技术交流讨论群

群号是305940105

Linux驱动开发调试群

群号是297141784

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二级考试c语言中 星号与字母 题型总结,2017年计算机二级考试C语言知识点归纳...

2017年计算机二级考试C语言知识点归纳计算机二级考试是全国计算机等级考试(National Computer Rank Examination&#xff0c;简称NCRE)四个等级中的一个等级&#xff0c;考核计算机基础知识和使用一种高级计算机语言编写程序以及上机调试的基本技能。下面是2017年计算机二级考试…

c语言字符串查找子串并截取,如何搜索截取特定字符串?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼有如下文本&#xff1a;config KEXEC_COREboolconfig OPROFILEtristate "OProfile system profiling"depends on PROFILINGdepends on HAVE_OPROFILEselect RING_BUFFERselect RING_BUFFER_ALLOW_SWAPhelpOProfile is a …

c#语言输出字符串长度,C#获取字符串长度(string.Length)

字符串实际上是由多个字符组成的&#xff0c;字符串中的第一个字符使用字符串[0]即可得。[0]中的0称为下标。获取字符串中的第一个字符使用的下标是0,则字符串中最后一个字符的下标是字符串的长度减1。使用C#语言如果要获取字符串的长度&#xff0c;使用Length属性即可&#xf…

用栈实现计算器c语言报告,请问,用c语言做一个计算器 包括+-*/()的运算 用栈 该怎么做...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#define UINT unsigned intstruct LOGIC{UINT logic,site;};char *text"8*9*(87)12/6-4";int calc_exp(char *sz);int calc_part(int a,int b,UINT w);int main(int argc,char *argv[]){std::cout<st…

c语言sqrt多个重载函数,“sqrt”: 对重载函数的调用不明确——解决方法

#include#includeusing namespace std;int main(){int i,j,k,flag;i 2;while(i < 100){flag 1;k sqrt((double)i);j 2;while(j < k){if(i%j 0){flag 0;break;}j;}if(flag)cout<i;}getchar();return 0;}报错&#xff1a;“ sqrt ”&#xff1a;对重载函数的调用不…

c语言截图代码,截图代码 哪位大神帮我找一下错,截出来的图是这样子的

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼终于找到了&#xff0c;前段时间研究jpg的时候&#xff0c;顺便做的一个实验&#xff0c;直接输出bmp文件。参考了微软的一个很老的代码里的字节对齐。。但愿对你有帮助吧。#include #include // showdib.h 157行&#xff0c;字节对…

c语言鼠标环绕特效,C语言写的鼠标有残影,急需解决方案,在线等待!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼c语言写的鼠标点击后留下鼠标的残影&#xff0c;求高手的解决方案&#xff0c;多谢了。代码如下&#xff1a;int x,y;union REGS r;void mouse(){int xmin,xmax,ymin,ymax;setcolor(YELLOW);xmin2,xmax638;ymin2,ymax478;setwritem…

c语言搜索多层文件夹,c语言 遍历搜索文件夹(获取文件夹中所有内容)

需要用来存储文件各种信息的结构体&#xff1a;struct_finddata_t 及查找函数&#xff1a;_findfirst、_findnext和_fineclose。[1] _finddata_t结构体struct _finddata_t{unsignedattrib;time_ttime_create;time_ttime_access;time_ttime_write;_fsize_tsize;charname[_MAX_FN…

易语言取c盘文件夹中的文件被占用,win7系统怎么快速找出文件被什么进程占用|win7解除文件占用的方法...

‍‍很多时候我们想删除文件或文件夹的时候&#xff0c;会出现文件正在使用的提示导致文件无法删除&#xff0c;如果知道是什么程序在使用这个文件好&#xff0c;但多数时候我们并不知道是被什么程序占用&#xff0c;那么在win7系统怎么快速找出文件被什么进程占用呢&#xff1…

ncurses下c语言定位光标,C指针原理教程之Ncurses介绍

1、安装NcursesNcurses是一个能提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库。Ncurses是一个能提供基于文本终端窗口功能的动态库. Ncurses可以: 只要您喜欢,您可以使用整个屏幕 创建和管理一个窗口 使用8种不同的彩色 为您的程序提供鼠标支持 使用…

菜鸟linux的sed,Linux sed命令菜鸟入门

本文首先以一个简单的sed命令应用示例&#xff0c;说明如何使用sed命令进行文本处理&#xff0c;接着从sed命令的用法、工作原理、行地址模式以及sed命令支持的脚本命令详细介绍sed命令的用法。一个完整的sed命令使用简单示例现在有一个待处理文件test.txt&#xff0c;文件中包…

android xml 列表展示,Android中ListView实现展示列表数据

1、在activity_main.xml中添加一个ListViewxmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:layout_height"wrap_content"android:orientation"vertical"tools:context"${relativePack…

android的证书链管理,Android手册X509证书链验证

我已在我的代码中实现了javax.net.ssl.X509TrustManager,因此我可以验证我的软件访问的自签名证书.但是,我仍然需要验证其他一些“标准”网站SSL证书.我使用CertPathValidator.validate()来做到这一点,但我刚刚意识到我传递的一个证书链(对于maps.googleapis.com)实际上并不包含…

lua android弹窗关闭,安卓精灵lua调用pm指令实现清除App缓存,举个栗子的说

今天刚接触这玩意&#xff0c;试着写点Demo玩玩, 功能要求能自动登陆&#xff0c;在登陆前要先清空游戏的缓存数据&#xff0c;不然游戏就自动登陆了(无法切到账号输入窗口)本想写图色脚本来实现吧&#xff0c;多种品牌的手机&#xff0c;多种模拟器&#xff0c;多种桌面主题&a…

android打印html页面,Android打印HTML文档

来源官网,总结用.WebView类在Android 4.4(API Level 19)中得到了更新&#xff0c;使得它可以打印HTML内容。该类允许我们加载一个本地HTML资源或者从网页下载一个页面&#xff0c;创建一个打印任务&#xff0c;并把它交给Android打印服务。1.[代码]如何构建一个HTML的字符串并将…

cocos android-1,Cocos2D-Android-1之源码详解:5.Box2dTest

Cocos2D-Android-1之源码详解&#xff1a;5.Box2dTest发布时间&#xff1a;2020-08-06 06:19:28来源&#xff1a;51CTO阅读&#xff1a;398作者&#xff1a;abab99package org.cocos2d.tests;import java.util.Iterator;import org.cocos2d.actions.UpdateCallback;import org.…

三星s10能升级android11,三星 S10+手机已在测试 Android 11 系统

IT之家2月25日消息 谷歌本月初发布了首个Android 11开发者预览版&#xff0c;首先面向Pixel手机&#xff0c;不过看起来三星已经在Galaxy S10 手机开始测试最新系统。IT之家从Geekbench数据库中获知&#xff0c;上面出现了运行Android R&#xff0c;型号为SM-G975F的三星Galaxy…

android 5. 蓝牙 mesh,蓝牙mesh组网

智能照明是智能家居的一个重要入口&#xff0c;传统照明方案存在布线复杂&#xff0c;控制单一等问题。搭配飞易通MESH组网模组替换传统方案&#xff0c;无需额外的布线。提供更智能的控制&#xff0c;更极致的用户体验。一、MESH应用领域:蓝牙5.0MESH是由SIG蓝牙联盟发布建立的…

android opencv 银行卡识别,NDK 开发之使用 OpenCV 实现银行卡号识别

前言在日常的开发中&#xff0c;我们有时会遇到添加银行卡的需求&#xff0c;这时候&#xff0c;产品可能会让你仿一下支付宝之类的相机扫描识别银行卡号。很多时候&#xff0c;做这样的需求会去找找稳定的第三方&#xff0c;本文通过 OpenCV 结合识别的需求带你分析如何实现银…

鸿蒙测试机型微博,华为多款机型开启鸿蒙尝鲜:微博已适配HarmonyOS小尾巴

日前&#xff0c;华为已经正式宣布&#xff0c;将于6月2日晚20点召开鸿蒙操作系统及华为全场景新品发布会&#xff0c;届时将正式发布鸿蒙OS正式版。同时&#xff0c;今天华为还开启了鸿蒙OS首批消费者尝鲜计划&#xff0c;其中正式版可参与机型包括Mate 40系列、Mate X2、Mate…