linux嵌入式系统期末作业.docx

上传人:b****8 文档编号:9807652 上传时间:2023-02-06 格式:DOCX 页数:15 大小:96.05KB
下载 相关 举报
linux嵌入式系统期末作业.docx_第1页
第1页 / 共15页
linux嵌入式系统期末作业.docx_第2页
第2页 / 共15页
linux嵌入式系统期末作业.docx_第3页
第3页 / 共15页
linux嵌入式系统期末作业.docx_第4页
第4页 / 共15页
linux嵌入式系统期末作业.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

linux嵌入式系统期末作业.docx

《linux嵌入式系统期末作业.docx》由会员分享,可在线阅读,更多相关《linux嵌入式系统期末作业.docx(15页珍藏版)》请在冰豆网上搜索。

linux嵌入式系统期末作业.docx

linux嵌入式系统期末作业

 

linux嵌入式系统期末作业

 

选题:

webserver编程实例

学号:

姓名:

班级:

成绩:

 

2014年6月19日

 

目录

 

1、代码解析:

3

(1)index.html文件解析:

3

(2)adc.html文件解析:

3

(3)Adc.xml文件代码解析:

5

(4)run.c文件代码解析:

5

(5)stop.c文件代码解析:

8

2、程序完成的主要功能:

9

3、必要的操作步骤:

10

4、执行程序的结果(效果图):

12

5、本门课程体会及建议:

13

 

1、代码解析:

(1)index.html文件解析:

AD远程采集实验/*设置网页标题*/

/*设置页面背景颜色为青绿色*/

AD远程采集实验/*定义最大标题并居中*/

2008-12-11

/*设置日期居中*/

//192.168.1.233/cgi-bin/run.cgi">/*生成一个链接到"http:

//192.168.1.233/cgi-bin/run.cgi"的表单*/

/*生成一个“查看”按钮*/

(2)adc.html文件解析:

/*创建脚本的格式为javascript*/

varXMLdoc;/*创建XMLdoc对象*/

functionloadXML()

{

if(window.ActiveXObject)/*判断是否支持ActiveX控件*/

{

XMLdoc=newActiveXObject("Microsoft.XMLDOM");/*实例化一个ActiveX控件*/

XMLdoc.async=false;

XMLdoc.load("adc.xml");/*读取xml文件*/

getmessage();/*函数调用*/

}

setTimeout("loadXML()",1000);/*页面每1000毫秒刷新一次*/

}

functiongetmessage()/*获取旋钮值*/

{

document.getElementById("ch_0").innerHTML=XMLdoc.getElementsByTagName("ch_0")[0].childNodes[0].nodeValue;/*从xml文件里取出ch_0的值写入网页中id为ch_0的文件中*/

document.getElementById("ch_1").innerHTML=XMLdoc.getElementsByTagName("ch_1")[0].childNodes[0].nodeValue;/*从xml文件里取出ch_1的值写入网页中id为ch_1的文件中*/

document.getElementById("ch_2").innerHTML=XMLdoc.getElementsByTagName("ch_2")[0].childNodes[0].nodeValue;/*从xml文件里取出ch_2的值写入网页中id为ch_2的文件中*/

}

/*背景颜色是青绿色*/

AD远程测试实验/*定义最大标题并居中*/

/*生成表单并居中*/

/*生成宽度是屏幕的50%,表格线条粗细为1的表格并居中*/

AD远程测试实验/*表头单元格内容为"AD远程测试实验"并居中*/

通道0

V/*设置id为ch_0并居中*/

通道1

V/*设置id为ch_1并居中*/

通道2

V/*设置id为ch_2并居中*/

//192.168.1.233/cgi-bin/stop.cgi">/*生成一个链接到"http:

//192.168.1.233/cgi-bin/stop.cgi"的表单*/

/*生成一个“停止采集”按钮并居中*/

(3)Adc.xml文件代码解析:

xmlversion="1.0"encoding="UTF-8"?

>

0.0/*设置ch_0的初始值为0.0*/

1.0/*设置ch_1的初始值为1.0*/

3.0/*设置ch_2的初始值为3.0*/

A

/*解析通道中的AD数据*/

(4)run.c文件代码解析:

#include

#include

#include

#include

#include

voidgetdata(char*buff,intadcfd,intret)/*AD数据的采集,并进行格式转换*/

{

inttemp;

inti=0,j;

for(j=0;j<3;j++)/*控制通道的循环*/

{

ioctl(adcfd,j,0);/*控制I/O通道*/

read(adcfd,&temp,sizeof(int));/*将开发板的值返回到temp*/

temp+=16;

temp=temp/31;

for(;i

{

if((buff[i]=='<')&&(buff[i+1]=='c')&&(buff[i+2]=='h'))

break;/*判断字符串"

}

buff[i+6]=(temp/10)+48;

buff[i+8]=(temp%10)+48;/*获取数据赋值给temp,并进行格式的转化*/

i++;

}

}

voidlock_set(intfd,inttype)/*文件上锁函数,在主程序中将被调用*/

{

structflocklock;/*定义结构体flocklock*/

lock.l_whence=SEEK_SET;

lock.l_start=0;

lock.l_len=0;

lock.l_type=type;

while

(1)

{

if((fcntl(fd,F_SETLK,&lock))==0)

return;/*判断文件是否被锁定,若锁定,则退出;否则,继续锁定*/

}

}

intmain(void)

{

pid_tpc;

intadcfd,xmlfd,ret;

unsignedcharbuff[150];

inti;

pc=fork();/*创建主线程,用于打印一些HTML代码,使页面跳转到adc.html页面去,打印完HTML信息后该线程就退出*/

if(pc<0)

{

printf("forkerror!

\n");

return-1;/*判断进程,若pc<0,打印"forkerror!

",若pc>0,打印HTML文档*/

}elseif(pc>0)

{

/*打印HTML文档*/

printf("Content-type:

text/html\n\n");

printf("\n");

printf("

//192.168.1.233/adc.html\">");/*使页面跳转到adc.html页面*/

printf("");

exit(0);

}

else

{

setsid();/*脱离父进程*/

chdir("/");/*改变当前目录*/

umask(0);/*重设文件权限掩码*/

for(i=0;i<65535;i++)

close(i);/*关闭设备文件描述符*/

adcfd=open("/dev/adc",O_RDWR);/*打开adc设备文件*/

if(adcfd<0)

{

printf("Cannotopenadcdevice!

\n");/*判断能不能打开adc设备文件,若打开继续下面程序;反之,打印出不能打开adc设备*/

returnadcfd;

}

while

(1)

{

while

(1)

{

xmlfd=open("/var/www/adc.xml",O_RDWR);/*打开adc.xml文件*/

if(xmlfd<0)

{

continue;

}

else

{

lock_set(xmlfd,F_WRLCK);/*给文件上锁,避免其他进程对该文件进行写操作*/

break;

}

}

ret=read(xmlfd,buff,150);/*将xml值读到buff*/

for(i=0;i

if(buff[i]=='$')/*如果为'$',则说明用户按下了"停止采集"键,结束程序*/

{

buff[i]='A';

lseek(xmlfd,0,SEEK_SET);/*移动文件指针*/

write(xmlfd,buff,ret);/*写入修改后的值*/

lock_set(xmlfd,F_UNLCK);/*给文件上锁,阻止被删除*/

close(xmlfd);

close(adcfd);

return0;

}

getdata(buff,adcfd,ret);

lseek(xmlfd,0,SEEK_SET);

write(xmlfd,buff,ret);/*采集数据并把数据显示在页面上,以便于监测*/

lock_set(xmlfd,F_UNLCK);/*给xml文件上锁*/

close(xmlfd);

sleep

(1);

}

close(xmlfd);

close(adcfd);

return0;

}

}

(5)stop.c文件代码解析:

#include

#include

#include

#include

voidlock_set(intfd,inttype)

{

structflocklock;/*定义flocklock结构体*/

lock.l_whence=SEEK_SET;/*读写位置指向文件头*/

lock.l_start=0;

lock.l_len=0;

lock.l_type=type;

while

(1)

{

if((fcntl(fd,F_SETLK,&lock))==0)

return;/*判断文件是否被锁定,若锁定,则退出;否则,继续锁定*/

}

}

intmain(void)

{

intfd,ret;

charbuff[150];

inti;

/*打印HTML文档*/

printf("Content-type:

text/html\n\n");

printf("\n");

printf("

//192.168.1.233\">\n");/*停留在此页面,不断刷新*/

printf("");

while

(1)

{

fd=open("../adc.xml",O_RDWR);/*打开adc.xml文件*/

if(fd<0)

continue;/*判断文件是否打开,若没打开,继续;若打开,给文件上锁*/

else

{

lock_set(fd,F_WRLCK);/*给文件上锁,避免其他进程对该文件进行写操作*/

break;

}

}

ret=read(fd,buff,150);/*将标志文件中的值读到buff*/

for(i=0;i

if((buff[i]=='s')&&(buff[i+1]=='t')&&(buff[i+2]=='o')&&(buff[i+3]=='p'))/*判断是否出现字符串"stop",若出现,跳出循环,执行下面操作;反之,一直循环*/

break;

buff[i+5]='$';/*如果为‘$’,则说明用户按下了“停止采集”键,结束程序,否则继续执行*/

lseek(fd,0,SEEK_SET);

write(fd,buff,ret);/*写文件,改变文件内容,以便视频采集程序能检测到该变化*/

lock_set(fd,F_UNLCK);/*给文件上锁*/

close(fd);/*关闭设备文件描述符*/

return0;

}

2、程序完成的主要功能:

(1)index.html是我们在IE浏览器的地址栏中输入服务器IP地址时所看到的页面,当点击查看按钮时,页面会跳转到数据采集的显示页面,同时,服务器的后台程序也会开始运行,对我们的三个输入通道进行采集,是索引网页,是让用户进行使用

(2)adc.html这个文件的页面就是我们在按下上面的Index.html的查看按钮后跳转过来的,它分别显示了我们的开发板上的三个AD通道的采样值,是为数据采集而制作的网页

(3)Adc.xml后台服务程序也会对这个文件进行读写,从而达到服务器和用户进行数据交换的目的。

(4)Run.c这个程序是在点击第一个页面(index.html)上的“查看”按钮后执行的。

程序的开始会调用fork来创建两个线程:

一个主线程,用于打印一些HTML代码,使页面跳转到我们的adc.html页面去,打印完HTML信息后该线程就退出;另一个子线程执行真正的AD数据采集,它读取三个通道的AD值,并对读出来的值进行转换,并将读取的结果写入adc.xml文件中,供用户检索。

同时,这个线程还会检查adc.xml的标签中的内容,如果为’$’,则说明用户按下了“停止采集”键,那么就结束程序的执行,否则继续执行。

(5)Stop.c该程序的实现比较简单,当用户按下数据采集页面的“停止采集”按钮后,会执行这个程序。

本程序是改变adc.xml文件中的标签中的内容,在其中插入一个’$’字符,当我们的数据采集程序检测到这个变化后,就会停止采集。

3、必要的操作步骤:

(1)在实验目录下为本实验创建webserver目录

(2)进入webserver目录,使用编辑器vim建立文件webserver,将实验指导中有关代码粘贴过来

(3)我们的光盘中提供了boa的源代码boa-0.94.13.tar.gz,解压该文件

(4)编译BOA服务器和CGI程序

(5)配置BOA服务器,另外在实验目录的/etc目录下还需要一个mime.types文件,直接从主机上的/etc目录拷贝。

(6)启动开发板,制作完成rootfs,通过mkcramfs工具生成root.cramfs只读文件系统,1)确认serverip是Linux虚拟机的IP地址;2)将生成的uImage文件拷贝到tftpboot目录下;3)在ARM开发板上运行命令;把uImage文件下载到ARM开发板的SDRAM中0x30008000开始的空间中;擦除NandFlash中起始地址为0x380000,大小为0x400000的空间;把SDRAM中0x30008000开始的内容写入NandFlash0x380000开始的空间内,大小为0x400000

(7)[up-class2410#]setenvbootcmdnandread0x300080000x800000x250000\;bootm

此项是内核自动启动的参数,如果已设置就不用再重新设置

[up-class2410#]setenvbootargsroot=/dev/mtdblock2init=/linuxrc(接上面空一格)console=ttySAC0,115200

[up-class2410#]saveenv

(8)把上面的index.html、adc.html和adc.xml三个文件拷贝到开发板的/var/www目录下;把前面编译得到的run.cgi和stop.cgi拷贝到/var/www/sgi-bin目录下;还要在/var/log/boa目录下建立一个error_log文件

(9)把刚才编译得到的boa可执行文件拷贝到/bin目录下,然后执行boa命令,就可以启动boa服务器了

(10)手动加载该平台配套的ADC设备驱动s3c2410-adc.ko.并且手动建立好ADC设备节点,这样本次实验程序才可以正确调用该设备接口

(11)创建完成后设置权限,所有用户具有全部权限

(12)在PC机的IE浏览器中输入开发板的IP地址

(13)转动开发板上的AD输入的三个旋钮,查看三个通道的采样值是否变化。

点击“停止采集”按钮后,会跳回第一个页面,点击第一个页面的“查看”可以重新开始。

4、执行程序的结果(效果图):

5、本门课程心得体会:

学习是个自主的过程,光靠老师是远远不够的,更多的是靠自己的态度,俗话说师傅引进门修行靠个人,linux嵌入式系统这门课有些部分很难掌握像linux内核移植、uboot移植等有些命令不会用,例如压缩解压命令,下载命令等记不住。

但是lcd和t、s、ad远程采集实验等等比较容易掌握。

实验的过程中也遇到一些问题,像内核烧写不成功、程序不能实现果等,但这些都通过老师和同学的帮助得到了很好的解决。

我们学习的知识是有限的,在以后的工作中我们肯定会遇到许多未知的领域,这方面的能力便会使我们受益非浅。

在设计过程中,总是遇到这样或那样的问题。

有时发现一个问题的时候,需要做大量的工作,花大量的时间才能解决。

自然而然,我的耐心便在其中建立起来了。

为以后的工作积累了经验,增强了信心

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1