实验指导书文档格式.docx

上传人:b****6 文档编号:16204353 上传时间:2022-11-21 格式:DOCX 页数:15 大小:101.01KB
下载 相关 举报
实验指导书文档格式.docx_第1页
第1页 / 共15页
实验指导书文档格式.docx_第2页
第2页 / 共15页
实验指导书文档格式.docx_第3页
第3页 / 共15页
实验指导书文档格式.docx_第4页
第4页 / 共15页
实验指导书文档格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

实验指导书文档格式.docx

《实验指导书文档格式.docx》由会员分享,可在线阅读,更多相关《实验指导书文档格式.docx(15页珍藏版)》请在冰豆网上搜索。

实验指导书文档格式.docx

functionloadXML()

{

if(window.ActiveXObject)

{

XMLdoc=newActiveXObject("

Microsoft.XMLDOM"

);

XMLdoc.async=false;

XMLdoc.load("

adc.xml"

getmessage();

}

setTimeout("

loadXML()"

1000);

}

functiongetmessage()

document.getElementById("

ch_0"

).innerHTML=XMLdoc.getElementsByTagName("

)[0].childNodes[0].nodeValue;

ch_1"

ch_2"

/script>

bodyonload="

bgcolor="

AD远程测试实验<

formalign="

tablewidth="

50%"

border="

1"

align="

thalign="

colspan=2>

/th>

tr>

<

tdalign="

通道0<

/td>

spanid="

/span>

V<

/tr>

通道1<

通道2<

/table>

//192.168.1.133/cgi-bin/stop.cgi"

停止采集"

/>

这个文件的页面就是我们在按下上面的Index.html的查看按钮后跳转过来的,效果如下图所示:

它分别显示了我们的开发板上的三个AD通道的采样值,为简单起见,我们只保留一位小数。

上面的文件中包含了HTML代码和JavaScript脚本。

详细介绍一下JavaScript脚本。

该脚本定义了两个函数:

loadXML和getmessage,文件中用红色标示出来了。

使用这个脚本的目的就是让页面能动态更新数据,而不用我们手动对页面进行刷新。

LoadXML函数在页面被打开时调用,在该函数的末尾有这样一句:

setTimeout("

它的作用就是让这个函数每1000毫秒(也就是1秒)重新执行一次,如果要改变刷新频率,那么把1000改成你想要的数据即可。

考虑到服务器的承受能力,这个值不能取得太小。

Getmessage函数被loadXML函数调用,它的作用就是从服务器的adc.xml文件中解析出我们需要的数据,在页面上显示。

因此,这个函数和服务器上的adc.xml文件是紧密相关的。

Adc.xml文件的全部内容如下:

?

xmlversion="

1.0"

encoding="

UTF-8"

measure>

ch_0>

0.0<

/ch_0>

ch_1>

1.0<

/ch_1>

ch_2>

3.0<

/ch_2>

stop>

A<

/stop>

/measure>

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

三、服务器后台程序

这里所谓的服务器后台程序就是对AD进行采样的程序,该文件叫做run.c,全部内容如下:

#include<

stdio.h>

fcntl.h>

sys/ioctl.h>

unistd.h>

time.h>

 

voidgetdata(char*buff,intadcfd,intret)

inttemp;

inti=0,j;

for(j=0;

j<

3;

j++)

ioctl(adcfd,j,0);

read(adcfd,&

temp,sizeof(int));

temp+=16;

temp=temp/31;

for(;

i<

ret;

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;

i++;

}

voidlock_set(intfd,inttype)

structflocklock;

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();

if(pc<

0)

printf("

forkerror!

\n"

return-1;

elseif(pc>

Content-type:

text/html\n\n"

bodybgcolor=\"

cyan\"

metahttp-equiv=\"

refresh\"

content=\"

1;

url=http:

//192.168.1.133/adc.html\"

"

exit(0);

else

setsid();

//脱离父进程

chdir("

/"

//改变当前目录

umask(0);

//重设文件权限掩码

for(i=0;

i<

65535;

i++)//关闭设备文件描述符

close(i);

adcfd=open("

/dev/adc"

O_RDWR);

if(adcfd<

0)

printf("

Cannotopenadcdevice!

returnadcfd;

while

(1)

while

(1)

{

xmlfd=open("

/var/www/adc.xml"

//打开标志文件

if(xmlfd<

{

continue;

}

else

lock_set(xmlfd,F_WRLCK);

//给文件上锁,避免其他进程对该文件进行写操作

break;

}

ret=read(xmlfd,buff,150);

for(i=0;

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);

close(xmlfd);

sleep

(1);

close(xmlfd);

close(adcfd);

return0;

这个程序就不详细分析了,简单说一下原理,其他内容可以查看程序中的注释。

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

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

一个主线程,用于打印一些HTML代码,使页面跳转到我们的adc.html页面去,打印完HTML信息后该线程就退出;

另一个子线程执行真正的AD数据采集,它读取三个通道的AD值,并对读出来的值进行转换,并将读取的结果写入adc.xml文件中,供用户检索。

同时,这个线程还会检查adc.xml的<

标签中的内容,如果为’$’,则说明用户按下了“停止采集”键,那么就结束程序的执行,否则继续执行。

四、停止采集程序

当用户按下数据采集页面的“停止采集”按钮后,会执行一个后台服务程序。

该文件的源文件名字是stop.c,全部内容如下:

intfd,ret;

charbuff[150];

/*打印HTML文档*/

printf("

//192.168.1.133\"

fd=open("

../adc.xml"

if(fd<

continue;

else

lock_set(fd,F_WRLCK);

break;

ret=read(fd,buff,150);

for(i=0;

if((buff[i]=='

s'

t'

o'

(buff[i+3]=='

p'

buff[i+5]='

lseek(fd,0,SEEK_SET);

write(fd,buff,ret);

//写文件,改变文件内容,以便视频采集程序能检测到该变化

lock_set(fd,F_UNLCK);

close(fd);

//关闭设备文件描述符

return0;

该程序的实现比较简单,主要任务就是改变adc.xml文件中的<

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

五、编译BOA服务器和CGI程序

我们的光盘中提供了boa的源代码,叫做boa-0.94.13.tar.gz。

首先解压该文件:

yqliu29@up-tech:

~/app/web$tarzxvfboa-0.94.13.tar.gz

然后进入源代码目录:

~/app/web$cdboa-0.94.13/src/

修改文件compat.h的第120行:

~/app/web/boa-0.94.13/src$vicompat.h

修改后,第120行的内容如下:

#defineTIMEZONE_OFFSET(foo)foo->

tm_gmtoff

即只是去掉了该行的两个’##’字符。

然后修改boa.c:

~/app/web/boa-0.94.13/src$viboa.c

找到该文件的225~227行,注释掉这几行,不然运行的时候会出错。

源文件的修改就完成了,现在开始编译。

首先,运行configure程序对源文件进行配置:

~/app/web/boa-0.94.13/src$./configure

配置完成后,修改Makefile:

~/app/web/boa-0.94.13/src$viMakefile

修改第31行和32行如下:

CC=arm-linux-gcc

CPP=arm-linux-gcc-E

修改完成后,保存文件,运行Make进行编译:

~/app/web/boa-0.94.13/src$make

编译完成后,会在该目录下生成我们需要的可执行文件boa。

然后,编译我们的CGI程序。

CGI程序供两个,一个是run.c,另一个是stop.c,分别运行如下命令进行编译:

~/app/web$arm-linux-gcc-orun.cgirun.c

~/app/web$arm-linux-gcc-ostop.cgistop.c

编译完成后,会在目录下生成run.cgi和stop.cgi两个应用程序。

六、BOA服务器的配置

Boa运行时需要在/etc/boa目录下有一个boa.conf文件,该文件的全部内容如下:

Port80

#Listen192.68.0.5

Userroot

Group0

ErrorLog/var/log/boa/error_log

AccessLog/dev/null

ServerNamewww.your.org.here

DocumentRoot/var/www

DirectoryIndexindex.html

KeepAliveMax1000

KeepAliveTimeout10

MimeTypes/etc/mime.types

DefaultTypetext/plain

CGIPath/bin:

/usr/bin:

/usr/local/bin

AddTypeapplication/x-httpd-cgicgi

ScriptAlias/cgi-bin//var/www/cgi-bin/

另外,在/etc目录下还需要一个mime.types文件,可以直接从主机上的/etc目录拷贝过来。

运行时需要的目录如下:

/var/www这个是我们的html文件存放的目录

/var/www/cgi-bin这个是CGI程序存放的目录

/var/log/boa/error_log这个是boa服务器存放错误日志的地方

因此,把我们上面提到的index.html、adc.html和adc.xml三个文件拷贝到开发板的/var/www目录下;

把刚才编译得到的run.cgi和stop.cgi拷贝到/var/www/sgi-bin目录下;

还要在/var/log/boa目录下建立一个error_log文件,命令如下:

[root@up-tech/var/log/boa]pwd

/var/log/boa

[root@up-tech/var/log/boa]toucherror_log

这样,服务器的配置就完成了,把刚才编译得到的boa可执行文件拷贝到/bin目录下,然后执行boa命令,就可以启动boa服务器了:

[root@up-tech/var/log/boa]boa

启动后,在PC机的IE浏览器中输入开发板的IP地址,打开的页面如下:

点击上面的“查看”按钮后,弹出的页面如下:

要想在测试HTML页面观察到2410经典平台的AD输出,需要手动加载该平台配套的ADC设备驱动(前面课程实验已经编译出该驱动)s3c2410-adc.ko.并且手动建立好ADC设备节点,这样本次实验程序才可以正确调用该设备接口。

参考步骤如下:

up-tech:

~#insmods3c2410-adc.ko

adc_major:

252

add2410_adcok!

!

~#mknod/dev/adcc2520

这时候可以转动开发板上的AD输入的三个旋钮,查看三个通道的采样值是否变化。

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

备注:

本次实验使用的ARM根文件系统是为BOA服务器修改过的,建议您使用本次培训配套的健全的根文件系统,暂时不要使用直接编译的根文件系统(前面课程实验所编译的简单文件系统)。

由于ARM设备上运行的是CRAMFS文件系统即只读文件系统,因此此实验要求用户要根据boa服务器的配置要求重新制作根文件系统,否则CRAMFS文件系统的相关目录无法写入和更改。

这里我们可以将培训班镜像文件img目录下的root.cramfs文件系统通过一个小方法,解压出文件系统源码,在此基础上进行BOA服务器的配置和更改。

方法如下:

1、创建新的根文件系统目录

[root@vm-devrootfs-2p6]#mkdirrootfs

2、挂载cramfs文件系统到新建立的目录下

[root@vm-devrootfs-2p6]#mount-olooprootfs.cramfsrootfs/

[root@vm-devrootfs-2p6]#ls

rootfs.cramfsrootfs

3、压缩新建目录

[root@vm-devrootfs-2p6]#tarcjfrootfs.tar.bz2rootfs/

rootfs.cramfsrootfsrootfs.tar.bz2

4、卸载挂载点目录,并删除新建目录

[root@vm-devrootfs-2p6]#umountrootfs

[root@vm-devrootfs-2p6]#rm-rfrootfs

rootfs.cramfsrootfs.tar.bz2

5、将压缩包再一次解压出来,即可看到CRAMFS文件系统源码目录树

[root@vm-devrootfs-2p6]#tarxjvfrootfs.tar.bz2

[root@vm-devrootfs-2p6]#cdrootfs

[root@vm-devrootfs]#ls

bindevetcliblinuxrcmntoptprocrootsbinsystmpusrvar

[root@vm-devrootfs]#

制作完成rootfs

通过mkcramfs工具生成root.cramfs只读文件系统

1)确认serverip是Linux虚拟机的IP地址

执行“printenv”,查看serverip是否与Linux虚拟机的IP地址一致

若不一致,执行“setenvserverip192.168.1.12”来指定tftp服务器的IP地址

执行“saveenv”保存设置。

2)将生成的uImage文件拷贝到tftpboot目录下:

cproot.cramfs/tftpboot

3)在ARM开发板上运行命令:

tftp0x30008000root.cramfs(把uImage文件下载到ARM开发板的SDRAM中0x30008000开始的空间中)

nanderase0x3800000x400000(擦除NandFlash中起始地址为0x380000,大小为0x400000的空间)

nandwrite0x300080000x3800000x400000(把SDRAM中0x30008000开始的内容写入NandFlash0x380000开始的空间内,

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

当前位置:首页 > 高中教育 > 初中教育

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

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