Samsung_tiny4412(驱动笔记08)----jiffies,timer,kthread,workqueue,tasklet

发布者:huanhui最新更新时间:2025-01-15 来源: cnblogs关键字:Samsung  tiny4412 手机看文章 扫描二维码
随时随地手机看文章

/***********************************************************************************

 *                    

 *                     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() 

[1] [2] [3]
关键字:Samsung  tiny4412 引用地址:Samsung_tiny4412(驱动笔记08)----jiffies,timer,kthread,workqueue,tasklet

上一篇:Samsung_tiny4412(驱动笔记09)----alloc_pages,kmalloc,vmalloc,kmem_cache,class
下一篇:Samsung_tiny4412(驱动笔记07)----spinlock,semaphore,atomic,mutex,completion,interrupt

推荐阅读最新更新时间:2026-03-20 11:41

Samsung_tiny4412(驱动笔记03)----字符设备驱动基本操作及调用流程
/*********************************************************************************** * * 字符设备驱动基本操作及调用流程 * * 声明: * 1. 本系列文档是在vim下编辑,请尽量是用vim来阅读,在其它编辑器下可能会 * 不对齐,从而影响阅读. * 2. 以下所有的shell命令都是在root权限下运行的; *******************************************************************************
[单片机]
Samsung_tiny4412(驱动笔记10)----mdev,bus,device,driver,platform
/*********************************************************************************** * * mdev,bus,device,driver,platform * * 声明: * 1. 本系列文档是在vim下编辑,请尽量是用vim来阅读,在其它编辑器下可能会 * 不对齐,从而影响阅读. * 2. 由于本人水平有限,很难阐述清楚bus device driver platform的关系 * 所以强烈要求您详细参考本次提供的预热文章. * **********
[单片机]
Samsung_tiny4412(驱动笔记02)----ASM with C,MMU,Exception,GIC
/**************************************************************************** * * ASM with C,MMU,Exception,GIC * * 声明: * 1. 本系列文档是在vim下编辑,请尽量是用vim来阅读,在其它编辑器下可能会 * 不对齐,从而影响阅读. * 2. 以下所有的shell命令都是在root权限下运行的; * 3. 文中在需要往文件中写入内容的时候使用了如下2方式: * 1.如果文件不存在,创建文件;如果存在,以覆盖的方式往文件中添加内容: *
[单片机]
Tiny4412 支持 adb reboot-bootloader
硬件版本: Tiny4412ADK + S700 4GB u-boot 版本: u-boot-2010-12 linux版本: Linux-3.0.8 版本一 支持 adb reboot bootloader patch:http://pan.baidu.com/s/1i3KfCI5 版本二 支持按住K1键,然后开机,进入fastboot模式 patch: http://pan.baidu.com/s/1hqgmnQ0
[单片机]
tiny4412 串口驱动分析一 --- u-boot中的串口驱动
开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 u-boot:U-Boot 2010.12 Linux内核版本:linux-3.0.31 Android版本:android-4.1.2 我们以tiny4412为例分析串口驱动,下面我们从u-boot开始分析,然后再分析到Linux。 串口初始化 关于这部分代码流程参考件: tiny4412 u-boot 启动.pdf ,这里主要分析函数:uart_asm_init 在初始化串口驱动之前已经进行了系统时钟以及内存的初始化。下面的代码取自board/samsung/tiny441
[单片机]
<font color='red'>tiny4412</font> 串口<font color='red'>驱动</font>分析一 --- u-boot中的串口<font color='red'>驱动</font>
基于tiny4412的Linux内核移植 ---- 調試方法
平臺 Linux-4.4.4 uboot使用的是友善自帶的(爲了支持uImage和設備樹做了稍許修改) 概述 這篇博客主要用於匯總一下調試方法。 正文 1. dnw下載 目前我將uboot燒寫到SD卡中,然後使用dnw將kernel、根文件系統以及設備樹鏡像下載到內存中,爲了提高效率,可以使用下面的方法: 在uboot中添加環境變量: setenv dnw_up 'dnw 0x40600000; dnw 0x41000000; dnw 0x42000000; bootm 0x40600000 0x41000000 0x42000000' 進入uboot終端後,執行如下命令: run d
[单片机]
基于tiny4412的Linux内核移植 -- PWM子系统学习(八)
平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)) 实验二、用蜂鸣器测试backlight 一般LCD的背光的亮度调节都是通过控制输入给背光控制
[单片机]
串口编程(基于tiny4412
参考: http://www.cnblogs.com/wblyuyang/archive/2011/11/21/2257544.html http://www.cppblog.com/amazon/archive/2010/01/28/106644.html serial_demo.c #include stdio.h #include stdlib.h #include unistd.h #include sys/types.h #include sys/stat.h #include fcntl.h //文件控制定义 #include termios.h //终端控制定义 #include errno
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved