1、function loadXML() if(window.ActiveXObject) XMLdoc = new ActiveXObject(Microsoft.XMLDOM); XMLdoc.async = false; XMLdoc.load(adc.xml getmessage(); setTimeout(loadXML(), 1000);function getmessage() document.getElementById(ch_0).innerHTML = XMLdoc.getElementsByTagName()0.childNodes0.nodeValue;ch_1ch_2/
2、scriptbody onload= bgcolor=AD远程测试实验/thtr td align=通道0span id=/spanV通道1通道2/192.168.1.133/cgi-bin/stop.cgi停止采集/这个文件的页面就是我们在按下上面的Index.html的查看按钮后跳转过来的,效果如下图所示:它分别显示了我们的开发板上的三个AD通道的采样值,为简单起见,我们只保留一位小数。上面的文件中包含了HTML代码和JavaScript脚本。详细介绍一下JavaScript脚本。该脚本定义了两个函数:loadXML和getmessage,文件中用红色标示出来了。使用这个脚本的目的就是让页
3、面能动态更新数据,而不用我们手动对页面进行刷新。LoadXML函数在页面被打开时调用,在该函数的末尾有这样一句:setTimeout(它的作用就是让这个函数每1000毫秒(也就是1秒)重新执行一次,如果要改变刷新频率,那么把1000改成你想要的数据即可。考虑到服务器的承受能力,这个值不能取得太小。Getmessage函数被loadXML函数调用,它的作用就是从服务器的adc.xml文件中解析出我们需要的数据,在页面上显示。因此,这个函数和服务器上的adc.xml文件是紧密相关的。Adc.xml文件的全部内容如下:?xml version=1.0 encoding=UTF-8measurech_
4、00.0ch_11.0ch_23.0stopA/measure我们的后台服务程序也会对这个文件进行读写,从而达到服务器和用户进行数据交换的目的。三、服务器后台程序这里所谓的服务器后台程序就是对AD进行采样的程序,该文件叫做run.c,全部内容如下:#include fcntl.hsys/ioctl.hunistd.htime.hvoid getdata(char *buff, int adcfd, int ret) int temp; int i=0, j; for(j=0; j3; j+) ioctl(adcfd, j, 0); read(adcfd, &temp, sizeof(int);
5、 temp += 16; temp = temp/31; for(; iret; i+) if(buffi = ) & (buffi+1 = c (buffi+2 = h) break; buffi+6 = (temp/10) + 48; buffi+8 = (temp%10) + 48; i+; void lock_set(int fd, int type) struct flock lock; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; lock.l_type = type; while(1) if(fcntl(f
6、d, F_SETLK, &lock) = 0) return;int main(void) pid_t pc; int adcfd, xmlfd, ret; unsigned char buff150; int i; pc = fork(); if(pcContent-type:text/htmlnnbody bgcolor=cyanmeta http-equiv=refresh content=1;url=http:/192.168.1.133/adc.html exit(0); else setsid(); /脱离父进程 chdir(/ /改变当前目录 umask(0); /重设文件权限掩
7、码 for(i=0;i65535;i+) /关闭设备文件描述符 close(i); adcfd = open(/dev/adc, O_RDWR); if(adcfd 0) printf(Cannot open adc device! return adcfd; 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
8、=0; if(buffi = $) buffi = A; lseek(xmlfd, 0, SEEK_SET); write(xmlfd, buff, ret); lock_set(xmlfd, F_UNLCK); close(xmlfd); close(adcfd); return 0; 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)
9、; return 0;这个程序就不详细分析了,简单说一下原理,其他内容可以查看程序中的注释。这个程序是在点击第一个页面(index.html)上的“查看”按钮后执行的。程序的开始会调用fork来创建两个线程:一个主线程,用于打印一些HTML代码,使页面跳转到我们的adc.html页面去,打印完HTML信息后该线程就退出;另一个子线程执行真正的AD数据采集,它读取三个通道的AD值,并对读出来的值进行转换,并将读取的结果写入adc.xml文件中,供用户检索。同时,这个线程还会检查adc.xml的标签中的内容,如果为$,则说明用户按下了“停止采集”键,那么就结束程序的执行,否则继续执行。四、停止采集
10、程序当用户按下数据采集页面的“停止采集”按钮后,会执行一个后台服务程序。该文件的源文件名字是stop.c,全部内容如下: int fd, ret; char buff150; /* 打印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(buffi = sto (buffi+3 = p buffi+5 = lseek(fd, 0, SEEK_SET); write(
11、fd, buff, ret);/写文件,改变文件内容,以便视频采集程序能检测到该变化 lock_set(fd, F_UNLCK); close(fd);/ 关闭设备文件描述符 return 0;该程序的实现比较简单,主要任务就是改变adc.xml文件中的tm_gmtoff即只是去掉了该行的两个#字符。然后修改boa.c:/app/web/boa-0.94.13/src$ vi boa.c找到该文件的225227行,注释掉这几行,不然运行的时候会出错。源文件的修改就完成了,现在开始编译。首先,运行configure程序对源文件进行配置:/app/web/boa-0.94.13/src$ ./co
12、nfigure配置完成后,修改Makefile:/app/web/boa-0.94.13/src$ vi Makefile修改第31行和32行如下:CC = arm-linux-gccCPP = 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 -o run.cgi run.c/app/web$
13、arm-linux-gcc -o stop.cgi stop.c编译完成后,会在目录下生成run.cgi和stop.cgi两个应用程序。六、BOA服务器的配置 Boa运行时需要在/etc/boa目录下有一个boa.conf文件,该文件的全部内容如下:Port 80#Listen 192.68.0.5User root Group 0 ErrorLog /var/log/boa/error_logAccessLog /dev/nullServerName www.your.org.hereDocumentRoot /var/wwwDirectoryIndex index.htmlKeepAliv
14、eMax 1000KeepAliveTimeout 10MimeTypes /etc/mime.typesDefaultType text/plainCGIPath /bin:/usr/bin:/usr/local/binAddType application/x-httpd-cgi cgiScriptAlias /cgi-bin/ /var/www/cgi-bin/另外,在/etc目录下还需要一个mime.types文件,可以直接从主机上的/etc目录拷贝过来。运行时需要的目录如下:/var/www 这个是我们的html文件存放的目录/var/www/cgi-bin 这个是CGI程序存放的目
15、录/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文件,命令如下:rootup-tech /var/log/boapwd/var/log/boarootup-tech /var/log/boatouch error_log这样,服务器的配置就完成了,把刚才编译得到的boa可执行文件拷贝到
16、/bin目录下,然后执行boa命令,就可以启动boa服务器了:rootup-tech /var/log/boaboa启动后,在PC机的IE浏览器中输入开发板的IP地址,打开的页面如下:点击上面的“查看”按钮后,弹出的页面如下:要想在测试HTML页面观察到2410经典平台的AD输出,需要手动加载该平台配套的ADC设备驱动(前面课程实验已经编译出该驱动)s3c2410-adc.ko.并且手动建立好ADC设备节点,这样本次实验程序才可以正确调用该设备接口。参考步骤如下:up-tech: #insmod s3c2410-adc.ko adc_major: 252add 2410_adc ok! #mk
17、nod /dev/adc c 252 0这时候可以转动开发板上的AD输入的三个旋钮,查看三个通道的采样值是否变化。点击“停止采集”按钮后,会跳回第一个页面,点击第一个页面的“查看”可以重新开始。备注:本次实验使用的ARM根文件系统是为BOA服务器修改过的,建议您使用本次培训配套的健全的根文件系统,暂时不要使用直接编译的根文件系统(前面课程实验所编译的简单文件系统)。由于ARM设备上运行的是CRAMFS文件系统即只读文件系统,因此此实验要求用户要根据boa服务器的配置要求重新制作根文件系统,否则CRAMFS文件系统的相关目录无法写入和更改。这里我们可以将培训班镜像文件img目录下的root.cr
18、amfs文件系统通过一个小方法,解压出文件系统源码,在此基础上进行BOA服务器的配置和更改。方法如下:1、创建新的根文件系统目录rootvm-dev rootfs-2p6# mkdir rootfs2、挂载cramfs文件系统到新建立的目录下rootvm-dev rootfs-2p6# mount -o loop rootfs.cramfs rootfs/rootvm-dev rootfs-2p6# lsrootfs.cramfs rootfs3、压缩新建目录rootvm-dev rootfs-2p6# tar cjf rootfs.tar.bz2 rootfs/rootfs.cramfs r
19、ootfs rootfs.tar.bz24、卸载挂载点目录,并删除新建目录rootvm-dev rootfs-2p6# umount rootfsrootvm-dev rootfs-2p6# rm -rf rootfsrootfs.cramfs rootfs.tar.bz25、将压缩包再一次解压出来,即可看到CRAMFS文件系统源码目录树rootvm-dev rootfs-2p6# tar xjvf rootfs.tar.bz2rootvm-dev rootfs-2p6# cd rootfsrootvm-dev rootfs# lsbin dev etc lib linuxrc mnt opt
20、 proc root sbin sys tmp usr varrootvm-dev rootfs# 制作完成rootfs通过mkcramfs工具生成root.cramfs只读文件系统1) 确认serverip是Linux虚拟机的IP地址执行“printenv”,查看serverip是否与Linux虚拟机的IP地址一致若不一致,执行“setenv serverip 192.168.1.12”来指定tftp服务器的IP地址执行“saveenv”保存设置。2)将生成的uImage文件拷贝到tftpboot目录下:cp root.cramfs /tftpboot3) 在ARM开发板上运行命令:tftp 0x30008000 root.cramfs (把uImage文件下载到ARM开发板的SDRAM中0x30008000开始的空间中)nand erase 0x380000 0x400000 (擦除Nand Flash中起始地址为0x380000,大小为0x400000的空间)nand write 0x30008000 0x380000 0x400000 (把SDRAM中0x30008000开始的内容写入Nand Flash0x380000开始的空间内,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1