APP下载

基于linux系统平台下的nfs方式应用程序开发及实现

2016-08-29广东工业大学自动化学院黄伟杰

电子世界 2016年15期
关键词:程序开发开发板内核

广东工业大学自动化学院 黄伟杰



基于linux系统平台下的nfs方式应用程序开发及实现

广东工业大学自动化学院黄伟杰

与Windows系统以及ios系统不同,Linux操作系统因为它享有免费的开源代码资源特性因而在各种台式计算机、大型机以及超级计算机中装载并且广泛应用于各种工业控制领域。而嵌入式下的Linux系统则是在目前盛行的Linux系统下进行修改然后移植到各种相关的嵌入式设备中运行的操作系统。目前广泛运用在移动终端网络、市面上各种消费型电子媒体播放器甚至军工领域。面对市面上各种Linux系统程序的使用以及开发,初学者不免会产生相应的疑惑。因此,本人在基于ARM类下的内核A8芯片,处理器为三星公司生产的s5pv210开发板搭载的Linux系统平台下,运用一个简单易懂的例子来对嵌入式Linux开发环境下的NFS配置以及实现进行阐述,具有一定现实意义以及研究价值。

嵌入式下的Linux;进线程;后台;交叉编译;NFS配置

1 总体设计方案

本文主要通过三部分内容来实现,第一部分是系统开发平台的搭建,第二部分是基于系统平台之上对NFS开发环境的搭建,最后介绍的是通过Linux嵌入式系统平台搭建的NFS方式下的程序实现。

2 系统开发平台的搭建

2.1当今各大系统操作平台

当今主流的系统操作平台有微软公司旗下的windows操作平台、苹果公司的Mac OS操作平台以及Linux/Unix操作平台。其中本文着重于介绍嵌入式Linux开发平台的搭建[1]。

Linux操作系统是一个免费的类Unix的操作系统,基于POSIX和UNIX多用户,同时支持多线程,与此同时,它还继承了Unix网络为核心的设计思想,性能稳定。与微软的windows系统以及苹果公司的Mac Os系统不同,它拥有大量的开源代码,图形界面设计也是相当优秀,同时也支持多平台。当今主流的Linux系统有Ubuntu和红帽(Redhat)等。

2.2嵌入式Linux平台的搭建

应用程序在嵌入式Linux下的开发与windows下的开发是完全不同的。微软公司的windows系统下,可以随意下载各种集成好的编译软件,例如visual Studio,在此环境下可以迅速完成程序的编辑、编译和运行。与此相比,Linux系统平台缺少像visual studio这样简单高效的编译软件,因此进行程序开发需要PC机与之搭载的嵌入式Linux平台下进行。出于开发的方便出发,程序的编辑在PC机上完成,而程序的调试运行在Linux系统上的终端上完成,最终在开发板上进行调试。因此,需要在Linux服务器与开发板这个客户端实现通讯来交换信息。目前最常用的方法莫过于FTP方式。方法是首先在Linux终端上对源程序代码进行编译,通过将编译后的文件通过TFTP下载到开发板上运行。虽说简单方便,但是致命的缺陷是下载速度慢导致效率低下,不能在线调试。因此,基于此我将在本文接下来讨论一种更为高效的方式来实现信息的交换。这种交换方式叫做NFS[2]。

2.3Linux嵌入式平台的架构

Linux嵌入式平台的架构主要包括Linux服务器、普通局域网下的计算机客户端以及嵌入式Linux开发板系统。[3]总体设计思路如图1所示。

图1 总体设计图

任意一台PC电脑都可以作为Linux服务器,在此使用的是Ubuntu操作系统,在此系统上进行内核移植以及应用程序的编辑以及编译。客户端可以是多台计算机,多半搭载着windows操作系统,完成基本工作,有时候根据需要与Linux服务器或者开发板进行连接。而嵌入式Linux开发板系统则是用开对应用程序的最终开发,需要在服务器的基础之上,搭建网络文件系统,将服务器上的一系列目录挂载到开发板系统上,进而对相应的程序进行编译以及运行[4]。

2.4Linux操作系统的移植

本文实验使用的三星公司生产的s5pv210开发板所搭载的操作系统就是嵌入式Linux,它是把标准的Linux操作系统进行一系列修改后加入特定功能所形成的系统。然后将它最终移植到开发板上运行。系统的内核移植分为引导程序、操作系统内核移植以及根文件系统三大块。

(1)引导程序(bootloader)

引导程序是操作系统内核运行之前的一段代码,其最终目的就是启动内核。[5]分为boot+loader两阶段。Boot即为初始化寄出的硬件设备,建立内存空间映射图,将系统的软硬件环境带到一个合适的状态。Loader即是将操作系统内核镜像加载到内存,之后跳转到内核所在的地址运行。

(2)操作系统内核

内核的本质是c语言函数的集合,是硬件的管理者。从应用程序的角度来说,内核是服务的提供者,有如下功能:第一为实现系统的调用,实现应用程序和内核的交应。其次为对进程的管理,进程的创建、终止、通信和调度。除此之外还有实现对内存的管理以及设备的管理。最后一点为虚拟文件系统和带有网络协议。

(3)根文件系统

根文件的内容有根目录”/”;bin文件目录存放所有用户都能使用的基本指令;sbin目录存放的是系统命令,只有管理员才可以使用;usr目录存放的是用户的命令以及文档;dev目录存放的是设备文件,设备文件是Linux操作系统下特有的文件格式,在Linux操作系统下,所有设备操作都是通过访问设备文件来实现的。除此之外,还有etc等一系列文件。

2.5交叉编译环境的建立

利用在计算机上的编译软件将源代码生成在开发板上运行的最终代码过程称为交叉编译。[6]步骤分为编译链接以及转换三步。其编译器涉及到arm-linux-gcc等。

3 Linux系统平台上的NFS开发环境的搭建

NFS服务器在嵌入式开发中非常常用,可以实现主机与开发板上的文件共享。目标系统通常作为NFS客户机使用,Linux主机作为服务器,目标系统使用NFS,将服务器上的目录文件挂载到本地开发板上,便可以直接运行在服务器上的源程序了,与FTP这种方式相比,效率有了极大的提高。NFS在Linux服务器上的配置如下:

(1)安装软件包,#apt-get install nfs-kernel-server portmap

(2)配置#mkdir /nfs以及#vim /etc/exports,增加以下内容为/home/ gec/nfs*(rw,sync,no_root,squash)和/home/gec/nfs(要共享的目录)。

(3)使用重启服务器命令”sudo service nfs-kernel-server restart”

(4)设定目录及其权限。使用命令mkdir nfs,然后chmod 777-r nfs/.

(5)开发板上操作如下:首先是要确定ip,确定后使用命令mounto nolock 192.168.x.x /home/gec/nfs /mt,mount的意思为挂载。最后就可以进 /mt进行操作了。使用unmount /mt就可以取消挂载。

4 嵌入式Linux系统在NFS方式下代码的实现

对于上述的NFS环境搭建好之后,我们就可以进行服务器与客户端通讯了,最终实现程序的开发。

4.1程序开发流程

若将Linux系统在windows下的虚拟机中实现,则首先第一步为在windows下的代码编辑器上编辑好代码,然后通过samba方式将代码共享到虚拟机上的Linux操作系统,然后使用arm-linux-gcc进行交叉编译,将生成的可执行文件通过NFS方式,最终开发板上利用挂载好的服务器上的共享目录进行程序的编译调试。具体步骤如图2所示:

图2 NFS实现步骤

完成上述所有步骤后,便可以将代码烧写到Nandflash上了。

4.2NFS方式下的程序代码例子

这个例子为实现s5pv210上的LCD屏幕图片百叶窗显示。以此说明嵌入式Linux的程序开发实现步骤。

第一步:程序的编辑。考虑到程序的简单明了,在此就不用windows下的代码编辑器来编辑代码,而是直接使用Linux下的vim。在Linux系统上创立的NFS共享目录/home/gec/nfs下使用文本编辑器来编辑,程序的名字为bmp_show.c。输入指令#vi bmp_show.c,完成代码的编辑的后,保存退出编辑器。代码如下:

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <sys/mman.h>

#include <string.h>

#include <stdlib.h>

void func_blind(char *p_lcd, void * bmp)//百叶窗显示

int k, j;

for(k=0; k<201; k+=20)

for(j=0; j<480; j++)

memcpy(p_lcd+800*4*j, bmp+800*4*j, 4*k);

memcpy(p_lcd+800*4*j+200*4, bmp+800*4*j+200*4, 4*k);

memcpy(p_lcd+800*4*j+400*4, bmp+800*4*j+400*4, 4*k);

memcpy(p_lcd+800*4*j+600*4, bmp+800*4*j+600*4, 4*k);

usleep(90000);

int bmp_show(char *filename)//图片显示

char *bmp = calloc(800*480, 4);char *p_lcd;

char buf[800*480*3];

int i, j, tem, x, y;

int lcd_fd = open(“/dev/fb0”, O_RDWR);//打开LCD设备

int bmp_fd = open(filename, O_RDONLY);//打开bmp格式文件

if(lcd_fd < 0)

perror("open failed!");

return -1;

//创建内存映射,大小为800*480*4个字节,可读可写,可被其它进程共享

p_lcd = mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE,MAP_SHARED, lcd_fd, 0);

if(p_lcd == NULL)

perror("mmap failed!");

return -1;

lseek(bmp_fd, 54, SEEK_SET);//从文件头位置偏移54个字节

read(bmp_fd, buf, 800*480*3);//向bmp图片读取800*480*3个字节的数据放在buf里面

for(i = 0, j = 0; i < 800*480*3; i+=3, j+=4)//转换为LCD格式(RGBA)

bmp[j]= buf[i];// [R]

bmp[j+1]= buf[i+1];//[G]

bmp[j+2]= buf[i+2];//[B]

bmp[j+3]= 0x00;// [A]

for(y = 0; y < 240; y++)//反转图片

for(x = 0; x < 800*4; x++)

tem = bmp[x+(479-y)*800*4];

bmp[x+(479-y)*800*4]= bmp[x+y*800*4];

bmp[x+y*800*4]= tem;

func_blind(p_lcd, bmp);//百叶窗显示

for(i = 0; i < 800*480*4; i++)//LCD内存的操作

p_lcd[i]= bmp[i];//通过单字节赋值操作LCD内存

//memcpy(p_lcd, bmp, 800*480*4);//使用memcpy操作LCD内存

int main(int argc, char **argv)

bmp_show(argv[1]);//bmp显示函数return 0;

第二步为代码的编译。使用交叉编译工具链arm-linux-gcc bmp_show.c -o bmp_show,编译完成后,会在/home/gec/nfs这个目录下生成bmp_show这个可执行文件。

第三步为将刚刚的可执行文件挂载到开发板上的共享目录上。Ip配置好后,使用命令mount-o nolock 192.168.x.x /home/gec/nfs /mt,然后进入到/mnt这个目录下找到刚刚共享的可执行文件。最后将程序运行起来。

5 总结

本文通过在三星公司生产的s5pv210的开发板上搭建的嵌入式Linux系统平台基础上使用的NFS方式进行程序开发,相比传统的FTP模式的程序传输,大大提高了效率,具有一定的价值以及研究意义。

[1]郭昌建.浅析多系统共存[J].巢湖学院学报,2005,7(3):93-94.

[2]M.Tim Jones.网络文件系统与Linux[J].2011.

[3]张宇超.网络计算机中嵌入式Linux操作系统体系结构及相关技术研究[D].重庆大学,2004.

[4]叶军,朱华生.嵌入式Linux NFS方式下应用程序的实现[J].微计算机信息,2007,23(8):74-75.

[5]陈宝君,张爱丽,仲崇权,等.嵌入式系统的内核启动过程分析[J].微计算机信息,2008,24(11).

[6]吕鹏.基于ARM的嵌入式Linux应用程序开发[J].计算机光盘软件与应用,2015(3):51-51.

猜你喜欢

程序开发开发板内核
多内核操作系统综述①
强化『高新』内核 打造农业『硅谷』
浅析大学生在兼职小程序开发中遇到的问题
活化非遗文化 承启设计内核
基于STM32H7的FDCAN通信系统设计与实现∗
APP应用程序开发模式探究
Linux内核mmap保护机制研究
基于嵌入式系统Windows CE的应用程序开发
基于App inventor 2手机程序开发过程的学习与实——以“喵喵定时器”APP开发为例
浅析单片机开发板的设计与制作