linux函数练习
年纪青青
嵌入式软件工程师:单片机编程,电路设计,Linux,Qt,opecv计算机视觉
展开
-
关于wait()与waitpid()的理解
wait() 与waitpid()函数格式如下:#include pid_t wait(int *statloc);pid_t waitpid(pid_t pid,int *statloc,int options);这两个函数区别如下:1、在一个进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可以使调用者不阻塞;2、waitpid并不等待在其调用后第一个终止的子进程原创 2017-09-13 13:29:00 · 851 阅读 · 0 评论 -
Linux进程通信之信号通信
信号通信信号通信很简单,将特定信号传递给进程,使进程进行相应动作,信号是软中断,只要执行过,就生效,不必一直卡死等待信号来临,以此达到通信的目的。linux信号量有很多在文章最后列举;信号通信函数结构#include <signal.h> void (*signal(int signo,void(*func)(int)))(int) 可以看到信号函数结构比较复杂 sign原创 2018-04-18 12:36:58 · 231 阅读 · 0 评论 -
linux进程相关函数(获取、销毁、切换···)
进程概述进程:就是进行中的程序 程序:存放指令的程序文件,存放在磁盘上,固定不变的,保存着指令的有序集合。 程序执行过程:将程序从硬盘导入到内存,内存上分为代码区、静态变量区、堆栈区等等 文本区:储存处理器执行的代码 数据区:存储变量和动态分配的内存:全局变量,局部变量,静态变量, 堆栈区:存储着活动进程调用的指令和本地变量,指针变量->栈区,动态分配的内存->堆区 进...原创 2018-05-04 08:23:42 · 3646 阅读 · 0 评论 -
linux守护进程
概述 操作系统总有一些默默在后台运行着的程序,被称作服务,不与使用者进行交互。他们的功能很简单一般是重复性周期性的或者只有等待某些事件的发生才会做出相应动作,例如邮件接收监听程序每隔一段时间就会扫描一下是否有新的邮件到来,linux中同样存在这样的程序,在后台运行脱离终端控制,不在终端进行交互,这样的进程被称作守护进程,这样的进程不受用户注销影响通俗解释 (这是一个粗...原创 2018-05-30 15:29:07 · 309 阅读 · 0 评论 -
linux线程及线程同步(锁的应用)
linux线程 linux原本没有线程,后来在windows多线程编程影响下linux内核开发者在进程基础上在功能上做出了类似windows线程的linux版本的线程,linux线程归根到底还是进程,只不过是轻量级的进程,开销比真正进程要小得多,大家还是要明白linux与windows在线程方面功能虽然类似,但是底层实现是非常不同的。linux进程大概实现原理 在进程...原创 2018-06-08 15:36:33 · 4885 阅读 · 0 评论 -
基于JZ2440自己编写4.3寸LCD驱动
简介 linux内核自带LCD驱动,这里我们自己从头写一个LCD驱动程序,编写APP的人只知道使用open、read、write······,并不清楚原理图或者寄存器,这接口函数最终调用的是我们自己在驱动中实现的驱动层open、read、write,这些代码与硬件息息相关。一般写驱动基本步骤就是: 定义主设备号 写一个文件操作集合 register_chidev进行...原创 2018-08-26 09:48:24 · 842 阅读 · 0 评论 -
基于JZ2440编写触摸屏驱动
简介 JZ2440开发板配套的是一款4.3英寸电阻触控屏,电阻触控屏原理很简单,就是尖锐物体在某一个点按下,上面触控薄膜导电,由于这个点举例起始点暂且规定00点,距离不同,电阻薄膜导电电阻不同,电压压降也就不同,原理就是通过判断XY两个方向轴与零点之间的电压差确定触控位置。内核触控驱动 内核自带触摸屏驱动,在s3c2440_ts.c这个文件,实现这个文件的主体框架就是...原创 2018-08-26 16:36:06 · 981 阅读 · 0 评论 -
Linux输入子系统框架
输入子系统自己写的驱动程序,自己可以调用,我们自己写驱动的流程一般是,建立fops结构,使用register_chrdev在初始化函数中进行注册,在应用中使用open函数打开该设备。这种驱动不标准只能在公司内部,别人知道驱动用法的情况下才能使用,当我们使用QT等标准程序时,这类标准程序不能打开像我们这样的野驱动,我们应该让我们的驱动程序融入“标准”中去,linux提供的输入子系统输...原创 2018-08-23 08:11:54 · 304 阅读 · 0 评论 -
基于JZ2440按键输入子系统代码实现
简介 自己写驱动流程 APP:open、read、write 驱动层: 实现相应的open、read、write函数 使用file_operation结构挂接自己的相关函数 使用chrdev_register注册 初始化 退出等等 现在有了子系统结构,核心层已经有人写好,我们只需要实现两层即可:设备层、操作层 设备层实现步骤...原创 2018-08-23 08:13:40 · 361 阅读 · 0 评论 -
JZ2440开发板之LED支持lseek
驱动#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/device.h>#include <linux/delay.h>#include ...原创 2018-08-23 08:15:20 · 188 阅读 · 0 评论 -
基于JZ2440实现驱动互斥操作以及阻塞非阻塞操作
实现同一驱动不能被同时打开思路很简单,设置一个变量,打开时减一,如果另外程序再将其打开,数值变化,就并不能打开。下面看伪代码static int canopen=1;int xxx_open(){ if(--canopen!=0) { return -1; }else { 正常打开; }}void xx...原创 2018-08-23 08:18:21 · 140 阅读 · 0 评论 -
基于JZ2440实现linux驱动异步通信
按键驱动前期按键驱动无论是查询、中断、poll都是采用应用程序主动查询的方式,能不能有一种按键按下,驱动告诉应用程序该查询的机制呢?那是肯定的,类似于系统编程的信号机制。这里需要解决核心问题: 信号发出者 信号接收者 信号怎么发建立一个异步通信结构体该结构体存储相关信息static struct fasync_struct *button_fasync;建立系...原创 2018-08-23 08:19:45 · 218 阅读 · 0 评论 -
ubuntu16网络命令、缺少一些库的应对方法
设置静态ip的方法打开网络配置文件/etc/network/interfacesvi /etc/network/interfaces默认内容# Configure Loopbackauto loiface lo inet loopbackauto eth0iface eth0 inet dhcp修改内容为:# Configure Loopb...原创 2018-08-23 08:26:09 · 747 阅读 · 0 评论 -
linux基于socket网络编程
socket简介 Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的 Socket数据传输是一种特殊的...原创 2018-08-23 08:35:25 · 7341 阅读 · 0 评论 -
基于linux的socket实现简易QQ代码
网络编程示例,写一个简单的QQ程序服务器端#include<arpa/inet.h>#include<string.h>#include<stdlib.h>#include<sys/types.h>#include<sys/socket.h>#include<unistd.h>#include<s...原创 2018-08-23 08:50:35 · 1603 阅读 · 3 评论 -
基于JZ2440的LED平台驱动写法
驱动分层分离 在前面介绍的输入子系统中,核心层input.c,设备层button.c包含硬件相关代码,软件层cdev.c纯软件处理部分。 linux驱动中有很多类似的驱动形式,例如总线驱动platform平台设备模型 platform.c属于核心层级别,设备层device包含硬件相关代码,driver层包含驱动层相关代码属于比较固化稳定的软件代码,设备发生改变只要改变设备层代码...原创 2018-08-23 22:53:23 · 297 阅读 · 0 评论 -
linux下C语言基本的目录操作编程函数简介
目录简介对于linux文件目录操作函数其实使用命令就能实现,但是其实对于一些命令本质上就是调用系统函数的,比如:madir,umask,chown等命令。获取文件信息主要函数#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>//不能读取软连接文件int st...原创 2018-04-22 11:00:56 · 3263 阅读 · 1 评论 -
Linux进程通信之共享内存
共享内存进程间共享内存通信,原理很简单,系统开辟一块内存空间,将其映射到物理内存,不同进程可以通过访问这个公共的共享空间完成数据交换,达到进程间通信的目的。访问快,使用简单。不需要额外的函数(如read write等) 使用共享内存包含两个步骤: 创建共享内存,使用shmget函数。 映射共享内存,将这段创建的共享内存映射到具体的进程空间,使用shmat函数。 shm原创 2018-04-18 10:09:14 · 208 阅读 · 1 评论 -
linux内核tasklet机制
前言 前面讲了linux中断编程:顶半部、底半部 中断顶半部:做紧急的,耗时短的事情,同时还启动中断底半部(如果有)。 中断底半部:做耗时的事情,这个事件可以被中断 实现方法:tasklet、工作队列、软中断等机制。实际上是把耗时的事件推后执行,不在中断程序中执行。内核tasklet机制tasklet机制是一种比较特殊的软中断,tasklet一词原意是“小片任务”的意思,这里原创 2017-12-07 20:07:13 · 1033 阅读 · 0 评论 -
linux系统下的文件I/O操作
对于文件操作,标准C库与linux各有自己的一套体系。并且在linux环境下两种体系都可以完成对文件的操作,在这里我们不介绍标准C库文件操作集,主要说明linux下的文件I/O集合。其实两种体系文件操作方式大体类似。主要涉及打开文件、读文件、写文件等。在linux系统中大多数文件I/O只需要用到5个函数:open read write lseek 以及close。creat函数经常被open整原创 2017-09-13 15:40:18 · 283 阅读 · 0 评论 -
linux进程间管道通信pipe与fifo
进程间通信的方式有很多种,管道通信就是其中一种,所谓管道通信就是通信流程类似管道,数据只能从一个方向流向另一个方向。不能反向流动。管道通信又分为无名管道通信、有名管道通信。无名管道只能用于父子进程通信,独立进程间不能通信,无名管道通信示意如下:实际管道1、2的角色是由内核充当的。pipe函数格式如下#include int pipe(int pipefd[2]);函数返回原创 2017-09-13 20:47:04 · 457 阅读 · 0 评论 -
Linux信号通信
信号通信函数结构#include void (*signal(int signo,void(*func)(int)))(int)可以看到信号函数结构比较复杂signal函数本身是个函数指针,参数为int型。signal函数参数:signo:具体信号名称或者编号第二个参数func: 1、SIG_IGN 忽略此信号 2、SIG_原创 2017-09-18 14:55:45 · 817 阅读 · 0 评论 -
linux进程通信之消息队列
进程通信信号量方式传送信息量有限,管道只能传送无格式字节流,无疑给程序开发带来不便,消息队列克服了这些缺点。消息队列就是一个消息链表,可以把消息看做一个记录,具有特定格式,进程可以向其中按照一定规则添加新消息;另一些进程可以从消息队列读走消息。消息队列只有在内核重新启动,或者人工删除才会消失。消息队列内核持续性需要消息队列在系统范围内拥有唯一个键值,所以,要获得一个消息队列的描述字,必须提原创 2017-09-15 16:39:19 · 192 阅读 · 0 评论 -
linux早期经典字符设备驱动模型
早期经典标准字符设备描述方式没有使用一个结构体进行封装,没有做一个整体描述。设备号主设备号:0~255(10除外) 次设备号:0~255全部占用(早期经典字符设备只能以主设备号区分)设备特征安装后不会在/dev目录下创建设备文件节点,需要手动mknod命令创建调用一个register_chrdev注册函数后,一个主设备号下面的256个次设备号都被占用完了,也就是说一个主设备号只能使用regis原创 2017-10-20 08:48:41 · 521 阅读 · 0 评论 -
简单的linux杂项设备驱动的写法
linux将设备驱动分成几大类:字符设备、杂项设备、块设备、网络设备······本篇文章介绍杂项设备驱动的编写,杂项设备与字符设备本质上没什么区别,但是写法上有区别。除此之外杂项设备主设备号都为10,设备间通过次设备号来进行区分,与字符设备相比节约了主设备号。杂项设备驱动编写模式一般如下:在linux系统下一切皆文件,设备驱动同样秉承此“”大法“”。对文件操作就少不了打开、读写原创 2017-10-11 13:38:07 · 1709 阅读 · 0 评论 -
linux内核工作队列
内核工作队列概述工作队列(workqueue)是另外一种将工作推后执行的形式,工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行,最重要的就是工作队列允许被重新调度甚至睡眠。linux workqueue工作原理linux系统启动期间会创建名为kworker/u:x(x是0开始的整数,表示CPU编号)工作者内核线程,该线程创建之后处于sleep状态。从调度器原创 2017-12-09 12:45:42 · 5563 阅读 · 1 评论 -
linux平台设备驱动模型
linux平台设备介绍linux2.6以上的设备驱动模型中,有三大实体:总线,设备和驱动。总线负责将设备和驱动绑定,在系统没注册一个设备的时候,会寻找与之匹配的驱动:相反的,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配则由总线完成。 一个现实的linux设备和驱动通常都需要挂接在一个总线上例如PCI、USB、I2C、SPI接口的设备都是由对应的总线来管理,通过总线来操作设备。但对于So原创 2017-12-10 21:01:40 · 1517 阅读 · 0 评论 -
Framebuffer设备应用程序编程
Framebuffer的原理Framebuffer是linux系统抽象出来供用户态进程直接写屏的一种设备,用户可以将Framebuffer看做是显示内存的一个映像,将其映射到地址空间之后,就可以直接进行读写操作,而写操作可以立即同步显示在LCD屏幕上。这种操作是抽象的,统一的,应用编程者不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。 简单说:把一个原创 2017-12-11 21:57:27 · 931 阅读 · 0 评论 -
基于tiny4412按键中断驱动的poll、select函数演示
poll函数应用背景文件阻塞、非阻塞操作对单个文件可能影响不大,但当我们以阻塞的方式打开多个文件时,有时会出现一种不好的现象,下面利用伪代码演示一下:#include <···>int fd1,fd2;int main(void){ fd1=open("/dev/sd1",ORDWR); fd2=open("/dev/sd2",ORDWR); read(fd1,user,4) //读取原创 2017-11-24 11:35:47 · 366 阅读 · 0 评论 -
linux内核定时器
linux内核定时器概述linux内核定时器是用来在未来某个时间点(基于jiffiles),执行某个函数的一种机制,相关源码在linux/timer.c文件中 linux内核定时器的超时函数运行一次后就不在运行了(相当于单次定时效果),但可以通过在超时函数中重新注册定时器来循环定时效果、在SMP(多核CPU)芯片的CPU上,定时函数总是在注册它的同一CPU上运行。linux内核定时器核心结构体内核原创 2017-12-06 20:35:14 · 985 阅读 · 0 评论 -
基于tiny4412开发板的I2C子系统写法
I2C总线知识I2C子系统框架 I2C是一个不是很复杂的通信协议,在裸机上能够轻易实现,但是linux系统下的I2C系统框架复杂的,简单控制IO电平输出不行,这是因为与裸机相比,linux是一个多进程系统,在进行I2C通信过程中很可能被其他进程打断,这样就会造成数据丢失,为了避免此种情况,便有了现在的I2C子系统,除了保证数据不丢失,可移植性也大大增强。I2C核心I2C核心提供了I2C总线驱动和设原创 2017-12-16 17:40:06 · 717 阅读 · 0 评论 -
LCD设备驱动框架分析(数据结构)
LCD设备驱动框架图如上图所示核心层是通用的,不需要任何修改。驱动开发者只需要实现硬件设备驱动层帧缓冲设备可以看做是一个完整的子系统,主要由核心层的fbmem.c和硬件设备驱动层构成核心层代码fnmem.c向上提供了完整的字符设备操作接口,也就是实现注册字符设备,提供通用的open,read,write,ioctl,mmap等接口;向下给硬件设备驱动层提供标准的驱动编程接口;在linux系统原创 2017-12-16 17:43:19 · 1022 阅读 · 0 评论 -
移植QT5.7到tiny4412开发板
移植前的准备 虚拟机:ubuntu16.04,硬盘空间尽量大一些,20G略微有点小,开发板根文件系统已经做好。 交叉编译环境:arm-linux-gcc使用4.8版本以上,否则对c++11支持度不好,这里使用arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 QT5.7源码包:针对嵌入式平台编译,编译...原创 2018-08-28 08:44:42 · 4291 阅读 · 4 评论