b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

什么是嵌入式Linux内核的驱动程序开发?

电脑杂谈  发布时间:2020-03-20 02:06:09  来源:网络整理

pc装linux嵌入系统_嵌入式 linux驱动_linux mtp 驱动

Linux设备驱动程序占据了Linux内核源代码的很大一部分. 从2.0、2.2到2.4内核,源代码的长度在增加. 实际上,设备驱动程序正在增加. 它是遵循POSIX标准的免费操作系统. 具有BSD和SYSV扩展功能. 与其他操作系统相比,嵌入式Linux系统具有出色的功能,可以应用于多种硬件平台,高效稳定的内核,开源代码,丰富的软件以及完善的网络通信和文件管理功能,因而成为研究热点. 机制. 越来越多的研究人员正在使用Linux平台来开发自己的产品.

基于嵌入式Linux内核的系统设备驱动程序的开发与设计

编写设备驱动程序

设备驱动程序是linux内核的一部分. 它是操作系统内核和计算机硬件之间的接口. 它由一组功能和一些私有数据组成. 它是应用程序和特定硬件之间的桥梁. Linux的基本功能是抽象化硬件设备的管理. 系统中的每个设备都由一个特殊文件表示. 所有硬件设备都被视为普通文件,使用与操作系统相同的标准系统来打开,读取,写入和关闭.

在Linux操作系统下嵌入式 linux驱动,设备文件类型主要有三种类型: 块设备,字符设备和网络设备. 字符设备是在访问时未缓存的设备. 可以像访问文件一样访问字符设备,并且字符设备驱动程序实现这些行为. 系统的控制台和并行端口是字符设备的示例,可以通过“流”很好地描述. 块设备是文件系统(例如磁盘)的主机. Linux允许像字符设备一样读取块设备-允许一次传输任意数量的字节. 结果,字符设备和块设备以相同的方式读取. 网络设备不同于字符设备和块设备. 它不是文件系统,而是网络协议层. 它通过BSD套接字访问数据. 与设备相对应的是设备驱动程序的三种类型,字符设备驱动程序,块设备驱动程序和网络设备驱动程序.

字符设备驱动程序,块设备驱动程序和网络设备驱动程序的结构不同.

在字符设备和块设备驱动程序中必须使用的file_operaTIons结构在linux源代码linux / include / linux / fs.h中定义. 每个设备驱动程序都实现此接口定义的部分或全部功能. 随着内核的不断升级,file_operaTIons结构也变得越来越大,并且内核的不同版本也会略有不同. file_operaTIons定义如下:

struct file_operaTIons {

int(* lseek)(结构索引节点*,结构文件*,off_t,int); int(*版本)(struct inode *,struct file *);

int(*读取)(struct inode *,struct file *,char *,int); int(* fsync)(结构索引节点*,结构文件*);

int(*写)(struct inode *,struct file *,const char *,int); int(* fasync)(struct inode *,struct file *,int);

int(* readdir)(结构索引节点,结构文件,无效*,莳萝目录); int(* check_media_change)(kdev_t dev);

int(*选择)(struct inode *,结构文件*,int,select_table *); int(* revalidate)(kdev_t dev);};

pc装linux嵌入系统_嵌入式 linux驱动_linux mtp 驱动

int(* ioctl)(结构索引节点*,结构文件*,无符号整数,无符号长整数);

int(* mmap)(结构索引*,结构文件*,结构vm_area_struct *);

int(*打开)(struct inode *,struct file *);

应用程序只能通过打开,释放,读取,写入,ioctl等设备文件来访问字符设备和阻止设备. 用户定义了file_operaTIons结构后,编写设备实际需要的操作功能. 不必要的操作函数用NULL初始化. 这些操作功能将在内核中注册. 当应用程序在设备的相应设备上执行文件操作时,内核将找到相应的操作函数并对其进行调用. 如果操作函数使用NULL,则默认情况下会处理该操作函数.

对于字符设备,llseek(),read(),write(),ioctl(),open(),release()是必不可少的;对于块设备,open(),release(),Ioctl()嵌入式 linux驱动,check_media_change()和revalidate()是必不可少的.

网络设备结构net_device在includelinuxnetdevice.h中定义,如下所示:

struct net_device

{

字符名称; int(* init)(结构

net_device * dev);

无符号短标志; int(*打开)

(struct net_device * dev);

unsigned long base_addr;诠释

(* * stop)(struct net_device * dev)

linux mtp 驱动_pc装linux嵌入系统_嵌入式 linux驱动

unsigned int irq;诠释

(* * hard_start_xmit)(struct sk_buff * skb,

unsigned char dev_addr;结构

net_device * dev);

unsigned char addr_len;诠释

(* set_mac_address)(结构net_device

unsigned long trans_start; * dev,void * addr);

...

}

定义net_device结构后,根据实际情况编写操作函数. hard_start_xmit()函数用于发送数据,set_mac_address()用于设置网络参数.

初始化Linux时将调用初始化函数int device_init(). 此功能包括以下内容:

注册您的设备. Linux使用设备号来标识字符设备和块设备. 设备号分为主设备号和从设备号,最后形成设备联系人. 当访问字符设备和块设备的设备驱动程序时,将使用设备节点. 通常,主设备号标识与该设备相对应的驱动程序. 大多数设备是“一个主要设备号对应一个驱动程序”,例如: 虚拟控制台和串行终端由驱动程序4管理. 内核使用次要设备号确定设备文件引用的设备. 字符设备和块设备在注册时必须首先定义设备编号.

字符设备注册功能如下:

int register_chrdev(unsigned int major,const char * name,struct file_oprations * fops);

linux mtp 驱动_嵌入式 linux驱动_pc装linux嵌入系统

其中major是主要设备号.

由于不需要设备节点即可访问网络设备驱动程序,因此其注册功能如下:

int register_netdev(结构net_device * dev)

用于注册设备的中断. 中断在现代计算机体系结构中起着重要作用. 操作系统必须为程序提供响应中断的能力. 通常在系统中注册一个中断处理程序. 发生硬件中断后,操作系统将调用驱动程序的处理程序.

用于注册中断的功能如下:

int request_irq(无符号irq,void(*处理程序)(int,void *,struct pt_regs *),无符号长标志,const char * device,void * dev_id);

其中,irq是中断向量; handler是中断处理功能;标志是中断处理中的掩码; devices是设备名称; dev_id是中断共享中使用的ID.

当Linux不使用该设备时,有必要调用清除函数void_devicie_exit(),该函数与初始化函数相对应,主要是:

注销设备,字符设备注销功能如下:

int unregister_chrdev(未签名的int major,const char *名称,struct file_oprations * fops);

注销中断. 注销中断的功能如下:

int free_irq(无符号irq,void(*处理程序)(int,void *,struct pt_regs *),无符号长标志,const char * device,void * dev_id);

释放资源. 模块初始化和清除功能采用module_init(device_init)和module_exit(device_exit)的形式.

编写服务子例程

linux mtp 驱动_pc装linux嵌入系统_嵌入式 linux驱动

为I / O请求提供服务的子例程,也称为驱动程序的上半部分. 这部分调用是系统调用的结果. 程序的这一部分正在执行. 系统仍将其视为与调用过程相同的过程. 只有用户模式已成为核心模式,而用户程序的操作环境使该系统调用成为可能. 因此,您可以调用诸如与流程运行环境相关的睡眠之类的功能.

中断服务程序,也称为驱动程序的下半部分. 在Linux系统上. Linux系统不是直接从中断向量表中调用设备驱动程序的中断服务子例程,而是接收硬件中断,然后系统调用中断服务子例程. 任何进程运行时都可能产生中断,因此在调用中断服务程序时会产生中断. 您不能依赖任何进程的状态,也不能调用与该进程的运行环境相关的任何函数. 因为设备驱动程序通常支持多个相同类型的设备,所以当系统调用中断服务程序时,它通常会使用一个或多个参数来唯一标识请求服务的设备.

使用设备驱动程序

直接将驱动程序编译到Linux内核中

将设备驱动程序复制到linux / drivers相关子目录. 例如,字符设备驱动程序位于linux / drivers / char下.

在linux / drivers相关子目录中修改Makefile,

例如obj- $(config_dev_driver)+ = dev_driver.o,它将在编译内核时编译dev_driver.c,并生成dev_driver.o.

重新编译内核时,请执行相关配置. 例如,要使用AT91RM9200的UART,您需要进行如下配置:

字符设备-》串行驱动程序-》 AT91RM9200串行端口支持

将驱动程序编译为驱动程序模块

设备驱动程序中有两个重要功能:

module_init(dev_init),module_exit(dev_exit)

使用相应的交叉编译器和compile命令将驱动程序dev_driver.c编译为动态驱动程序模块,例如dev_driver.o. 使用insmod命令在系统上安装驱动程序模块. 如果/ dev目录中没有相应的设备文件,则可以使用mknod创建设备文件. 使用rmmod命令来卸载驱动程序模块. 要删除设备文件,请使用rm命令.

结论

设备驱动程序的开发是Linux环境中最复杂的编程任务之一. 它需要处理硬件,容易导致系统崩溃,并且难以调试. 掌握设备驱动程序开发技术将使嵌入式Linux系统的开发更快,更高效.


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-145478-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 谭嗣同
        谭嗣同

        我昨天才在超市挑选黑芝麻

      每日福利
      热点图片
      拼命载入中...