4412 并发

发布者:京玩儿最新更新时间:2022-01-27 来源: eefocus关键字:并发 手机看文章 扫描二维码
随时随地手机看文章

一、并发基本概念

1.并发

  • 并发的概念是:多个执行单元同时、并行被执行

  • Linux系统是多任务的,很多任务会同时执行

  • 假如有三个执行单元ABC,共享了内存资源

    • 执行单元A对Buffer写1000个"a";

    • 执行单元B对Buffer写1000个"b";

    • 执行单元C从Buffer中读取数据。

    • 如果按照A写→C读→B写→C读,当然没有问题。

    • 但是如果A写→B写→C读,执行单元C就出问题了。

  • 当然比这个复杂更多,更加混乱的并发操作存在设备驱动中。

  • 只要有多个进程对共享资源的同时访问,就可能出现竞争。

2.竞态

  • 以下三种情况会导致竞态

  • 对称多处理的多个CPU

  • 单CPU内进程和强占它的进程

  • 中断和进程

3.竞态的解决办法

  • 解决竞态的途径是“保证对共享资源的互斥访问”

  • 也就是一个执行单元在访问共享资源的时候,其他的执行单元被禁止访问。

  • 访问共享资源的代码区称为临界区,临界区需要使用互斥机制来保护。

4.Linux操作系统中提供实现互斥的方法

  • 原子操作、自旋锁、信号量、互斥体等。

  • 后续视频介绍原子操作,自旋锁,互斥体

 

二、并发控制之原子操作

1.直接列出内核中提供的宏定义

解决竞态的途径是"保证对共享资源的互斥访问"

  • 变量:atomic_t 整型变量

  • 宏定义:atomic_read    (*(volatile int *)&(v)->counter)

    • volatile关键词:表示变量每次被访问,执行单元每次从内存单元中取值。

    • 不带关键词:表示变量在编译的时候可能被"优化"。(可能是CPU内部寄存器

    • 保证对特殊地址的稳定访问!

  • 宏定义:atomic_inc  atomic_add(1, (v))  变量加1

  • 宏定义:atomic_dec        变量减1

  • 宏定义:ATOMIC_INIT        赋值

 2.如何使用

假设任务单元A第一个申请"共享单元"。则先读变量,如果0,则对变量加1,然后对共享资源进行操作。操作完毕之后对变量赋值。

假设任务单元B要申请"共享单元"。则先读变量,如果0,则对变量加1,然后对共享资源进行操作。操作完毕之后对变量赋值。如果为1,直接返回。

3.代码分析

open_atomic_int_one以及open_atomic_int_two两个程序

要对/dev/atomic_int设备节点镜像操作

先运行的程序,将变量赋值为1,释放的时候赋值为0

如果程序1在没有释放的情况下,程序2调用设备节点则会直接返回,无法调用。

如果程序1在在没有释放的情况下,程序2调用则会直接返回,无法调用。

atomic

#include

#include


/* device register */

#include

/* register misc device */

#include

/* register device node */

#include

/* atomic */

#include

#include


#define DRIVER_NAME "atomic_int"

#define DEVICE_NAME "atomic_int"


MODULE_LICENSE("Dual BSD/GPL");

MODULE_AUTHOR("Topeet");


static atomic_t value_atomic = ATOMIC_INIT(0);


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

{

        printk(KERN_EMERG "atomic_int open in!n");


        if(atomic_read(&value_atomic)) {

                return -EBUSY;

        }


        atomic_inc(&value_atomic);


        printk(KERN_EMERG "atomic_int open success!n");

        return 0;

}


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

{

        printk(KERN_EMERG "atomic_int releasen");


        atomic_dec(&value_atomic);


        return 0;

}


static struct file_operations atomic_int_ops = {

        .owner = THIS_MODULE,

        .open = atomic_int_open,

        .release = atomic_int_release,

};


static struct miscdevice atomic_int_dev = {

        .minor = MISC_DYNAMIC_MINOR,

        .name = DEVICE_NAME,

        .fops = &atomic_int_ops,

};


static int atomic_int_probe(struct platfrom_device *pdv)

{

        printk(KERN_EMERG "tinitalizedn");

        misc_register(&atomic_int_dev);


        return 0;

}


static int atomic_int_remove(struct platform_device *pdv)

{

        printk(KERN_EMERG "tremvoen");

        misc_deregister(&atomic_int_dev);


        return 0;

}


struct platform_driver atomic_int_driver = {

        .probe = atomic_int_probe,

        .remove = atomic_int_remove,

        .driver = {

                .name = DRIVER_NAME,

                .owner = THIS_MODULE,

        }

};


static int atomic_int_init(void)

{

        int DriverState;


        printk(KERN_EMERG "atomic int entern");

        DriverState = platform_driver_register(&atomic_int_driver);


        printk(KERN_EMERG "tDriverState is %dn", DriverState);

        return 0;

}


static void atomic_int_exit(void)

{

        printk(KERN_EMERG "atomic int exitn");


        platform_driver_unregister(&atomic_int_driver);

}


module_init(atomic_int_init);

module_exit(atomic_int_exit);


open_one:

#include


#include

#include

#include

#include

#include


int main(int argc, char *argv[])

{

        char *atomic_int = "/dev/atomic_int";

        int fd;


        if((fd = open(atomic_int, O_RDWR|O_NDELAY)) < 0) {

                printf("%s open %s fialed!n", argv[0], atomic_int);

        } else {

                printf("%s open %s success!n", argv[0], atomic_int);

        }


        while(1);

}


opne_two:

#include


#include

#include

#include

#include

#include


int main(int argc, char *argv[])

{

        char *atomic_int = "/dev/atomic_int";

        int fd;


        if((fd = open(atomic_int, O_RDWR|O_NDELAY)) < 0) {

                printf("%s open %s fialed!n", argv[0], atomic_int);

        } else {

                printf("%s open %s success!n", argv[0], atomic_int);

        }


        while(1);

}

 

4.测试结果

[root@iTOP-4412]# insmod atomic.ko                                                     

[   69.905118] atomic int enter

[   69.906830]  initalized

[   69.925677]  DriverState is 0

[root@iTOP-4412]# ls /dev/atomic_int -l                                                

crw-rw----    1 root     0          10,  47 Jan  1 01:47 /dev/atomic_in


[root@iTOP-4412]# ./open_atomic_int_one &                                              

[root@iTOP-4412]# [   83.577155] atomic_int open in!

[   83.578851] atomic_int open success!

./open_atomic_int_one open /dev/atomic_int sucess!


[root@iTOP-4412]# ./open_atomic_int_two                                                

[   92.529032] atomic_int open in!

./open_atomic_int_two open /dev/atomic_int failed!


[root@iTOP-4412]# kill 1659                                                            

[root@iTOP-4412]#[  115.020445] atomic_int release

 

[1]+  Terminated                 ./open_atomic_int_one

[root@iTOP-4412]# ./open_atomic_int_two                                                

[  120.023368] atomic_int open in!

[  120.025137] atomic_int open success!

./open_atomic_int_two open /dev/atomic_int sucess!


^C[  123.292457] atomic_int release


遇到的问题:

一开始注册,没有运行probe函数。所以需要对内核裁剪(driver/char/Kconfig和arch/arm/mach-exynos/mach-top4412.c的修改)。

增减ATOMIC_INT_CONFIG,并编译内核后烧录。

 

三、并发控制之位原子操作

1.直接列出内核中提供的宏定义

宏定义:test_bit 返回位原子值

宏定义:set_bit 设置位

宏定义:clear_bit 清除位

 

2.如果使用

类似整型的原子操作

 

3.代码分析

  • open_atomic_bit_two以及open_atomic_bit_one两个程序

  • 要对/dev/atomic_bit这个设备节点进行操作

  • 先运行open之后,将变量赋值为1,释放的时候赋值为0

  • 如果在其中一个程序调用的过程中没有释放,第二个程序要对节点操作,则会直接返回错误。

 测试代码:

atomic_bit

#include

#include


/* device register */

#include

/* register misc device */

#include

/* register device node */

#include

/* atomic */

#include

#include


#define DRIVER_NAME "atomic_bit"

#define DEVICE_NAME "atomic_bit"


MODULE_LICENSE("Dual BSD/GPL");

MODULE_AUTHOR("Topeet");


//static atomic_t value_atomic = ATOMIC_INIT(0);

unsigned long int value_bit = 0;


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

{

        printk(KERN_EMERG "atomic_int open in!n");

/*

        if(atomic_read(&value_atomic)) {

                return -EBUSY;

        }


        atomic_inc(&value_atomic);

*/

        if(test_bit(0, &value_bit) != 0) {

                return -EBUSY;

        }


        set_bit(0, &value_bit);


        printk(KERN_EMERG "atomic_int open success!n");

        return 0;

}


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

{

        printk(KERN_EMERG "atomic_int releasen");


        //atomic_dec(&value_atomic);


        clear_bit(0, &value_bit);


        return 0;

}


static struct file_operations atomic_bit_ops = {

        .owner = THIS_MODULE,

[1] [2]
关键字:并发 引用地址:4412 并发

上一篇:4412 RS485
下一篇:4412 GPIO读 和 ioremap控制GPIO寄存器

推荐阅读最新更新时间:2024-11-10 19:19

自适应机器人赋能行业,非夕科技出席2022中国机器人产业大会并发表演讲
近几年,人口老龄化、劳动力成本上升、疫情反复等因素,推动着制造业智能化升级的进程,“机器换人”成为众多企业的选择。 2021年,全国工业机器人产量达366044套,同比增长44.9%,产量创历史新高;今年1-2月,工业机器人产量76381套,在高基数的情况下依然增长29.6%,机器人产业进入发展“快车道”。 在此背景下,为进一步促进机器人产业的有序发展,助力行业内人士互通有无,及时了解市场变化,把握未来发展趋势,由高科技行业门户OFweek维科网主办、OFweek维科网·机器人承办的 “OFweek 2022(第十一届)中国机器人产业大会(简称:OFweek Robo Conference 2022)”将于2022年5月17日在深
[机器人]
第八章、Tiny4412 U-BOOT移植八 SDRAM工作时序与原理
DDR出身自SDRAM,严格的说应该叫DDR SDRAM,DDR SDRAM是Double Data Rate SDRAM的缩写,是双倍速率同步动态随机存储器的意思,所以,有很大一部分,两者是一样的,理解SDRAM,然后再来理解DDR。在SDRAM上的改进,效果应该更好一些,这里要感谢Chinaunix.net的大神--Tekkaman Ninja,我的内存的学习资料都是Tekkaman Ninja的博客中介绍的。以下是我对大神推荐文档的一些个人整理,OK,先上一张SDRAM的结构图,如下图8-1所示。 图8-1、SDRAM 内部结构图 下面上一张简易的SDRAM工作流程图。 图8-2、SDRAM 简易工作流程图 图中
[单片机]
第八章、Tiny<font color='red'>4412</font> U-BOOT移植八 SDRAM工作时序与原理
嵌入式4412开发板QT5.7编译安装到arm
平台:iTOP-4412精英版+4.3寸屏 有学东西写文章的习惯,毕竟都是入门,在这里记录一下安装过程,虽然可能短期内用不到了,但以后用到的时候可以作为参考。 ********************************华丽的分割线*************************** 1、从网上下载所有最新的源码 Ubuntu16.0 amd64版本第一个,这个就不要源码了,直接安装就好了 QT5.7.0,万能的度娘一找就找到了(官网下载),注意是下载源码,linux版本的源码。ARM-NONE-LINUX-GNUEABI-GCC4.8,arm-***以后就这么写了,名字太长,这个选择源码或者选择编译好的都可以,有一个博客(
[单片机]
嵌入式<font color='red'>4412</font>开发板QT5.7编译安装到arm
tiny4412 UART 收发数据
Exynos4412 UART 的特性 Exynos4412 中UART,有4 个独立的通道,每个通道都可以工作于中断模式或DMA 模式,即 UART 可以发出中断或 DMA 请求以便在UART 、CPU 间传输数据。UART 由波特率发生器、发送器、接收器和控制逻辑组成。 使用系统时钟时,Exynos4412 的 UART 波特率可以达到 4Mbps 。波特率可以通过编程进行 。 Exynos4412 UART 的通道 0有 256 字节的发送 FIFO 和 256 字节的接收FIFO ;通道 1、4有 64 字节的发送 FIFO 和 64 字节的接收FIFO;通道 2、3有 16 字节的发送FIFO 和 16 字节 的
[单片机]
tiny<font color='red'>4412</font> UART 收发数据
Tiny4412的MMU映射代码示例
1、关于页表:ARMv6的MMU进行地址映射时涉及到两种页表, 一级页表(first level page table)和二级页表(coarse page table)。 2、关于映射方式:映射方式有两种,段映射和页映射。 段映射只用到一级页表,页映射用到一级页表和二级页表。 3、关于映射粒度:段映射的映射粒度有两种,1M section和16M supersection; 页映射的映射粒度也有两种,4K small page和64K large page。 ============================================
[单片机]
瑞苏盈科出席欧洲FPGA大会并发表演讲
FPGA Conference Europe 是欧洲领先的可编程逻辑器件专家会议 。在越来越受人工智能驱动的云数据中心、电信和许多其他高性能应用中,现场可编程门阵列(简称 FPGA)早已证明自己是适用于各种任务的灵活且强大的加速器解决方案。 2022年欧洲 FPGA 大会,于 7 月 5 日至 7 日在德国慕尼黑东会议中心举办,3天100%专业知识!75个来自全球顶级专家演讲。讨论嵌入式系统的开发人员必须处理新的解决方案和方法,但同时也要澄清基本问题:FPGA 是否适合他们自己的项目?使用 FPGA 的最佳方式是什么?瑞苏盈科作为参展商出席了此次会议并发表演讲! 欧洲FPGA大会现场 来自Enclustra的演讲者
[嵌入式]
瑞苏盈科出席欧洲FPGA大会<font color='red'>并发</font>表演讲
4412开发板和4418开发板接口区别说明
迅为iTOP-4412开发板与iTOP-4418开发板的区别对比,两款开发板可广泛适用于工控、智能家居、医疗、多媒体、安防、车载、金融、消费电子、手持设备、显示控制、教学、电力、通讯等领域。 4412开发板与4418开发板接口详细对比 iTOP-4412开发板(全能板) iTOP-4418开发板(全能板) 核心板参数 尺寸 SCP:6cm*7cm/POP:5cm*6cm 5cm*6cm CPU Exynos4412,四核Cortex-A9,主频为1.4GHz-1.6GHz Cortex-A9 四核 S5P4418处理器 1.4GHz 内存 2GB双通道 DDR3 1GB
[单片机]
<font color='red'>4412</font>开发板和4418开发板接口区别说明
Redmi K50官宣后陈劲祝贺并发声:摩托罗拉新机同样精彩
3月7日晚,联想集团中国区手机业务部总经理陈劲表示,友商终于确定发布会时间了,祝贺!也请期待三月中旬,摩托罗拉同样精彩来临。   此前小米集团中国区总裁、Redmi品牌总经理卢伟冰发文表示“3月会很精彩”,预告Redmi K50系列会在3月份正式发布。   这次摩托罗拉也将在3月份推出新机,这款新机应该就是尚未开卖的摩托罗拉edge X30屏下摄像版。   此前在2021年12月份,摩托罗拉共计推出了edge X30、edge S30和edge X30屏下摄像版三款机型,其中前两款已经上市发售,而edge X30屏下摄像版尚未开卖,这次发布会有可能会公布edge X30屏下摄像版的上市时间。   据悉,摩托罗拉edge
[手机便携]
Redmi K50官宣后陈劲祝贺<font color='red'>并发</font>声:摩托罗拉新机同样精彩

推荐帖子

TI DSP 指令注释
1,EALLOW,EDIS是成对使用的,有些寄存器是受到保护的,不能任意写,EALLOW相当于去掉保护,对写保护的寄存器进行操作后EDIS是重新把这个寄存器保护起来的意思。原来TI的DSP为了提高安全性能,将很多关键寄存器作了保护处理。通过状态寄存器1(ST1)的位6设置与复位,来决定是否允许DSP指令对关键寄存器进行操作。这些关键寄存器包括:器件仿真寄存器、FLASH寄存器、CSM寄存器、PIE矢量表、系统控制寄存器、GPIOMux寄存器等等。2,GPIO功能选择寄存器为MUX寄存
Aguilera DSP 与 ARM 处理器
负载超过LDO最大电流会出现什么问题?
比如我LDO后面接一个单片机,某个时间,单片机开启一些功耗大的外设,超过了LDO的最大电流,LDO会出现什么问题?单片机又会出现什么问题?负载超过LDO最大电流会出现什么问题?【某个时间,单片机开启一些功耗大的外设,超过了LDO的最大电流】这些外设,是否也由你的LDO供电? LDO负载太大:有可能会发热,输出有可能达不到要求(电压低)。如果太大的输出(输出短路)那就有可能冒烟(也可能不冒)。单片机电压低但还可以工作的电压可能就不会受什么影响。太低达到复位值可
wangerxian 电源技术
基于MSP430的移频信号测试系统的实现
基于MSP430的移频信号测试系统的实现基于MSP430的移频信号测试系统的实现
Jacktang 微控制器 MCU
近场通信 (NFC) 收发器参考设计
此近场通信(NFC)参考设计概括了所需的组件和布局注意事项,并提供固件示例以说明如何将NFC实施到应用中以便从应答器提取NFC数据交换格式(NDEF)数据、实施对等(P2P)连接或仿真NFC应答器。NFC可简化BluetoothTM和WiFi连接,支持交互式消费类显示并标准化数据传输格式。随附的文档、硬件和示例代码允许设计人员使用MSP430或其他精心挑选的MCU快速实现NFC功能。此设计基于TRF7970ATB设计。 集成的
Jacktang RF/无线
lc并联谐振问题
本帖最后由paulhyde于2014-9-1509:35编辑lc串联谐振要求达到10.7M,lc怎么取值,又没用特殊要求?lc并联谐振问题本帖最后由paulhyde于2014-9-1509:35编辑XL=XC时,为R-L-C串联电路产生谐振之条件。:本帖最后由paulhyde于2014-9-1509:35编辑现在我这个输出比原来的输入还小,这是怎么回事啊回复沙发电子竞赛的帖子
feiyun 电子竞赛
通向FPGA之路---七天玩转Altera之时序篇
通向FPGA之路---七天玩转Altera之时序篇通向FPGA之路---七天玩转Altera之时序篇白大侠能够给大家讲解一下就更好啦chenzhufly发表于2015-11-2821:46白大侠能够给大家讲解一下就更好啦 讲解不了,水平不够,还请空神给大家讲讲还有下篇吗?suoma发表于2015-11-2909:29还有下篇吗? 有基础篇和验证篇楼主把你的这些《通向FPGA之路》整理到一个帖子里dontium发表
白丁 FPGA/CPLD
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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