实验指导书文档格式.docx
《实验指导书文档格式.docx》由会员分享,可在线阅读,更多相关《实验指导书文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
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开始的空间内,