/***********************************************************************************
*
* jiffies,timer,kthread,workqueue,tasklet
*
* 声明:
* 1. 本系列文档是在vim下编辑,请尽量是用vim来阅读,在其它编辑器下可能会
* 不对齐,从而影响阅读.
* 2. 本文中有些源代码没有全部帖出来,主要是因为篇幅太大的原因;
* 3. 基于2中的原因,本文借鉴了python中的缩进代码风格进行代码的体现:
* 1. 有些代码中的'...'代表省略了不影响阅读的代码;
* 2. 如下代码缩进代表在一个函数内部的代码,至于在什么函数里,不影响阅读:
* ... //省略代码
* struct test_s {
* };
* ... //省略代码
*
* //进入临界区之前加锁 }
* spin_lock(&p->lock); |
* | |
* /* 有效代码 */ |-->|采用缩进,代表在一个函数内
* | |的代码
* //出临界区之后解锁 |
* spin_unlock(&p->lock); }
*
* ... //省略代码
* int __init test_init(void)
* {
* ... //省略代码
* }
* ... //省略代码
*
*
* 2015-3-13 阴 深圳 尚观 Var 曾剑锋
**********************************************************************************/
\\\\--*目录*--////////
| 一. error与非法地址:
| 二. jiffies接口:
| 三. timer接口:
| 四. kthread接口:
| 五. workqueue接口:
| 六. tasklet接口:
\\\\\\//////////////
一. error与非法地址:
1. error与非法地址的关系:
1. ENOMEM(错误码)是一个很小的正整数,大于0,小于4k;
2. -ENOMEM是一个很大的负数,小于0,大于-4k;
3. (void *)(-ENOMEM)是一个很大的正整数,大于4G-4K,小于4G;
4. 系统将大于4G-4k,小于4G的地址定义为非法地址;
2. 把错误码ENOMEM转换成对应的非法地址,返回非法地址: ERR_PTR(-ENOMEM);
3. 把非法地址err转换为对应的错误码,返回值为错误码对应的值: PTR_ERR(err);
4. 检查err是否是非法地址: IS_ERR(err);
二. jiffies接口:
1. 时钟滴答计数值: jiffies;
2. 查看时钟滴答频率配置,内核根目录下执行命令: cat .config | grep CONFIG_HZ
3. 毫秒值转换成时钟滴答: msecs_to_jiffies();
4. 时钟滴答转换成毫秒值: jiffies_to_msecs();
5. 判断给出的时间a是否大于jiffies: time_is_after_jiffies(a) a > jiffies
7. 判断给出的时间a是否小于jiffies: time_is_before_jiffies(a) a < jiffies
6. 判断给出的时间a是否大于等于jiffies: time_is_after_eq_jiffies(a) a >= jiffies
8. 判断给出的时间a是否小于等于jiffies: time_is_before_eq_jiffies(a) a <= jiffies
9. jiffies接口实例Demo:
...
void my_mdelay(int msec)
{
unsigned long expire = jiffies + msecs_to_jiffies(msec);
while(time_is_after_jiffies(expire))
;
}
int __init test_init(void)
{
printk('jifffies is %lun', jiffies);
/*msleep(2000);*/
/*mdelay(2000);*/
my_mdelay(2000);
printk('jifffies is %lun', jiffies);
return 0;
}
...
三. timer接口:
1. 定时器定义: struct timer_list timer;
2. 设置定时器函数: setup_timer(&timer, fn, data);
3. 定时,并激活定时器: mod_timer(&timer, expires);
4. 取消定时器: del_timer_sync(&timer);
5. timer接口实例Demo:
...
struct timer_list timer;
void timer_main(unsigned long data)
{
printk('timer expire! data = %lun', data);
/**
* if(timer_pending(&timer))
* printk('timer_main: timer pendingn');
* else
* printk('timer_main: timer NOT pendingn');
*/
if(in_interrupt())
printk('in interrupt context.n');
if(in_softirq())
printk('in softirq context.n');
if(in_irq())
printk('in irq context.n');
/**
* mdelay(3000);
* printk('timer fn endn');
*/
/*mod_timer(&timer, jiffies + HZ);*/
}
int __init test_init(void)
{
setup_timer(&timer, timer_main, 11223344);
//设置时间,并激活定时器
mod_timer(&timer, jiffies + 3 * HZ);
mod_timer(&timer, jiffies + 1 * HZ);
if(timer_pending(&timer))
printk('timer pendingn');
else
printk('timer NOT pendingn');
return 0;
}
void __exit test_exit(void)
{
/*del_timer(&timer);*/
del_timer_sync(&timer);
}
...
四. kthread接口:
1. 创建一个内核线程,创建后状态是stop的,需要wake_up_process(t)唤醒:
struct task_struct *t = kthread_create(thread_main, NULL, 'my_kthread%d', 0);
参数说明:
1. thread_main: 线程创建后执行的函数
2. NULL: 传递给thread_main的参数
3. 'my_kthread%d': 内核线程名字格式化字符串
2. 唤醒内核线程t: wake_up_process(t)
3. 通知线程退出,不是强制结束进程退出,而是分成以下两步:
1. 而且阻塞直到线程退出,返回线程函数的返回值: kthread_stop(t)
2. 检查当前线程是否收到退出的通知: kthread_should_stop()
上一篇:Samsung_tiny4412(驱动笔记09)----alloc_pages,kmalloc,vmalloc,kmem_cache,class
下一篇:Samsung_tiny4412(驱动笔记07)----spinlock,semaphore,atomic,mutex,completion,interrupt
推荐阅读最新更新时间:2026-03-20 11:41
- 使用 ON Semiconductor 的 FAN2518S 的参考设计
- LTC1530S8、3.3V/3A 稳压器
- 使用 ON Semiconductor 的 ADP3167 的参考设计
- 使用 Analog Devices 的 LT3420EDD 的参考设计
- 基于Kinetis® M的低成本单相电表参考设计
- LTC3708、具有上升/下降轨跟踪功能的 2.5V/15A 和 1.2V/15A 稳压器
- NXQ1TXH5插件板
- 应变仪仪表放大器
- WRL-13287,基于 ESP8266 802.11 无线局域网的 SparkFun Wi-Fi Shield
- 4.1W、3-LED 通用 LED 照明驱动器
- G20周刊|埃斯顿与北自所达成战略合作、海康机器人发布光伏组件汇流带视觉检测解决方案
- 14家工业智能企业入选《上海市智能机器人标杆企业与应用场景推荐目录》
- 大声量 | 2023机器视觉技术与应用峰会议程新鲜出炉!
- 海康机器人视觉检测方案守护光伏组件生产质量
- 艾利特CSF系列力控协作机器人来了!
- 宾通智能参评“维科杯·OFweek 2022中国机器人行业年度市场突破奖”
- 微链道爱参评“维科杯·OFweek 2022中国机器人行业年度卓越技术创新企业奖”
- 微链道爱参评“维科杯·OFweek 2022中国机器人行业年度品牌影响力杰出企业奖”
- 宾通智能参评“维科杯·OFweek 2022中国机器人行业年度品牌影响力杰出企业奖”
- 木蚁机器人参评“维科杯·OFweek 2022中国机器人行业年度卓越技术创新企业奖”



Linux内核驱动笔记
三星2410开发板ALLEGRO BRD原文件
现代雷达系统的信号设计
BFR340T






京公网安备 11010802033920号