2013届计算机科学与技术专业毕业设计(论文)
在/arch/arm/boot目录下生成Linux内核映像文件zImage。 3.2.3 根文件系统
文件系统是对一个存储设备上的数据和元数据进行组织的机制。这种机制有利于用户和操作系统的交互。在Linux中没有文件系统的话,用户和操作系统的交互也就断开了,所有应用用户程序,都没有办法运行。
根文件系统,是Linux/Unix系统启动的一个重要的组成部分,也是操作系统正常工作的必要组成部分。Linux要在一个分区上存放系统启动所必需的文件,如Init进程、系统配置文件、文件系统及网络系统等等的工具集、链接库等等。这些存放在同一个分区中的基本且必需的文件合起来称为根文件系统。根文件系统的基本目录结构一般包括:/bin,/sbin,/etc,/proc,/dev,/bin,/usr,/lib,/tmp等,如有需要可再添加。下面做简单介绍:
? /bin 存放root与普通账号的命令,由于这些命令在挂接其他文件系统之前就可以使用,所以/bin目录和根文件系统在同一个分区中。
? /sbin 存放系统命令,只有系统管理员(root)能够使用的命令,系统命令还可以存放在/usr/sbin,/usr/local/sbin目录下,/sbin目录中存放的是基本的系统命令,它们用于启动系统和修复系统等
? /etc 存放着系统主要的配置文件,例如人员的账号密码文件、各种服务的其实文件等。
? /lib存放共享库和可加载(驱动程序),共享库用于启动系统。运行根文件系统中的可执行程序。
? /home 系统默认的用户文件夹,它是可选的,对于每个普通用户,在/home目录下都有一个以用户名命名的子目录,里面存放用户相关的配置文件。 ? /root 存放系统管理员(root)的主文件夹的,即是根用户的目录。
? /usr 存放的是共享、只读的程序和数据,这表明/usr目录下的内容可以在多个主机间共享,这些主要也符合FHS标准的。
? /var 存放可变的数据,比如spool目录(mail,news),log文件,临时文件。 ? /mnt 存放临时挂载某个文件系统的挂接点,通常是空目录,也可以在里面创建一引起空的子目录,比如/mnt/cdram /mnt/hda1 。用来临时挂载光盘、移动存储设备等。
? /tmp存放临时文件,通常是空目录,一些需要生成临时文件的程序用到的/tmp目录
23
梁力源:基于物联网技术的智能家居系统
下,所以/tmp目录必须存在并可以访问。
3.3 本章小结
本章主要介绍了嵌入式系统开发平台搭建过程。分别对虚拟机安装,交叉编译环境、在Linux服务器上安装交叉编译工具链、嵌入式Linux内核的配置和编译,YAFFS32文件系统的实现,以及嵌入式软件开发层次等。
24
2013届计算机科学与技术专业毕业设计(论文)
第4章 系统的实现
本智能家居系统分几个模块组成:GSM远程控制模块,温度、烟雾数据采集模块,具有语音提示功能的密码锁防盗功能模块,预防小孩坠楼模块。每个硬件模块在嵌入式开发中称为设备,每个设备想要运行都要在Linux内核中编写设备驱动程序。所谓设备驱动程序就是控制与管理硬件设备数据收发的软件,它是应用程序与硬件设备沟通的桥梁。从本质上讲设备驱动程序主要负责硬件设备的数据读写、参数配置与中断处理。设备驱动程序是操作系统的一部分,通常运行在内核层。应用层通过系统调用进入内核层,内核层根据系统调用号来调用驱动程序对应的接口函数。Linux驱动程序运行的原理如图4.1所示。
应用程序系统调用用户态驱动程序内核态硬件接口/总线
图4.1驱动程序运行原理
Linux中的大部分驱动程序,是以内核模块的形式编写的,内核模块是Linux内核向外部提供的一个接口。Linux内核本身就是一个单内核,具有效率高的优点,也具有可扩展性和可维护性差的缺陷,模块机制就是为了弥补这一缺陷而设计的。内核模块可以单独编译,在运行时被链接到内核,作为内核的一部分在内核空间中运行。采用可加载模块方式可以让驱动程序的运行更加灵活,也更便于调试。本设计就是用动态可加载方式逐个模块调试好,调试好后在直接编译进内核中,然后开机就运行应用程序。
一般来说, Linux系统将设备分为3种类型:字符设备、块设备、网络接口设备。
25
梁力源:基于物联网技术的智能家居系统
本系统设计中用到的设备都是指字符设备驱动,这里主要讲解字符设备及其相关内容。字符设备是指那些每次只能一个字节读写数据的设备,不能随机读取设备内存中的某一数据,其驱动程序中完成的主要工作是初始化、添加和删除cdev结构体,申请和释放设备号,以及填充file_operations结构体中操作函数,并实现file_operations结构体中的read()、write()、ioct1()等重要函数。
cdev结构体、file_operations和用户空间调用驱动的关系如图4.2所示。
insmod模块加载函数cdevrmmod用户空间dev_tFile_operations模块卸载函数系统调用open()read()Ioctl()?图4.2 字符设备与用户空间关系
想要设备正常工作,就必须要按图4.2所示先加载设备驱动模块,然后才能正确调用open()、read()、write()、ioctl()函数操作系统硬件设备。
另外,上层应用程序是在qtopia中编译的,而智能家居系统每个模块必须互不干扰,其中一个模块发生故障应不影响其他模块的运行,要实现每个模块能单独工作,这里用到了多线程的技术,为每个模块创建Timer定时器,把每个模块的程序放在定时器函数中运行,下面分别详细介绍本设计的几个模块的调试过程。
26
2013届计算机科学与技术专业毕业设计(论文)
4.1 GSM远程控制模块的实现
4.1.1 mini2440串口的配置和实现
在实际程序设计过程中主要包括两个组成部分,其一是串口的硬件驱动程序,其二是文件系统上的应用程序。S3C2440本身自带了3个串口UART0、1、2,其中UART0做了RS232电平转换,UART1、UART2输出的点平是TTL电平,但是从NFS启动系统需要用到UART0,我们开发时用到UART2,中间经过232电路与GSM模块连接。开发板的内核源代码自带了串口驱动程序,在开发时我们不需要自己编写驱动。
在Linux中,所有东西都可以看成文件,在应用层想使用串口时首先需要打开串口:
int fd;
fd=open(“/dev/ttySAC1‖,O_RDWR); if(-1==fd) {
/*不能打开串口二*/ perror(―提示错误!‖); }
打开串口后还不能时串口正常工作,需要正确设置串口包括设置波特率、效验位和停止位的设置,设置串口主要是设置struct termios结构体的各成员值。
Struct termios { unsigned short c_iflag;//输入模式标志 unsigned short c_oflag;//输出模式标志 unsigned short c_cflag;//控制模式标志 unsigned short c_lflag;//本地模式标志 unsigned char c_line;//控制协议 unsigned char c_cc[NCC];//控制模式字符 };
几乎对串口的操作都是通过结构体struct termios和几个函数实现,其中最重要的是tcgetattr()和tcsetattr(),刚开始程序通过tcgetattr()函数获取设备当前的设置,然后修改这些设置,最后用tcsetattr()使设置生效。
在使用串口时,波特率设置成b9600,无校验位,8位数据位和一位停止位。设置好串口之后,就可以通过把串口当作文件读写了。
发送数据:
char buffer[1024]; int Length=1024; int nbyte;
27