Samsung_tiny4412(驱动笔记07)----spinlock,semaphore,atomic,mutex,completion,interrupt

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

            }

        

            return ret;

        }

        ...


三. atomic接口:

    1. 头文件:   linux-3.5/include/linux/atomic.h

    2. 声明定义: atomic_t val; atomic_t *v = &val;

    3. 读取原子变量的值:   atomic_read(v);

    4. 修改原子变量的值:   atomic_set(v, i);

    5. 原子变量自加1:      atomic_inc(v); --> v += 1;

    6. 原子变量自减1:      atomic_dec(v); --> v -= 1;

    7. 原子变量自加1并检测是否为0:       atomic_inc_and_test(v); v += 1,判断结果是否为0

    8. 原子变量自减1并检测是否为0:       atomic_dec_and_test(v); v -= 1,判断结果是否为0

    9. 原子变量自加1并返回原子变量的值:  atomic_inc_return(v)

    10. 原子变量自减1并返回原子变量的值: atomic_dec_return(v)

    11. 比较变量i和原子变量的值是否相等: atomic_sub_and_test(i, v)

    12. atomic接口使用Demo:

        ...

        struct test_s {

            struct file_operations fops;

            atomic_t v;

            int major;

        };

        typedef struct test_s test_t;

        

        static int test_open(struct inode *inode, struct file *file)

        {

            test_t *p;

            p = container_of(file->f_op, test_t, fops);

        

            file->private_data = p;

        

            if(!atomic_dec_and_test(&p->v))

            {

                atomic_inc(&p->v);

                return -EAGAIN;

            }

        

            printk('Open.n');

        

            return 0;

        }

        

        static int test_close(struct inode *inode, struct file *file)

        {

            test_t *p = file->private_data;

        

            printk('Close.n');

            atomic_inc(&p->v);

        

            return 0;

        }

        ...

        int __init test_init(void)

        {

            int ret;

        

            atomic_set(&test.v, 1);

        

            ret = register_chrdev(test.major,

                    DEV_NAME, &test.fops);

            if(ret > 0)

            {

                test.major = ret;

                printk('major = %dn', test.major);

                ret = 0;

            }

        

            return ret;

        }

        ...


四. mutex接口:

    1. 定义: struct mutex lock;

    2. 定义一个互斥锁,并初始化: DEFINE_MUTEX(mutexname);

    3. 初始化: mutex_init(&lock);

    4. 3种加锁方式:

        1. mutex_lock(&lock);

        2. mutex_lock_interruptible(&lock);

        3. mutex_trylock(&lock);

    5. 解锁: mutex_unlock(&lock);

    6. mutex接口使用Demo:

        ...

        struct test_s {

            struct file_operations fops;

            /*struct semaphore sem;*/

            struct mutex lock;

            int major;

        };

        typedef struct test_s test_t;

        ...

            /*mutex_lock(&p->lock);*/

        

            /*

             *if(mutex_lock_interruptible(&p->lock))

             *    return -EINTR;

             */

        

            if(!mutex_trylock(&p->lock))

                return -EAGAIN;

        

            for(i = 0; i < 3; i++)

            {

                printk('count = %d, %s', cnt++, kbuf);

                msleep(10);

            }

        

            mutex_unlock(&p->lock);

        ...

        int __init test_init(void)

        {

            int ret;

        

            mutex_init(&test.lock);

        

            ret = register_chrdev(test.major, DEV_NAME, &test.fops);

            if(ret > 0)

            {

                test.major = ret;

                printk('major = %dn', test.major);

                ret = 0;

            }

        

            return ret;

        }


五. completion接口:

    1. 定义: struct completion com;

    2. 定义一个完成量,并初始化: DECLARE_COMPLETION(work)

    3. 初始化: init_completion(&com);

    4. 2种等待完成: 

        1. wait_for_completion(&com);

        2. wait_for_completion_interruptible(&com);

    5. 2种通知完成量:

        1. complete(&com);

        2. complete_all(&com);

    6. mutex接口使用Demo:

        ...

        struct test_s {

            struct file_operations fops;

            struct completion com;

            int major;

        };

        typedef struct test_s test_t;

        ...

        static ssize_t test_read(struct file *file, char __user *buf, size_t count, loff_t *pos)

        {

            test_t *p = file->private_data;

            

            //在完成量com上阻塞

            /*wait_for_completion(&p->com);*/

        

            if(wait_for_completion_interruptible(&p->com))

                return -ERESTARTSYS;

                

            printk('Read data.n');

        

        

            return count;

        }

        

        static ssize_t test_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)

        {

            test_t *p = file->private_data;

            

            printk('Write data.n');

            

            /*complete(&p->com);*/

            

            //通知所有阻塞的进程

            complete_all(&p->com);

            

            return count;

        }  

        ...

        int __init test_init(void)

        {

            int ret;

        

            init_completion(&test.com);

            ret = register_chrdev(test.major,

                                  DEV_NAME, &test.fops);

            if(ret > 0)

            {

                test.major = ret;

                printk('major = %dn', test.major);

                ret = 0;

            }

        

            return ret;

[1] [2] [3] [4]
关键字:Samsung  tiny4412 引用地址:Samsung_tiny4412(驱动笔记07)----spinlock,semaphore,atomic,mutex,completion,interrupt

上一篇:Samsung_tiny4412(驱动笔记08)----jiffies,timer,kthread,workqueue,tasklet
下一篇:Samsung_tiny4412(驱动笔记06)----list_head,proc file system,GPIO,ioremap

推荐阅读最新更新时间:2026-03-21 06:51

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