
linux
文章平均质量分 63
年纪青青
嵌入式软件工程师:单片机编程,电路设计,Linux,Qt,opecv计算机视觉
展开
-
泰山派GPIO子系统驱动---亮灯
本文将以开发板第40引脚GPIO3_B4作为LED灯珠的控制引脚,高电平灯亮,低电平灯灭。原创 2024-12-26 16:07:43 · 914 阅读 · 0 评论 -
将当前用户添加到samba共享组
将用户添加到samba共享组,解决windows访问时出错。原创 2024-12-19 15:42:27 · 120 阅读 · 0 评论 -
Linux开机启动程序添加root权限
DebainUbuntu系列Linux开机之后会执行文件中的命令,所以,如果是想添加登陆用户所具有权限的操作,可以在文件中exit 0之前添加开机自动执行的脚本命令。再加入自动执行脚本:在exit 0的上面新起一行,写入。以上情况均适用于脚本中的执行命令都不需要root权限才能执行的操作,但是,如果x.sh脚本中具有只有root权限才能执行的操作时,以上的方式便不能生效。原创 2023-08-17 13:13:04 · 1738 阅读 · 0 评论 -
NanoPi NEO移植LVGL8.3.5到1.69寸ST7789V屏幕
【代码】NanoPi NEO移植LVGL8.3.5到1.69寸ST7789V屏幕。原创 2023-08-13 12:53:30 · 895 阅读 · 0 评论 -
普通用户添加 sudo 权限
普通用户获取sudo权限原创 2023-02-17 10:38:33 · 1932 阅读 · 0 评论 -
基于JZ2440实现linux驱动异步通信
按键驱动前期按键驱动无论是查询、中断、poll都是采用应用程序主动查询的方式,能不能有一种按键按下,驱动告诉应用程序该查询的机制呢?那是肯定的,类似于系统编程的信号机制。这里需要解决核心问题: 信号发出者 信号接收者 信号怎么发建立一个异步通信结构体该结构体存储相关信息static struct fasync_struct *button_fasync;建立系...原创 2018-08-23 08:19:45 · 239 阅读 · 0 评论 -
基于JZ2440编写触摸屏驱动
简介 JZ2440开发板配套的是一款4.3英寸电阻触控屏,电阻触控屏原理很简单,就是尖锐物体在某一个点按下,上面触控薄膜导电,由于这个点举例起始点暂且规定00点,距离不同,电阻薄膜导电电阻不同,电压压降也就不同,原理就是通过判断XY两个方向轴与零点之间的电压差确定触控位置。内核触控驱动 内核自带触摸屏驱动,在s3c2440_ts.c这个文件,实现这个文件的主体框架就是...原创 2018-08-26 16:36:06 · 1024 阅读 · 0 评论 -
基于JZ2440自己编写4.3寸LCD驱动
简介 linux内核自带LCD驱动,这里我们自己从头写一个LCD驱动程序,编写APP的人只知道使用open、read、write······,并不清楚原理图或者寄存器,这接口函数最终调用的是我们自己在驱动中实现的驱动层open、read、write,这些代码与硬件息息相关。一般写驱动基本步骤就是: 定义主设备号 写一个文件操作集合 register_chidev进行...原创 2018-08-26 09:48:24 · 883 阅读 · 0 评论 -
QT入门(一)Qt工程简介、信号与槽初步练习
QT入门篇讲义笔记(一)标签(空格分隔): QT 信号与槽 信号重载 lambda函数QT程序结构程序特点跟普通程序一样,头文件,源文件,工程文件.pro头文件特点QT系统头文件没有.h头文件和类名一样命名Q开头,前两个字母大写工程文件.Pro的相关介绍# 模块QT += core gui# 高于4版本添加本句内容,增加兼容greaterTh...原创 2018-06-29 10:56:58 · 618 阅读 · 1 评论 -
linux线程及线程同步(锁的应用)
linux线程 linux原本没有线程,后来在windows多线程编程影响下linux内核开发者在进程基础上在功能上做出了类似windows线程的linux版本的线程,linux线程归根到底还是进程,只不过是轻量级的进程,开销比真正进程要小得多,大家还是要明白linux与windows在线程方面功能虽然类似,但是底层实现是非常不同的。linux进程大概实现原理 在进程...原创 2018-06-08 15:36:33 · 4926 阅读 · 0 评论 -
linux守护进程
概述 操作系统总有一些默默在后台运行着的程序,被称作服务,不与使用者进行交互。他们的功能很简单一般是重复性周期性的或者只有等待某些事件的发生才会做出相应动作,例如邮件接收监听程序每隔一段时间就会扫描一下是否有新的邮件到来,linux中同样存在这样的程序,在后台运行脱离终端控制,不在终端进行交互,这样的进程被称作守护进程,这样的进程不受用户注销影响通俗解释 (这是一个粗...原创 2018-05-30 15:29:07 · 334 阅读 · 0 评论 -
makefile快速入门
Makefile干嘛的? 当我们编程做一个项目,文件众多复杂,不可能每次编译都去敲gcc指令编译链接工程,一则效率不高,随便修改某个文件就需要把工程内所有文件都编译一遍,二则包含项目太多稍不注意就会遗漏、缺失容易出错,Makefile其实就是一个项目工程管理工具,只需要执行make指令,就能做到像编程IDE中的build按钮那样轻轻一点自动把项目编译完成。生成目标程序,效率很高,但要写好M...原创 2018-04-26 12:36:56 · 1060 阅读 · 1 评论 -
linux进程相关函数(获取、销毁、切换···)
进程概述进程:就是进行中的程序 程序:存放指令的程序文件,存放在磁盘上,固定不变的,保存着指令的有序集合。 程序执行过程:将程序从硬盘导入到内存,内存上分为代码区、静态变量区、堆栈区等等 文本区:储存处理器执行的代码 数据区:存储变量和动态分配的内存:全局变量,局部变量,静态变量, 堆栈区:存储着活动进程调用的指令和本地变量,指针变量->栈区,动态分配的内存->堆区 进...原创 2018-05-04 08:23:42 · 3888 阅读 · 0 评论 -
Linux输入子系统框架
输入子系统自己写的驱动程序,自己可以调用,我们自己写驱动的流程一般是,建立fops结构,使用register_chrdev在初始化函数中进行注册,在应用中使用open函数打开该设备。这种驱动不标准只能在公司内部,别人知道驱动用法的情况下才能使用,当我们使用QT等标准程序时,这类标准程序不能打开像我们这样的野驱动,我们应该让我们的驱动程序融入“标准”中去,linux提供的输入子系统输...原创 2018-08-23 08:11:54 · 332 阅读 · 0 评论 -
基于JZ2440按键输入子系统代码实现
简介 自己写驱动流程 APP:open、read、write 驱动层: 实现相应的open、read、write函数 使用file_operation结构挂接自己的相关函数 使用chrdev_register注册 初始化 退出等等 现在有了子系统结构,核心层已经有人写好,我们只需要实现两层即可:设备层、操作层 设备层实现步骤...原创 2018-08-23 08:13:40 · 393 阅读 · 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 · 208 阅读 · 0 评论 -
基于JZ2440实现驱动互斥操作以及阻塞非阻塞操作
实现同一驱动不能被同时打开思路很简单,设置一个变量,打开时减一,如果另外程序再将其打开,数值变化,就并不能打开。下面看伪代码static int canopen=1;int xxx_open(){ if(--canopen!=0) { return -1; }else { 正常打开; }}void xx...原创 2018-08-23 08:18:21 · 162 阅读 · 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 · 783 阅读 · 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 · 7401 阅读 · 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 · 1640 阅读 · 3 评论 -
基于JZ2440的LED平台驱动写法
驱动分层分离 在前面介绍的输入子系统中,核心层input.c,设备层button.c包含硬件相关代码,软件层cdev.c纯软件处理部分。 linux驱动中有很多类似的驱动形式,例如总线驱动platform平台设备模型 platform.c属于核心层级别,设备层device包含硬件相关代码,driver层包含驱动层相关代码属于比较固化稳定的软件代码,设备发生改变只要改变设备层代码...原创 2018-08-23 22:53:23 · 324 阅读 · 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 · 4384 阅读 · 4 评论 -
linux下gcc基本操作以及静态库、动态库的制作
c文件编译过程预编译(展开头文件、去掉注释、宏处理)(.c->.i)编译(.i->.s) 汇编 (.s->.o)链接 (.0->app)基本指令gcc-E:预处理将.c文件变为.i文件(其实也是c文件)-S:编译,将.i文件变为.s汇编文件-c:汇编,将.c文件变为.o二进制文件-o:指定名称-g:gdb调试的时候需要加-D:在...原创 2018-04-25 15:47:08 · 354 阅读 · 0 评论 -
vim 基本够用的操作命令
命令模式保存退出:ZZ 若果文件不存在,退出时不会创建新的文件代码格式化:gg=G光标移动 上下左右:hjkl光标移动到行首:0光标移动到行尾:$光标移动到文件开头:gg光标移动到文件末尾:G光标跳转到某行:行号+G行号回车:当前行向下跳转行号数行删除命令 删除字符:x:删除光标后面的字符;X:删除光标前面的字符删除单词(删除光标后面到单词尾):dw 删除某行光标前...原创 2018-04-24 13:16:36 · 285 阅读 · 1 评论 -
Linux进程通信之信号通信
信号通信信号通信很简单,将特定信号传递给进程,使进程进行相应动作,信号是软中断,只要执行过,就生效,不必一直卡死等待信号来临,以此达到通信的目的。linux信号量有很多在文章最后列举;信号通信函数结构#include <signal.h> void (*signal(int signo,void(*func)(int)))(int) 可以看到信号函数结构比较复杂 sign原创 2018-04-18 12:36:58 · 254 阅读 · 0 评论 -
基于tiny4412开发板LED灯驱动标准的llseek函数写法
简介我们写的驱动,有时候虽然也调用相关read write等函数,但是我们在上层操作时,可能我们写的并不符合标准API函数接口,因此我们需要将我们的驱动函数进行标准化处理。lseek用户空间驱动原型off_t lseek(int fd, off_t offset, int whence);参数: fd:文件描述符 offset:偏移量,可证可负 whence:偏移位置,有几个重要的宏如下:原创 2017-11-12 17:34:46 · 377 阅读 · 0 评论 -
基于tiny4412按键中断编程
准备工作要先把内核中原有的按键驱动干掉,重新编译内核,用新的内核进行编程。否则原来的按键驱动会阻碍我们编写自己的按键中断驱动,比如相关资源无法使用被系统的按键驱动占用,导致我们无法使用。具体操作方法方法如下: 将*号改为M或者空白 执行完毕之后,重新编译内核,在linux-3.5目录执行make -j4至于j几根据机器性能来决定,机器性能越好,数字可以填的越大,可增大编译速度。make执原创 2017-11-18 20:47:40 · 1118 阅读 · 0 评论 -
tiny4412开发板蜂鸣器驱动
简介蜂鸣器作为简单的发声器件在电路中是个常用的元器件,它的控制比较简单,搭配简单的驱动电路,通过CPU I/O引脚的电平变化就可以控制它的发声与否。在高级控制中可以利用PWM波对蜂鸣器进行调音,这里只演示蜂鸣器是否发声,在tiny4412开发板上蜂鸣器驱动电路如下: 与蜂鸣器连接的引脚通过逐级查找,可以看到它的引脚与CPU GPD0引脚连接,分析蜂鸣器驱动电路可以得出这样的结论:CPU I/O原创 2017-11-04 13:11:14 · 2397 阅读 · 1 评论 -
基于tiny4412开发板led灯字符设备ioctl驱动写法
ioctl接口作用write:向设备写入数据,单独这个接口并不能满足现实设备控制的全部需求。例如一个LCD控制器:主要作用是驱动lcd屏,要显示就是通过write接口把显示数据发给lcd控制器指定的显存。而参数设置类参数通过write接口设置就可能回和普通的显示数据弄混了。为了解决这个问题,内核提供一个接口ioctl对设备进行控制(参数设置,参数查询等功能)。ioctl主要实现不太好实现的功能。io原创 2017-11-13 14:42:19 · 1263 阅读 · 0 评论 -
基于tiny4412开发板LED灯驱动标准的read write函数写法
简介原来曾经写过一个led灯的驱动,调用read write函数对灯的亮灭进行操作,虽然达到了控制的目的,学过系统编程的人知道,其实标准的read write函数的用法,并不是这样的,在对文件操作时,我们读取相关文件内容时,每当我们读取一部分内容时,文件内位置指针会随着移动,在进行文件内容读取时,读取内容会在当前位置读取一定数量的内容。写操作同样。当我们写一些内容到一个文件,例如将123445678原创 2017-11-12 15:44:24 · 698 阅读 · 0 评论 -
tiny4412开发板LED灯驱动写法
简介led灯成本很低,操控简单,在嵌入式产品中不可或缺,可以作为调试标识,状态指示等等,高级用法还可以作为呼吸灯进一步增强其美观性。本章介绍只控制led灯的亮灭,tiny4412开发板有四个LED灯在核心板上供用户操作,led灯亮灭靠cpu IO口输出电平,具体操控看实际电路。电路图在tiny4412开发板上,led灯电路如下: 与CPU连接如下: 可以看到CPU相应引脚输出相关电平,就原创 2017-11-12 15:08:13 · 3381 阅读 · 0 评论 -
书写驱动必要安全性检测
驱动安全性意义驱动直接操作的对象是硬件,运行在内核空间,如果驱动不可靠一旦出现问题,操作系统会出现异常,有很大几率造成系统崩溃。因此驱动安全性极为重要,在驱动代码中凡是有可能执行失败的函数,都需要对其返回值进行判断,成功后才可以进入下一个环节。最大限度减少出错的可能。示例代码(没有安全检测)#include<linux/kernel.h>#include<linux/module.h>#incl原创 2017-10-26 08:39:08 · 315 阅读 · 0 评论 -
linux2.6标准字符设备驱动模型(手动注册)
linux2.6标准字符设备核心结构//虽然linux26有核心结构体,但在代码中没有具体操作,他们的调用在相关注册函数中对其有操作struct cdev { struct kobject kobj; struct module *owner; const struct file_operations *ops; struct list_head list;原创 2017-10-25 13:35:18 · 832 阅读 · 0 评论 -
linux早期经典字符设备驱动模型
早期经典标准字符设备描述方式没有使用一个结构体进行封装,没有做一个整体描述。设备号主设备号:0~255(10除外) 次设备号:0~255全部占用(早期经典字符设备只能以主设备号区分)设备特征安装后不会在/dev目录下创建设备文件节点,需要手动mknod命令创建调用一个register_chrdev注册函数后,一个主设备号下面的256个次设备号都被占用完了,也就是说一个主设备号只能使用regis原创 2017-10-20 08:48:41 · 558 阅读 · 0 评论 -
linux内核工作队列
内核工作队列概述工作队列(workqueue)是另外一种将工作推后执行的形式,工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行,最重要的就是工作队列允许被重新调度甚至睡眠。linux workqueue工作原理linux系统启动期间会创建名为kworker/u:x(x是0开始的整数,表示CPU编号)工作者内核线程,该线程创建之后处于sleep状态。从调度器原创 2017-12-09 12:45:42 · 5725 阅读 · 1 评论 -
linux中断编程、中断基础介绍
中断基础介绍中断就是CPU正常运行期间,由于内、外部事件引起的CPU暂时停止正在运行的程序,去执行该内部事件或外部事件的引起的服务中去,服务执行完毕后再返回断点处继续执行的情形。中断的意义极大提高CPU运行效率中断服务程序中断处理程序:在中断发生时被调用的函数称为中断服务函数。 中断服务函数的原则:linux是多进程操作系统 中断不属于任何一个进程,因此不能在中断程序中休眠和调用schedul原创 2017-11-16 19:47:23 · 9603 阅读 · 1 评论 -
linux平台设备驱动模型
linux平台设备介绍linux2.6以上的设备驱动模型中,有三大实体:总线,设备和驱动。总线负责将设备和驱动绑定,在系统没注册一个设备的时候,会寻找与之匹配的驱动:相反的,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配则由总线完成。 一个现实的linux设备和驱动通常都需要挂接在一个总线上例如PCI、USB、I2C、SPI接口的设备都是由对应的总线来管理,通过总线来操作设备。但对于So原创 2017-12-10 21:01:40 · 1612 阅读 · 0 评论 -
Linux进程通信之消息队列
消息队列简介进程通信信号量方式传送信息量有限,管道只能传送无格式字节流,无疑给程序开发带来不便,消息队列克服了这些缺点。消息队列就是一个消息链表,可以把消息看做一个记录,具有特定格式,进程可以向其中按照一定规则添加新消息;另一些进程可以从消息队列读走消息。消息队列只有在内核重新启动,或者人工删除才会消失。消息队列内核持续性需要消息队列在系统范围内拥有唯一个键值,所以,要获得一个消息队列的描述字,必须原创 2018-04-18 11:34:20 · 179 阅读 · 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 · 3307 阅读 · 1 评论 -
Linux进程通信之共享内存
共享内存进程间共享内存通信,原理很简单,系统开辟一块内存空间,将其映射到物理内存,不同进程可以通过访问这个公共的共享空间完成数据交换,达到进程间通信的目的。访问快,使用简单。不需要额外的函数(如read write等) 使用共享内存包含两个步骤: 创建共享内存,使用shmget函数。 映射共享内存,将这段创建的共享内存映射到具体的进程空间,使用shmat函数。 shm原创 2018-04-18 10:09:14 · 233 阅读 · 1 评论