imx6q内核之信号量

2024-06-12 14:32
文章标签 imx6q 信号量 内核

本文主要是介绍imx6q内核之信号量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

生气驱动代码

/*************************************************************************> File Name: led_drv.c> Author: XXDK> Email: v.manstein@qq.com > Created Time: Sat 18 Mar 2017 06:27:26 AM PDT************************************************************************/#include<linux/init.h>
#include<linux/module.h>
#include<linux/fs.h>
#include<linux/cdev.h>
#include<linux/device.h>
#include<linux/slab.h>
#include<asm/gpio.h>
#include<mach/iomux-mx6q.h>#define SABRESD_GPIO_LED4	IMX_GPIO_NR(3, 21)struct led{char name[10];int gpio;int data;int open_cnt;struct semaphore sema;dev_t led_dev_id;struct cdev led_cdev;struct class* led_cls;struct file_operations led_fops;
}*sabre_led = NULL;static int led_open(struct inode* inodp, struct file* filp)
{// 获取信息量, 正常获取立刻返回,如果没有获取信息量,进程// 在此进入等待队列休眠,唤醒有两种方式:// 1. 正常获取信号量,函数返回0// 2. 收到信号引起的唤醒,返回非0if(down_interruptible(&sabre_led->sema)) {printk("wake up by signal\n");return -EINTR;}printk("opening sabre led......\n");gpio_set_value(sabre_led->gpio, 1);return 0;
}static int led_close(struct inode* inodp, struct file* filp)
{printk("closing sabre led device\n");up(&sabre_led->sema); // 唤醒等待队列的休眠进程,释放信号量gpio_set_value(sabre_led->gpio, 0);return 0;
}static int led_init(void)
{sabre_led = (struct led*)kmalloc(sizeof(struct led), GFP_KERNEL);if(NULL == sabre_led) {printk("kmalloc error\n");return -1;}sabre_led->led_fops.owner = THIS_MODULE,sabre_led->led_fops.open = led_open,sabre_led->led_fops.release = led_close;sabre_led->gpio = SABRESD_GPIO_LED4;strcpy(sabre_led->name, "led");gpio_request(sabre_led->gpio, sabre_led->name);gpio_direction_output(sabre_led->gpio, 0);// 1. 申请设备号alloc_chrdev_region(&sabre_led->led_dev_id, 0, 1, "leds");// 2. 初始化字符设备对象cdev_init(&sabre_led->led_cdev, &sabre_led->led_fops);// 3. 添加字符设备对象到内核cdev_add(&sabre_led->led_cdev, sabre_led->led_dev_id, 1);// 4. 自动创建设备文件sabre_led->led_cls = class_create(THIS_MODULE, "xxdk");device_create(sabre_led->led_cls, NULL, sabre_led->led_dev_id, NULL, "sabre_led");// 初始化信号量为互斥信号量sema_init(&sabre_led->sema, 1);	return 0;
}static void led_exit(void)
{gpio_set_value(sabre_led->gpio, 0);gpio_free(sabre_led->gpio);device_destroy(sabre_led->led_cls, sabre_led->led_dev_id);class_destroy(sabre_led->led_cls);cdev_del(&sabre_led->led_cdev);unregister_chrdev_region(sabre_led->led_dev_id, 1);kfree(sabre_led);sabre_led = NULL;printk("bye bye\n");return;
}module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");
生气测试代码

/*************************************************************************> File Name: led_test.c> Author: XXDK> Email: v.manstein@qq.com > Created Time: Sat 18 Mar 2017 08:24:16 AM PDT************************************************************************/#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>int main()
{int fd;if((fd = open("/dev/sabre_led", O_RDWR)) < 0) {perror("open sabreled failed");}sleep(20);close(fd);return 0;
}



这篇关于imx6q内核之信号量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054480

相关文章

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等

国产数据库 - 内核特性 - CloudberryDB中的Runtime Filter

国产数据库 - 内核特性 - CloudberryDB中的Runtime Filter 今年5月份GreenPlum官方将GitHub仓库代码全部删除,各个分支的issues和bugs讨论等信息全部清除,仅将master分支代码进行归档。对于国内应用GPDB的用户来说,这是一个挑战性事件,对与后期维护、升级等都变得非常困难。有幸HashData开源了基于GP衍生版本CloudberryDB版本,

java NIO 缓存区之内核空间、用户空间和虚拟地址

IO是基于缓存区来做的,所谓的输入和输出就是从缓存区中移入和移出数据。以IO输入为例,首先是用户空间进程向内核请求某个磁盘空间数据,然后内核将磁盘数据读取到内核空间的buffer中,然后用户空间的进程再将内核空间buffer中的数据读取到自身的buffer中,然后进程就可以访问使用这些数据。     内核空间是指操作系统内核运行的空间,是为了保证操作系统内核的能够安全稳定地运行而为内核专

几何内核开发-实现自己的NURBS曲线生成API

我去年有一篇帖子,介绍了NURBS曲线生成与显示的实现代码。 https://blog.csdn.net/stonewu/article/details/133387469?spm=1001.2014.3001.5501文章浏览阅读323次,点赞4次,收藏2次。搞3D几何内核算法研究,必须学习NURBS样条曲线曲面。看《非均匀有理B样条 第2版》这本书,学习起来,事半功倍。在《插件化算法研究平台

线程间通信方式(互斥(互斥锁)与同步(无名信号量、条件变量))

1通信机制:互斥与同步 线程的互斥通过线程的互斥锁完成; 线程的同步通过无名信号量或者条件变量完成。 2  互斥 2.1 何为互斥?         互斥是在多个线程在访问同一个全局变量的时候,先让这个线程争抢锁的资源,那个线程争抢到资源,它可以访问这个变量,没有争抢到资源的线程不能够访问这个变量。那这种只有一个线程能够访问到这个变量的现象称之为线程间互斥。 2.2互斥锁API 1.

Redhat7.2上编译Linux内核源码

下载linux源码包:https://git.kernel.org/pub/scm/virt/kvm/kvm.git/snapshot/kvm-4.17-1.tar.gz (这是包含kvm开发版本的linux内核源码)解压到源码根目录下执行make allyesconfig生成编译的配置文件查看Documentation目录下的Changes文件,把需要的工具都安装好,通过以下命令把工具安装好:y

针对ARM64嵌入式系统的Linux内核参数优化

文章目录 0. 概要1. 网络性能优化开启TCP连接重用减少TCP连接超时时间 2. 文件系统和I/O优化提高文件描述符限制 3. 内存管理优化提高内存可用性 4. 内核调度优化调整CFS调度器的调度周期 5. 完整配置文件 0. 概要 在ARM64架构的嵌入式系统中,系统性能和资源优化至关重要。这类系统通常在资源受限的环境下运行,如物联网设备、移动设备等。合理配置Linux

Linux内核开发-编写一个内核模块

0.前言 上一章(点击返回上一章)已经完成了将ubuntu原始内核替换成了自己编好的内核。本章开始编写一个内核模块。 1.内核模块 1.1 什么是内核模块 Linux内核模块可独立于内核之外进行编译,可以在内核运行时动态加载、卸载。内核模块以.ko为后缀。 1.2 操作内核模块常用的指令 # 查看当前正在运行的模块lsmod#插入一个模块insmod module_name# 卸载

八、(正点原子)Linux内核定时器实验

定时器是我们最常用到的功能,一般用来完成定时功能,本章我们就来学习一下 Linux 内核提供的定时器 API 函数,通过这些定时器 API 函数我们可以完成很多要求定时的应用。 Linux内核也提供了短延时函数,比如微秒、纳秒、毫秒延时函数,本章我们就来学习一下这些和时间有关的功能。 一、Linux时间管理和内核定时器介绍         1、内核时间管理         在

微型操作系统内核源码详解系列五(五):cm3下Pendsv切换任务上篇

系列一:微型操作系统内核源码详解系列一:rtos内核源码概论篇(以freertos为例)-CSDN博客 系列二:微型操作系统内核源码详解系列二:数据结构和对象篇(以freertos为例)-CSDN博客 系列三:微型操作系统内核源码详解系列三(0):空间存储及内存管理篇(前置篇)-CSDN博客                 微型操作系统内核源码详解系列三(1):任务及切换篇(任务函数定义)-