基于bs的远程查询系统的设计_毕业设计(编辑修改稿)内容摘要:

2 文件系统)。 Jx44b0 uClinux 系统采用的就是 romfs 文件系统。 ( 2) uClinux 根文 件系统的制作 uClinux 发行版本中包含所有跟文件系统应用程序的所有源程序,并可配置以进行文件系统的裁剪。 文件系统源代码位于 /home/cvtech/jx44b0/uClinuxdist/us er 目录下。 在 /home/cvtech/jx44b0/uClinuxdist/目录下执行: make menuconfig 并选择Customize Vendor/User Setting 后,将打开文件系统配置菜单,用户可以自由定制。 然后执行 make 编译内核和文件系统,编译后的文件系统位于/home/cvtech/jx44b0/uClinuxdist/romfs 目录中,然后通过 genromfs 程序生成文件系统映像文件 /home/cvtech/jx44b0/uClinuxdist/images/。 其命令为:genromfs –v –V “ROMdisk” –f ../uClinuxdist/images/ –d ../uClinuxdist/romfs 前一个目录是生成的映像文件名(包括路径),后一个是文件系统根目录。 ( 3) uClinux 下应用程序的设计方法 下面结 合我所设计的具体程序分析 uClinux 下应用程序的设计方法,我的源程序的文件名为。 首先用 gedit 工具编辑源程序 ,保存在 /home/cvtech/jx44b0/ad 目录中。 然后编写 Makefile 文件,使用 vi 编辑工具编辑 Makefile 文件,如下所示并保存于 /home/cvtech/jx44b0/ad 目录中。 CC=armelfgcc LD=armelfld EXEC=ad OBJS= CFLAGS+= LDFLAGS+= Wl,elf2flt all:$(EXEC) $(EXEC):$(OBJS) $(CC) $(LDFLAGS) o $@ $(OBJS) $(LDLIBS$(LDLIBS_$@)) cp $(EXEC) ../uClinuxdist/romfs/bin genromfs v V ROMdisk f ../uClinuxdist/images/ d ../uClinuxdist/romfs $(LD) r o ../uClinuxdist/binary ../uClinuxdist/images/ clean: rm f $(EXEC) *.elf *.gdb *.o $(OBJS): 下面简要介绍一下各个部分的含义 ① 所采用的编译器和链接器 CC=armelfgcc LD=armelfld ② 生成的执行文件和链接过程中的目标文件 EXEC=ad OBJS= ③ 编译和链接的参数,其中 ”Wl,elf2flt”是必须的,他告诉编译器产生 flt格式的执行文件。 CFLAGS+= LDFLAGS+= Wl,elf2flt ④编译命令,执行完成将生成 ad映像文件。 $(CC) $(LDFLAGS) o $@ $(OBJS) $(LDLIBS$(LDLIBS_$@)) ⑤拷 贝 ad映像文件到 romfs中。 cp $(EXEC) ../uClinuxdist/romfs/bin ⑥生成 romfs映像。 genromfs v V ROMdisk f ../uClinuxdist/images/ d ../uClinuxdist/romfs ⑦将 romfs映像转换成 binary的 , uClinux核心链接时自动将该文件链接到映像文件中。 $(LD) r o ../uClinuxdist/binary ../uClinuxdist/images/ ⑧清除。 clean: rm f $(EXEC) *.elf *.gdb *.o 其次配置 ad自动运行。 因为嵌入式设备上的程序应该是一直运行的,即只要嵌入式设备开机就要一直运行,所以要将 ad程序配置为开机自动运行。 这就需要编辑 romfs中的启动脚本文件,该文件为: /home/cvtech/jx44b0/uClinuxdist/romfs/etc/rc 使用 vi编辑器编辑,在该文件最后添加如下脚本: /bin/ad该脚本将启动后运行 ad,直到程序退出。 或者 /bin/ad amp。 他将后台运行 ad,不影响其他程序的运行。 本设计采用这种方法,可以不影响其他程序的运行。 再次编译 ad,编译 ad并更新文件系统, make clean可以清除过去编译留下的二进制文件, .elf文件, .gdb文件,以免影响此次编译。 Make命令就寻找 makefile文件并执行。 最后重新编译 uClinux。 接着将生成的 zImage映像下载到目标版,然后启动 uClinux, ad程序就会自动运行了。 2.应用程序设计 由于嵌入式设备中的程序不能像 pc 上 位机中的程序那样方便修改,所以在设计时要充分考虑到灵活性,参数都要采用可以修改的方式,而修改的方法是从pc 机上的界面中设置专门的界面,然后将新信息发送给嵌入式系统,将其写到文件中, 当嵌入式 设备用到这些参数 的时候可以从文件读取。 后面的冷库配置参数,服务器 ip 地址都是采用此方法。 ( 1)总体设计。 嵌入式应用程序要实现的主要功能就是对冷库温度数据的测量和控制以及传输。 这个程序要在开机状态下循环执行,因此是一个循环调用的过程,三个模块的程序将会互相调用。 首先是数据采集模块数据,数据采集是用实验箱上的 ad 转 换模块模拟实现,它按照固定的时间间隔采集了数据之后就调用数据控制模块,数据控制模块将会根据所采集的数据值采取相应的控制操作,然后调用传输模块,将数据传送给上位机。 然后回到数据采集模块,如此循环,直到关机或程序异常退出。 本模块应当尽量考虑到工业应用中的实际情况,各种参数应当设计为可以自由修改,这样可以扩大本模块的应用范围。 ( 2)数据采集模块。 本模块实现的主要功能是数据采集。 实现中会遇到的主要问题有: 第一,在现实应用中,数据采集应该是通过传感器、变送器传输到嵌入式设备中,再进行 a/d 转换,但由于实 验设备的限制,在本设计中直接采用实验箱上的 a/d 转换模块模拟此过程。 第二,采样频率的读取。 工业应用中的采样频率应该是随着冷库中的物品而有所差别,不能一概而论。 因此需要从上位机的数据库中读出相应的冷库中存放的物品,并按相应的采样频率采样。 上位机将相应的参数设置(包括采样频率,最大值最小值等)发给嵌入式设备,嵌入式设备将其写入文件 config 然后再从此文件中读出,无论何时改变参数设置,都可以保持嵌入式设备按照最新的采样频率进行采样。 第三,采样时间间隔的具体实现过程。 a/d 转换模块中采样的最大时间间隔也只有 左右,所以用 a/d 转换模块要实现长时间的采集就要采用一直采集,但是知道要求时间才将数据传输给下一个模块。 读出文件中要求的采样间隔时间,例如:间隔时间为 300s,则 300/=2419354 则循环采样 2419354次之后才可以将数据发送给数据控制模块。 void Test_Adc(void) { int loop_delay,fd,spaceflag=0,display_flag1=100,display_flag2。 int data = 0。 int get_index。 char c。 char sendbuffer[MAXDATASIZE]。 char flagbuf[100]。 rCLKCON=0x7ff8。 if((fd=open(config,O_RDONLY))==1) fprintf(stderr,open failed\n)。 read(fd,amp。 c,1)。 while(c!=39。 39。 |spaceflag!=2) { if(c==39。 39。 ) spaceflag++。 else read(fd,amp。 c,1)。 } read(fd,flagbuf,5)。 erase_spaces(flagbuf)。 display_flag2=atoi(flagbuf)。 while(1) { int value。 rADCPSR=0xff。 data = 0。 for(get_index = 0。 get_index 16。 get_index++) { rADCCON=0x1|(0x32)。 // AIN3 while(!(rADCCON amp。 0x40))。 data+=rADCDAT。 for(loop_delay=1000。 loop_delay。 loop_delay)。 } data /= 32。 value = trans_input(data)。 sprintf(sendbuffer,%d,value)。 //display_buffer[0] = value。 if(display_flag2==0) { printf(anti3 is %d\n,value)。 datacontrol(value)。 munacate(sendbuffer)。 display_flag2=atoi(flagbuf)。 } else display_flag2。 for(loop_delay=100000。 loop_delay。 loop_delay)。 } } ( 3)数据控制模块。 数据控制模块主要是根据采集到的数据和最大值最小值的设置采用相应的措施。 本模块分为两个部分,一个是最大值最小值的读取,采用的方法和采样频率相似,都是由 pc 上位机发送给嵌入式设备,写入 config 文件,然后即可从文件中读取。 程序如下 if((fd=open(config,O_RDONLY))==1) fprintf(stderr,open failed\n)。 lseek(fd,1,0)。 read(fd,amp。 c,1)。 while(c!=39。 39。 ) { read(fd,amp。 c,1)。 bitflag++。 } lseek(fd,1,0)。 read(fd,cfbuffer,bitflag)。 erase_spaces(cfbuffer)。 max=atoi(cfbuffer)。 bzero(amp。 cfbuffer,sizeof(cfbuffer))。 lseek(fd,1,1)。 read(fd,amp。 c,1)。 while(c!=39。 39。 ) { read(fd,amp。 c,1)。 minbitflag++。 } lseek(fd,bitflag+2,0)。 read(fd,cfbuffer,minbitflag)。 erase_spaces(cfbuffer)。 min=atoi(cfbuffer)。 bzero(amp。 cfbuffer,sizeof(cfbuffer))。 close(fd)。 另一部分是根据采集到的数据和最大值最小值来判断应该采用的措施。 在工业冷库测控系统中,当温度超高时应该采用开启压缩机,温度过低时关闭压缩机,由于实验条件的限制,开关压缩机的操作我们采用开关 led 灯来模拟。 程序如下: void led(int flag) { if(flag==1) *(char *)0x020xx000=0xFF。 else *(char *)0x020xx000=0x00。 } 这个部分还包括报警功能,当温度一直保持较高或较低温度没有按照预定降温或升温时,即出现故障(故障原因 可能是因为传感器或者压缩机造成,这个超出本课题所研究的范畴),就应该出现故障报警。 蜂鸣器开启,而且 lcd 显示屏上将出现故障提示字样(温度过高或过低)。 报警除了上述表现外,还将会把信息通过 socket 编程发送给 pc上位机,在pc 机上也可显示有嵌入式设备报警。 可以到机房查看。 当数据大于最大值时的流程图如下: n y n y 程序如下 : if(datamax) { printf(enter datamax\n)。 if(maxflag==1) { printf(enter temprature higher,display,alarm\n)。 display(温度过高 )。 munacate(sendbuffer1)。 myalarm()。 } else { printf(set maxflag,open le。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。