![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
嵌入式Linux设备驱动学习
文章平均质量分 54
宗师之路
新手请多多关照
展开
-
fork函数与vfork函数的区别与联系详解
创建一个新进程的方法只有由某个已存在的进程调用fork()或vfork(),当然某些进程如init等是作为系统启动的一部分而被内核创建的。1.fork函数介绍#include #include pid_t fork (void );正确返回:父进程中返回子进程的进程号;子进程中返回0;(单调用双返回函数)错误返回:-1;子进程是父进程的一个拷贝。具体说,子进程从父进程那转载 2015-09-29 21:18:26 · 784 阅读 · 0 评论 -
QT,QTOPIA,QT4,QTE等的区别,还有QTE在QT CREATOR上的设置
准备用S3C6410做个项目,在系统上使用LINUX系统是肯定的,只是在使用ANDROID与QT之间,费了一点时间,在其中并看了JAVA的一些资料,并对这两个系统做了一个比较。 ANDROID系统使用的是JAVA语言,这是一种描述语言,是在各个平台中嵌入一个解释器来完成的,所以能够实现跨平台的操作,这个来说是方便的,但是ANDROID系统相对来说要用比较大的内存,而现在一般的64转载 2016-02-14 21:12:05 · 1119 阅读 · 0 评论 -
error while loading shared libraries: libQtGui.so.4: cannot open shared object file:
qt4编写的界面在mini6410上运行失败,总是提示错误:error while loading shared libraries: libQtGui.so.4: cannot open shared object file: 这其实就是提示你没有libQtGui.so.4这个库,那这个库到底是不是真的没有那?其实你在编译Qt4.7的时候已经有这个库了,只需要把路径改一下就行。打原创 2016-02-15 20:32:55 · 12615 阅读 · 2 评论 -
Linux下ps命令详解
有时候系统管理员可能只关心现在系统中运行着哪些程序,而不想知道有哪些进程在运行。由于一个应用程序可能需要启动多个进程。所以在同等情况下,进程的数 量要比程序多的多。为此从阅读方面考虑,管理员需要知道系统中运行的具体程序。要实现这个需求的话,就需要利用命令ps来帮忙。 要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令转载 2016-03-31 18:17:49 · 442 阅读 · 0 评论 -
基于QT界面和tiny6410的串口助手程序
友善之臂tiny6410手册中的串口助手开发部分有一些错误,在这里我把更改后的程序贴出来。 亲测可用,而且稳定性好比较好。这是dialog.h的源代码#ifndef DIALOG_H#define DIALOG_H#include <QDialog>#include <qsocketnotifier.h>namespace Ui { class Dialog;}class Dial原创 2016-03-10 18:37:47 · 1246 阅读 · 0 评论 -
Segmentation fault 问题浅谈
今天调试程序时遇到了一个问题,当我用GDB调试程序时出现了Segmentation fault,以前没有遇到过,最后查看资料,有点明白了。 出现了Segmentation fault,基本上的原因是,非法的内存访问。 例如数组的越界,在循环操作时循环变量的控制问题,也有字符串拷贝时长度溢出,指针指向了非法的空间,还有就是申明一个指针,但却没有对其初始化,就直接引用,或者没有开辟内存空间就释转载 2016-03-23 19:10:22 · 841 阅读 · 0 评论 -
getpid()函数
getpid getpid(取得进程识别码) 相关函数: fork,kill,getpid 表头文件: #include#include<unistd.h> main() { printf(“pid=%d\n”,getpid()); } 执行: pid=1494转载 2016-04-24 09:36:08 · 17909 阅读 · 0 评论 -
内存管理单元(MMU)介绍
内存管理单元(MMU)介绍MMU是存储器管理单元的缩写,是用来管理虚拟内存系统的器件。MMU通常是CPU的一部分,本身有少量存储空间存放从虚拟地址到物理地址的匹配表。此表称作TLB(转换旁置缓冲区)。所有数据请求都送往MMU,由MMU决定数据是在RAM内还是在大容量存储器设备内。如果数据不在存储空间内,MMU将产生页面错误中断。MMU的两个主要功能是:1. 将虚地址转换成物理地转载 2015-10-23 15:15:11 · 1764 阅读 · 0 评论 -
嵌入式Linux的几个小问题
帖子中的问题都是一些很基本的问题,是我在学习嵌入式Linux中遇到的一些问题,自己在网上搜到答案并且贴出来。 1 linux驱动和应用程序关系? 驱动程序运行在内核空间,而应用程序运行于用户空间。一般情况下应用程序是不能直接访问硬件的,但最终程序的执行结果必然是要到硬件的,这时就需要驱动程序。打个比方,你要将一段字符写进硬盘,你在应用程序中是以文件的抽象方式进行的,但是在这个层原创 2015-11-14 18:12:33 · 591 阅读 · 0 评论 -
混杂设备驱动
1 定义在Linux系统中,存在一类字符设备,它们拥有相同的主设备号(10),但次设备号不同,我们称这类设备为混杂设备(miscdevice)。所有的混杂设备形成一个链表,对设备访问时内核根据次设备号查找到相应的混杂设备2 开发流程3 相关结构体和函数Linux内核使用struct miscdeivce来描述一个混杂设备struct miscdevice { i原创 2018-01-24 10:42:21 · 309 阅读 · 0 评论 -
Linux中断下半部——工作队列
1 参考书籍 《Linux设备驱动开发详解》 宋宝华 机械工业出版社 《嵌入式Linux驱动开发教程》 华清远见嵌入式学院 电子工业出版社 2 工作队列 下面的代码用于定义一个工作队列和一个底半部执行函数struct work_struct my_wq; /*定义一个工作队列*/void my_wq_func(struct work_struct *work); /*定义一个原创 2018-01-25 17:00:49 · 521 阅读 · 0 评论 -
高级I/O操作-ioctl设备操作
1 ioctl设备操作 参考书籍 《嵌入式Linux驱动开发教程》 华清远见嵌入式学院2 虚拟串口中添加unlocked_ioctl后的代码vser.h/*vser.h*/#ifndef _VSER_H#define _VSER_Hstruct option{ unsigned int datab; unsigned int parity; unsigned int s原创 2018-01-28 16:01:49 · 554 阅读 · 0 评论 -
高级I/O操作-非阻塞型I/O
1 参考书籍 参考书籍 《嵌入式Linux驱动开发教程》 华清远见嵌入式学院 2 简介 如果应用程序以非阻塞的方式打开设备文件,当资源不可用时,驱动就应该立刻返回并用一个错误码EAGAIN来通知应用程序此时资源不可用。 3 范例代码/*非阻塞型I/O*//*vser.c*/#include <linux/init.h>#include <linux/kernel.h>#inc原创 2018-01-28 16:55:46 · 331 阅读 · 0 评论 -
高级I/O操作-阻塞型I/O
1 参考书籍参考书籍 《嵌入式Linux驱动开发教程》 华清远见嵌入式学院 2 休眠程序的唤醒通常有两种 (1) 在中断处理程序负责唤醒 (2) 指定进程的最长休眠时间,超时后进程自动苏醒3 范例代码/*阻塞型I/O*//*vser.c*/#include <linux/init.h>#include <linux/kernel.h>#include <linux/module.h>#i原创 2018-01-28 22:51:55 · 376 阅读 · 0 评论 -
Linux驱动混杂设备模型详解与程序实例
一,混杂设备的定义 在Linux中,存在这么一类字符设备,他们拥有相同的主设备号为10,但次设备号不同,这类设备就称为混杂设备(miscdevice).所有的混杂设备形成一个链表,对设备访问时内核根据次设备号查找到相应的混杂设备。原创 2016-01-22 09:47:55 · 628 阅读 · 0 评论 -
s3c6410的GPIO驱动总结
1、查看gpio状态:头文件中int gpio_request(unsigned gpio, const char *label); ,该函数的功能是通过查看该gpio保存的记录标志是否为NULL来判断GPIO是否被占用,并把此gpio取名为*lable。 例如:if(gpio_request(S3C64XX_GPB(0), "GPB"转载 2015-11-24 18:37:24 · 721 阅读 · 0 评论 -
error:unknown field ioctl specified in initializer
在linux-2.6.36内核上加载编译驱动时,出现 error:unknown field 'ioctl' specified in initializer原因是:在2.6.36内核上file_operations发生了重大的改变:原先的 int (*ioctl)(struct inode*, struct file*, unsigned int转载 2015-11-24 17:40:41 · 359 阅读 · 0 评论 -
uboot初始化中,为何要设置CPU为SVC模式而不是设置为其他模式
在看Uboot的start.S文件时候,发现其最开始初始化系统,做的第一件事情,就是将CPU设置为SVC模式,但是S3C2440的CPU的core是ARM920T,其有7种模式,为何非要设置为SVC模式,而不是设置为其他模式呢?对此,经过一些求证,得出如下原因:首先,先要了解ARM的CPU的7种模式是哪些:另外,7种模式中,除用户usr模式外,其转载 2015-10-17 16:05:38 · 790 阅读 · 0 评论 -
GCC编译报错:程序中有游离的‘\311’
今天在使用GCC编写程序的时候,错误代码提示:程序中有游离的‘\311’我做了一个截图放在下面:仔细检查一遍代码并没有错误,于是在百度上进行了一番搜索,得到的结果如下:1.源代码(*.c / *.h)中使用了中文的标点符号(全角标点),如:逗号、分号、空格、加号、花括号。这就和我们刚开始学习C语言时犯的错误差不多。 后来经过查证,我在GCC错误提示的第15原创 2015-10-01 10:09:27 · 945 阅读 · 0 评论 -
va_start和va_end的用法详解
本文为转载,转载地址为:http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html 主要介绍va_start和va_end的使用及原理。 介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理: 1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表void转载 2015-11-03 20:40:33 · 556 阅读 · 0 评论 -
驱动预安装成功
今天在进行tiny6410开发板和笔记本进行串口通信时,USB转串口驱动始终无法安装(我安装的是CH340驱动),总是提示但是在右键计算机查看设备管理器的时候始终无法查看到COM口,考虑到是否是驱动安装没有成功,计划进行卸载再次安装,此时出现下列提示无设备驱动可卸载汇总一下网上的解决方法:1 可能是你C盘C:\Windows\System32\drivers 中缺少serenum.原创 2015-10-09 09:06:22 · 28666 阅读 · 7 评论 -
BSS段为什么需要初始化
我们都知道bss段需要初始化,但是这是为什么呢? 通过浏览资料,我们都会发现,bss段是不会出现在程序下载文件(*.bin *.hex)中的,因为全都是0。如果把它们出现在程序下载文件中,会增加程序下载文件的大小。实际应用中,通常只需要把bss段的起始地址和结束地址保存起来,而不需要将程序下载文件中出现bss段(一堆0)将来真正运行程序的时候,再根据这两个数据进行bss段的初始化就转载 2015-10-23 15:18:43 · 712 阅读 · 0 评论 -
嵌入式Linux应用程序常用到的几个函数
sizeof一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。 它并不是函数。 sizeof操作符以字节形式给出了其操作数的存储大小。 操作数可以是一个表达式或括在括号内的类型名。 操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法 1、用于数据类型原创 2015-11-16 10:40:12 · 627 阅读 · 0 评论 -
Linux内核register_chrdev_region()系列函数
内核提供了三个函数来注册一组字符设备编号,这三个函数分别是 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()。其中,register_chrdev_region()是为提前知道设备的主次设备号的设备分配设备编号。alloc_chrdev_region() 是动态分配主次设备号。register_chrd转载 2015-11-22 18:44:37 · 493 阅读 · 0 评论 -
int类型和char类型的区别
比较下面三个定义式的区别:int i = 1;char i = 1;char i = '1';int用来定义整型变量,char用来定义字符型变量,要清楚的知道三个定义式的区别,可以比较它们在内存中的存储形式。数据在内存中是以二进制形式存放的,而且是以补码表示的。一个正整数的补码和该数的原码(即该数的二进制形式)相同;如果数值是负的,求补码的方法是:将该数的绝对值的二进制形式,按转载 2015-11-16 21:11:17 · 25230 阅读 · 0 评论 -
Linux之dev详解
一.前言以前对于cdev仅仅是知其然,而不知其所以然。在本文中,将深入理解cdev的架构以及具体的实现。二.真实的cdev2.1 设备号搞驱动的都应该知道的东西,在写gpio驱动时,往往会用到以下两个函数。alloc_chrdev_region --自动分配设备号register_chrdev_region --分配以设定的设备号。上面两个函数的调用很转载 2015-11-21 18:54:55 · 1595 阅读 · 0 评论 -
一步一步写misdevice
对于linux的驱动程序来说,主要分为三种: miscdevice、platform_device、platform_driver 。这三个结构体关系: (基类) kobject -------------------- / \ \ / \ \ device cdev转载 2015-11-21 18:45:44 · 857 阅读 · 0 评论 -
IS_ERR()函数详解
内核中的函数常常返回指针,问题是如果出错,也希望能够通过返回的指针体现出来。 总体来说,如果内核返回一个指针,那么有三种情况:合法指针,NULL指针和非法指针。1)合法指针:内核返回的指针一般是指向页面的边界(4K边界),即 ptr & 0xfff == 02)非法指针:这样ptr的值不可能落在(0xfffff000,0xffffffff)之转载 2015-11-23 20:52:33 · 8359 阅读 · 0 评论 -
嵌入式Linux函数之printfk()函数
1概述: printk相当于printf的孪生姐妹,她们一个运行在用户态,另一个则在内核态被人们所熟知。但是根据不同的操作系统也会有不一样的效果,例如编写一个hello word 内核模块,使用这个函数不一定会将内容显示到终端上,但是一定在内核缓冲区里,可以使用dmesg.查看效果。 对于做嵌入式或者熟悉linux内核的人来说,对printk这个函数一定不会感到陌生。printk是转载 2015-11-19 21:34:09 · 2044 阅读 · 0 评论 -
Linux设备模型-总线,设备和驱动
1 参考书籍参考书籍 《嵌入式Linux驱动开发教程》 华清远见嵌入式学院2 范例代码/*vbus.c*/#include <linux/init.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/device.h>/*用于匹配驱动和设备的函数*/static int vbus_match(struct de原创 2018-01-29 10:48:32 · 276 阅读 · 0 评论