Linux嵌入式 -- 内核 - 内核定时器
1. 度量时间差
时钟中断由系统的定时硬件以周期性的时间间隔产生,这个间隔(即频率)由内核根据HZ来确定,HZ是一个与体系结构无关的常数,可配置(50-1200),在X86平台,默认值为1000(每秒计数1000次)。
每当时钟中断发生时,全局变量jiffies(unsigned long)就加1,因此jiffies记录了自linux启动后时钟中断发生的次数。驱动程序常利用jiffies来计算不同事件间的时间间隔。
如果对延迟的精度要求不高,最简单的实现方法如下--忙等待: 延时 jit_delay 秒。
unsignedlongj=jiffies + jit_delay*HZ;
while (jiffies<j)
{
/* do nothing */
}
2. 定时器
定时器用于控制某个函数(定时器处理函数)在未来的某个特定时间执行。内核定时器注册的处理函数只执行一次--不是环执行的。
内核定时器被组织成双向链表,并使用struct timer_list结构描述。
struct timer_list{
structlist_head entry/*内核使用*/;
unsignedlong expires;
/*超时的jiffies值*/
void (*function)(unsigned long);/*超时处理函数*/
unsignedlong data;/*超时处理函数参数*/
struct tvec_base *base;/*内核使用*/
};
操作定时器的有如下函数:
voidinit_timer(struct timer_list *timer); 初始化定时器队列结构,初始化两个系统使用成员 entry base。
void add_timer(struct timer_list * timer); 启动定时器。
int del_timer(struct timer_list *timer); 在定时器超时前将它删除。当定时器超时后,系统会自动地将它删除
3. 示例代码
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/timer.h> //timer
#include<asm/uaccess.h> //jiffies MODULE_LICENSE("GPL"); struct timer_list timer; //定义定时器 void timer_func(int para)
{
printk("<0>Timer expired and para is %d !!\n", para);
} int timer_init()
{
init_timer(&timer); //初始化
timer.data = 5; //赋值
timer.expires = jiffies + (20*HZ);
timer.function = timer_func;
add_timer(&timer); //启动
return 0;
} void timer_exit()
{
del_timer(&timer); //删除
} module_init(timer_init);
module_exit(timer_exit);
Linux嵌入式 -- 内核 - 内核定时器的更多相关文章
- Linux嵌入式 -- 内核 (arm) & 文件系统
1. make distclean 2. 配置内核 ----> 生成 .config文件 make menuconfig ARCH=arm Makefile文件分析: 3. 编译内核 mak ...
- Linux移植之内核启动过程start_kernel函数简析
在Linux移植之内核启动过程引导阶段分析中从arch/arm/kernel/head.S开始分析,最后分析到课start_kernel这个C函数,下面就简单分析下这个函数,因为涉及到Linux的内容 ...
- 《Linux设备驱动开发具体解释(第3版)》(即《Linux设备驱动开发具体解释:基于最新的Linux 4.0内核》)网购链接
<Linux设备驱动开发具体解释:基于最新的Linux 4.0内核> china-pub spm=a1z10.3-b.w4011-10017777404.30.kvceXB&i ...
- Linux内核--内核数据类型
转自:http://www.linuxidc.com/Linux/2013-12/93637.htm 将Linux 移植到新的体系结构时,开发者遇到的若干问题都与不正确的数据类型有关.坚持使用严格的数 ...
- Linux 2.6内核中新的锁机制--RCU
转自:http://www.ibm.com/developerworks/cn/linux/l-rcu/ 一. 引言 众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁 ...
- Linux网络编程&内核学习
c语言: 基础篇 1.<写给大家看的C语言书(第2版)> 原书名: Absolute Beginner's Guide to C (2nd Edition) 原出版社: Sams 作者: ...
- linux常用的内核镜像格式
linux常用的内核镜像格式 Linux内核有多种格式的镜像,包括vmlinux.Image.zImage等. 1. Linux内核镜像格式 1.1 vmlinux vmlinuz是可引导的. ...
- 【转载】LINUX 和 WINDOWS 内核的区别
LINUX 和 WINDOWS 内核的区别 [声明:欢迎转载,转载请注明出自CU ACCESSORY http://linux.chinaunix.net/bbs/thread-1153868-1-1 ...
- Linux系统启动那些事—基于Linux 3.10内核【转】
转自:https://blog.csdn.net/shichaog/article/details/40218763 Linux系统启动那些事—基于Linux 3.10内核 csdn 我的空间的下载地 ...
- 非常好!!!Linux源代码阅读——内核引导【转】
Linux源代码阅读——内核引导 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 目录 Linux 引导过程综述 BI ...
随机推荐
- 阻塞队列 ArrayBlockingQueue 我给自己挖了一个坑
说一句MMB, 一下午时间, package cn.tbnb1.seckil.quene; import java.util.concurrent.ArrayBlockingQueue; import ...
- 密钥管理服务KMS
密钥管理服务 KMS - 腾讯云 https://cloud.tencent.com/product/kms
- 常用模块一(os模块、序列化模块(json和pickle))
一.os模块 os模块是与操作系统交互的一个接口. import os # 和文件和文件夹的操作有关 os.makedirs('dirname1/dirname2') # 可生成多层递归目录 os.r ...
- centos7 yum安装MongoDB
centos7 yum安装MongoDB 原文博客地址http://xgs888.top/post/view?id=64 centos7 yum安装mongodb: 1:创建仓库 vi /etc/ ...
- JavaScript四则运算计算器
直接上代码: 首先是HTML代码 <form> 第一个数字:<br> <input type="text" id="num1"&g ...
- Log4j详细配置解释
原文地址:https://www.cnblogs.com/godtrue/p/6444158.html log4j(七)——log4j.xml简单配置样例说明 一:测试环境与log4j(一)——为什么 ...
- corethink功能模块探索开发(四)让这个模块跑起来
让这个模块跑起来,太费劲了,多半原因是自己太粗心,opencmf.php中“uid”写成了“pid”,de了好几天的bug也没有搞出来,又加上最近发生了些事(brokenhearted)... 上报错 ...
- 【jenkins】jenkins实时显示python脚本输出
jenkins在构建shell脚本时可以实时输出结果,但是在构建python脚本时,是等到python执行完成以后,才显示结果,这个对于我们判断脚本执行状态非常不利 这里介绍一种方法,能够实时显示py ...
- mysq数据库的安装和基本操作
一.数据库的简介 1.什么是数据库? 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据库中的数据按一定的数学模型组织.描述和存储,具有较小的冗余,较高的数据独 ...
- 利用FFmpeg将RTSP转码成RTMP发布在RED5
安装jdk,并设置环境 from:http://www.w3c.com.cn/%E5%88%A9%E7%94%A8ffmpeg%E5%B0%86-ipcamera-%E7%9A%84rtsp%E8% ...