嵌入式Linux--第一个linux驱动(一)

一、应用程序和驱动的交互原理交互原理

 驱动的就是获取外设、或者传感器数据、控制外设。数据会提交给应用程序,Linux驱动编译既要编写一个驱动,还要编写一个简单的测试应用程序–APP。单片机下的驱动和应用都是放到一个文件里面去的,也就是杂糅到一起的。Linux下驱动和应用是完全分开的。

用户空间(用户态)和内核空间(内核态)

  • Linux操作系统内核和驱动程序运行在内核空间、应用程序运行在用户空间。
  • 应用程序通过三种办法访问内核资源:系统调用、软件中断、硬件中断。

 应用程序不会直接调用系统调用,而是通过API函数来间接的调用系统调用,比如POSIX、API和C库等。UNIX类操作系统中最常用的编程接口就是POSIX。每一个系统调用都有一个对应的系统调用号。

系统调用处于内核空间,应用程序无法直接访问,因此需要“陷入”到内核,方法就是软件中断,陷入内核以后还要指定系统调用号。

嵌入式Linux--第一个linux驱动(一)
 应用程序可以直接使用系统调用函数,比如:open、close等,也可以使用C库提供的函数。上图的左侧竖线表示直接使用系统调用,右侧竖线表示使用C库里面的函数,而C库里面的函数最终也是调用的系统调用函数。

二、字符设备驱动开发

  • 1.Linux里面一切皆文件,驱动设备表现就是一个/dev/目录下的一个文件,比如/dev/led文件,应用程序调用open函数打开设备,比如led。应用程序通过write函数向/dev/led写数据,比如写1表示打开,写0代表关闭。如果关闭设备就是调用close函数。
  • 编写驱动的时候也需要编写驱动对应的open、close、read、write函数。字符设备驱动file_operation结构体。

1、驱动最终是被应用调用的,在写驱动的时候要考虑应用开发的便利性
2、驱动是分驱动框架的,要按照驱动框架来编写,对于字符设备驱动来说,重点编写应用程序对应的open、close、read、write等函数。