




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、嵌入式Linux编程简介(jin ji)电信(dinxn)学院崔寅鸣 Email: 共六十八页主要(zhyo)内容简单应用程序与Makefile编写(binxi)驱动程序架构QtE编程 共六十八页(一)嵌入式Linux应用(yngyng)开发共六十八页Helloworld例程#include int main(void)int i;for(i=0;i10;i+)printf(hello world! i=%d n,i);return 0;共六十八页HelloWorld例程生成helloworld.c执行(zhxng)gcc o hello helloworld.c执行arm-linux-gcc
2、 o hello-arm helloworld.c用file命令分别查看#file hello#file hello-arm共六十八页Makefile简介(jin ji)Linux开发一般有大量源代码,为了(wi le)避免大量重复的键入gcc进行编译,定义了Makefile文件,用于自动编译# make 该操作会调用MakefileMakefile一般定义了:Gcc编译工具编译命令目标文件依赖关系共六十八页Makefile简介(jin ji)例:test.o: test.c test.h gcc g o test.o test.c -g 生成调试信息-c 只编译不链接成为可执行文件-o 确定
3、输出文件名称-O 优化-w 禁止警告信息-Wall 打开所有(suyu)类型警告信息共六十八页Makefile变量(binling)makefile 变量预定义变量 $*不包含扩展名的目标文件名$+ 所有的依赖文件,以空格分开,并以出现的先后(xinhu)为序,可能包含重复的依赖文件。 $ 第一个依赖文件的名称$?所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。 $目标的完整名称。 $所有的依赖文件,以空格分开,不包含重复的依赖文件。共六十八页简单(jindn)Make指令说明# Make clean 清除编译(biny)过程的中间文件# make dep 设置Makef
4、ile文件中各个目标所依赖的文件列表共六十八页简单(jindn)例makefileCC=arm-linux-gccall:hello-armhello-arm:hello.c$(CC) -Wall -g -o hello-arm hello.cclean:rm -f hello-arm共六十八页(二)嵌入式Linux驱动程序框架(kun ji)共六十八页2.1 基本概念简介(jin ji)共六十八页Linux系统中管理设备(shbi)的方法Linux将外部设备看成是一类特殊文件,称之为“设备文件”。设备驱动程序向应用程序屏蔽了硬件(yn jin)实现上的细节,使得应用程序可以像操作文件一样,通
5、过系统调用open(),read(),write(),ioctl(),close()等来操作设备。共六十八页内核中设备驱动(q dn)的层次共六十八页设备驱动(q dn)的作用设备驱动是位于应用和物理设备之间的软件(run jin)层,负责完成二者间的I/O操作;在LINUX系统里,对用户程序,设备驱动隐藏了设备的具体细节,为不同设备提供了一致的接口;设备驱动是嵌入式系统开发的重要内容之一共六十八页设备驱动完成(wn chng)的工作对设备初始化和释放把数据从内核传送到硬件和从硬件读取数据读取应用程序传送给设备文件的数据和回送应用程序请求(qngqi)的数据检测和处理设备出现的错误共六十八页设
6、备(shbi)文件的类型通常有字符设备、块设备和网络设备三种字符设备能够像字节流一样被访问的设备,例如字符终端、串口、键盘(jinpn)、声卡、LCD、触摸屏、扫描仪、打印机、并口、鼠标、游戏杆等。块设备支持块访问的设备,每块包含2的N次幂字节数据,例如IDE设备(磁盘)、SCSI硬盘、floppy disk 、CD-ROM、Ramdisk等。网络设备即能够和其他主机交换数据的设备接口。是通过实现套接字接口来完成。另外还有杂项设备,是比较简单的字符设备,都统一归纳为主设备号10的杂项驱设备。如watchdog、IIC、USB等共六十八页主设备(shbi)号与次设备(shbi)号LINUX系统中
7、,设备由一个主设备号和一个次设备号来标识;主设备号唯一标识了设备类型,即设备驱动程序类型,它是块设备表或字符设备表中设备表项的索引。次设备号仅由设备驱动程序解释,一般用于识别在若干主设备号相同的硬件设备中,I/O请求(qngqi)所涉及的是哪个设备。共六十八页主设备(shbi)号主设备号一些典型设备的主设备号已经基本固定下来,例如,软驱的主设备号为2,IDE硬盘的主设备号为3等等。/proc/devices可以(ky)读到杂项设备的主设备号统一为10。杂项设备可在/proc/misc文件中看到共六十八页次设备(shbi)号次设备号用于标识使用同一设备驱动程序的不同硬件,并仅由设备驱动程序解释
8、当应用程序操作某个设备文件(wnjin)时,Linux内核根据其主设备号调用相应的驱动程序,并从用户态进入内核态驱动程序判断次设备号,并完成相应的硬件操作。杂项设备以次设备号来区分不同设备。 共六十八页查看主次(zhc)设备号例:如下的两个字符(z f)设备节点:crw-r-r-1 root root254,0Jan9 /dev/nx_idscrw-r-r-1 root root254,99Jan9 /dev/nx_ips它们的主设备号都是254,次设备号分别是0和99。杂项设备:crw-rw-1 root root10,54Mar13 /dev/usb_accessorycrw-rw-1 r
9、oot root10,181Mar13 /dev/touch_screen-1wire共六十八页主次设备(shbi)号的获得在内核中,用dev_t类型(其实就是一个32位的无符号整数)的变量来保存设备的主次设备号,其中高12位表示主设备号,低20位表示次设备号。 设备获得主次设备号有两种方式:一种是手动给定一个32位数,并将它与设备联系起来(即用某个(mu )函数注册);另一种是调用系统函数给设备动态分配一个主次设备号。共六十八页内核(ni h)设备驱动模块设备驱动程序以两种方式添加到Linux内核:Build in直接把驱动程序编译到内核代码中。占内核空间,修改驱动需要重新编译内核。Modu
10、le以模块的方式安装和卸载驱动程序,可以动态(dngti)加载。编译内核时,要确认“Enable loadable module support”选项。共六十八页内核模块Linux内核将4G字节的虚拟地址空间分为两部分。将最高的 1G字节(从虚拟地址0 xC0000000到0 xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址 0 x00000000到0 xBFFFFFFF),供各个(gg)进程使用,称为“用户空间”。内核模块,是运行于内核空间的。驱动程序常作为内核模块加载。共六十八页设备(shbi)驱动模块的安装与卸载安装驱动模块insmod driver_n
11、ame.ko卸载驱动模块rmmod driver_name浏览系统中的模块lsmod另外,modprobe也可以安装模块,但要进行依赖(yli)关系检查。共六十八页Linux设备(shbi)节点的添加设备(shbi)节点在/dev路径下,提供应用程序访问的接口可用如下命令添加dev节点,b 代表块设备,C表示字符设备mknod /dev/hda1 b 127 1块设备,主设备号127,次设备号1mknod /dev/demo_drv c 125 0 字符设备,主设备号125,次设备号0共六十八页设备驱动代码(di m)的分布在eLinux内核源码的driver目录下:/char:字符设备驱动源
12、码;/block:块设备驱动源码;/cdrom:Linux CDROM驱动源码。这里可以找到某些特殊的CDROM设备(如SoundblasterCDROM)。IDE接口(ji ku)的CD驱动位于drivers/ide/ide-cd.c中而SCSICD驱动位于drivers/scsi/scsi.c中/pci:它包含了PCI伪设备驱动源码。这里可以找到关于PCI子系统映射与初始化的代码共六十八页设备(shbi)驱动代码的分布/scsi:所有的SCSI代码(di m)以及Linux支持的SCSI设备的设备驱动。/net:包含网络驱动源码。/sound:声卡驱动源码。/video:视频驱动源码。等等
13、共六十八页2.2 内核模块框架(kun ji)共六十八页HelloModule例程共六十八页内核模块入口(r ku)和出口内核模块一般都至少包含两个函数(hnsh):初始化函数(hnsh)和卸载函数(hnsh),其它函数(hnsh)跟设备相关宏module_init和module_exit用于注册初始化函数和卸载函数(Linux2.6内核必须)它们分别在insmod模块安装和rmmod模块卸载时调用共六十八页模块(m kui)其他信息常用信息有作者、描述(mio sh)、版权等。MODULE_AUTHOR(“author”);MODULE_DESCRIPTION(“the descriptio
14、n”);MODULE_LICENSE(“Dual BSD/GPL”);常用的版权信息有GPL、Dual BSD/GPL(2.6内核)等。共六十八页常用(chn yn)头文件#include 必备,定义模块#include 必备,定义模块初始化#include 定义注册函数#include 定义模块参数#include 定义硬件控制函数#include 定义总线设备#include 内存管理,kmalloc等#include 定义杂项(z xin)设备misc#include 定义read、write错误码#include 定义kenerl错误返回#include 定义内核链表#include
15、定义内核头文件互斥方式共六十八页内核模块MakefileMakefile共六十八页Makefile相关(xinggun)说明obj-m内核模块对象,固定名称:=的含义是添加,相当于 +=$(shell pwd) 执行shell命令pwd所返回的Linux 2.6内核中,make内核模块需要(xyo)使用“make C 内核目录 M=工作目录 modules”格式。-C意为进入目录共六十八页执行模块(m kui)安装与卸载#insmod ./helloModule.ko (Linux2.4中使用(shyng).o)#lsmod#rmmod helloModule 共六十八页2.3 字符(z f)
16、设备驱动共六十八页设备(shbi)驱动大致构成Linux的设备驱动程序大致可以分为如下几个部分:驱动程序的注册与注销(zhxio)、设备的打开与释放、设备的读写操作、设备的控制操作、设备的中断和轮询处理在之前的内核模块框架的基础上,增加实际设备的注册、注销和操作共六十八页字符设备驱动(q dn)构成字符(z f)设备驱动构成:驱动程序的注册与注销 register_chrdev_region( )unregister_chrdev_region( )设备的打开与释放 file_operations结构中的函数open( )file_operations结构中的函数release( )共六十八页
17、设备驱动(q dn)构成设备的读写操作 Read()Write()设备的i/o控制操作ioctl( )设备的中断和轮询处理对于不支持中断的硬件设备,读写时需要轮流查询设备状态,以便决定是否继续进行数据传输。如果设备支持中断,则可以(ky)按中断方式进行操作共六十八页字符设备驱动程序框架:入口和出口(ch ku)函数int module_init(void)硬件初始化;注册设备(shbi);注册中断;void module_exit(void)释放中断资源;释放该设备;释放其他的系统资源;共六十八页通过file_operations定义(dngy)操作struct file_operations
18、 driver_fops = .open= driver_open,.release= driver_release,.read= driver_read,.write=driver_write,.poll= driver_poll,.unlocked_ioctl= driver_ioctl,.fasync= driver_fasync, ;共六十八页file_operations结构(jigu)open: 用于打开文件设备release: 在关闭文件的调用read: 用于从设备中读取数据write: 向设备发送数据poll: 查询(chxn)设备是否可读或可写unlocked_ioctl:
19、提供执行设备特定命令的方法fasync: 用于设备的异步通知操作共六十八页file_operations定义(dngy)共六十八页Linux2.4字符(z f)设备的注册注销2.4内核中,注册与注销(zhxio)采用:register_chrdev(MAJOR,dev_name,&fops);unregister_chrdev(MAJOR,dev_name);将主设备号、设备名称和操作定义fops直接相关。本系统是Linux2.6内核,经测试也可以使用。但有些Linxu2.6版本不再支持这种方式。本课件以下均以2.6内核为主体进行讲解。共六十八页Linux2.6字符(z f)设备的注册字符设备
20、静态注册(指定设备号和名字)result=register_chrdev_region(dev_t from, unsigned count, const char * dev_name);dev_t 是含主次设备号的结构;count 申请注册个数,通常1;dev_name 设备名称,与设备节点相同字符设备动态(dngti)注册(自动分配设备号)Result=alloc_chrdev_region(dev_t *, unsigned baseminor, unsigned count, const char* dev_name);baesminor要申请的第一个次设备号,通常0共六十八页字符设
21、备(shbi)的注销注销(zhxio)void unregister_chrdev_region(dev_t from, unsigned count); dev_t from 是释放的设备号count 要释放设备的个数,通常1共六十八页cdev结构(jigu)cdev结构(jigu)用来描述字符设备。主要用于设备号与file_operations的关联。共六十八页将cdev添加(tin ji)到内核使用(shyng)cdev_add(struct cdev *p,dev_t dev,unsigned count);p是要添加的cdev指针;dev 是cdev所描述设备的设备号;count是设
22、备相关联的设备号的个数;共六十八页设备(shbi)的轮询与中断轮询方式对于不支持中断的硬件设备,读写时需要轮流查询设备的状态,以便决定随后的数据(shj)操作。如果轮询处理方式的驱动程序被链接到内核,则意味着查询过程中,内核一直处于闲置状态。解决办法是使用内核定时器,进行定期查询共六十八页设备的中断(zhngdun)处理中断处理方式硬件在需要的时候,向内核发出中断请求信号(xnho),而内核则负责把中断信号(xnho)传递给相应的设备驱动。驱动程序必须在设备驱动的初始化时申请中断资源,并注册中断处理函数:申请:request_irq(irq , irq_handler, flag, dev_n
23、ame, dev_id);释放:free_irq(irq, dev_id);其中irq为申请的中断线号,irq_handler为注册的中断处理函数,dev_id 用于共享中断信号线共六十八页中断(zhngdun)的申请与释放申请(shnqng):request_irq(irq , irq_handler, flag, dev_name, dev_id);irq申请的中断号;irq_handler为注册的中断处理函数;Flag 中断还是快速中断;dev_id 用于共享中断信号线。释放:free_irq(irq, dev_id); 共六十八页用户(yngh)空间与内核空间的数据拷贝用户空间和内核空
24、间访问(fngwn)有一定的保护机制。一般用下面的两个函数进行数据的拷贝。copy_to_user(void *to, const void *from,unsigned long count);copy_from_user(void *to, const void *from,unsigned long count);共六十八页内核(ni h)打印printkPrintk在内核中定义,其功能和标准c库中的printf类似,但缺乏(quf)对浮点数的支持内核需要单独的打印输出函数是因为它在运行时不能依赖于c库模块能够调用printk是因为在insmod装入后,模块就链接到内核共六十八页prin
25、tK打印(d yn)级别printK分为八个打印级别(jbi),在kernel.h定义#define KERN_EMERG #define KERN_ALERT #defineKERN_CRIT#defineKERN_ERR#defineKERN_WARNING#defineKERN_NOTICE#defineKERN_INFO#defineKERN_DEBUG共六十八页设备节点(ji din)的创建设备节点在/dev目录下通常需要手工创建,根据(gnj)主设备号和设备名称,可以如下创建:#mknod /dev/dev_name c major minor如果是动态分配的主设备号,可以到/proc/devices中查看共六十八页测试程序测试程序是应用程序,运行在用户空间要完成open打开设备,read、write等驱动定义的操作,以及close设备也需要Makefile,按应用程序的定义来写,包括arm-linu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公园规划设计合同标准文本
- 五华区工程环保合同样本
- 全职助理合同样本
- 介绍中介咨询合同样本
- 入股合同样本格式
- 信托资金借贷合同样本
- 2025新能源汽车租赁服务合同
- 国家电网考试电力市场试题及答案
- 供车贷款合同标准文本
- 2025集团桥梁混凝土施工承包合同
- 水利工程(水电站)全套安全生产操作规程
- 学生宿舍宿管人员查寝记录表
- 配电间巡检记录表
- ISO 31000-2018 风险管理标准-中文版
- 双人法成生命支持评分表
- DBJ61_T 179-2021 房屋建筑与市政基础设施工程专业人员配备标准
- 毕业设计三交河煤矿2煤层开采初步设计
- 预应力锚索施工全套表格模板
- 食品流通许可证食品经营操作流程图
- 风电场工作安全培训
- 压缩机课程设计(共28页)
评论
0/150
提交评论