1、计算机科学与技术专业课程设计汇报Linux操作系统,嵌入式开发方向二二一年 六月基于ARM Linux物联网物流仓储系统设计与实现汇报提纲一、课程设计目的与意义二、课程设计内容与环境三、项目实施过程四、项目分工与完成情况五、课程设计总结及收获一、课程设计目的与意义计算机和网络已经全面渗透到日常生活的每一个角落,对于我们没有个人来说,需要的已经不再仅仅是放在桌面上处理文档,进行工业管理和生产控制的计算机“机器”任何一个普通的人都可能拥有从小到大的各种嵌入式技术的电子产品,小到mp3pda等微型数字化产品,大到网络家电,智能家电等,各种各样的新型嵌入式系统设备在应用数量上已经远远超过了通用计算机,
2、在工业和服务领域,使用嵌入式技术的数字机床、智能工具、工业机器人、服务机器人、正在逐渐的改变着传统的工业生产和服务方式。而arm芯片凭借强大的处理能力和极低的功耗,非常适合这些场合。所以现在越来越多的公司在产品选型的时候考虑到使用arm处理器,从这个角度来说,对于在校大学生来说,如果你掌握了arm开发技术,对于寻找一-份好的工作也十分有利。二、课程设计内容与环境(一)课程实训内容紧扣实训项目题目,基于u-boot引导和启动Linux内核技术的Ubuntu系统设计与实现,要求具备点亮LED功能。项目案例名称:LED灯实验。(二)课程实训环境一台PC机,Ubuntu12.04发行版,VMware,
3、FS6818开发板三、项目实施过程(一)项目计划(二)需求分析(三)系统设计(四)系统实现(一)项目计划1.(一)项目计划2.(一)项目计划3.(二)需求分析仓储管理是现代经济运转中重要的组成部分,对其进行优化管理有重要社会和经济效益。嵌入式技术由于拥有许多独特的优势,在各个领域中的应用越来越广泛。本系统设计利用计算机作为主机,80C51单片机系统为终端,组成一个嵌入式智能控制网络,实现智能化的仓储信息管理系统的设计,利用计算机串口外接的485总线来对这些嵌入式终端进行控制,从而达到远程抄表和远程控制的目的。管理人员在计算机中心通过人机对话界面对每个仓库的信息实施全面管理。智能高级仓储管理系统
4、是-个集监测仓库各种状态(如温度,湿度)以及仓库货物进出的综合信息管理系统。通过对多个仓库所处环境的信息的采集测试和货物的存储、进出信息的加工处理进行统一调配管理,具有较好的系统可扩展性和可重用性。系统可以将8种不同的传感器传输过来的信号进行采集和数据加工,实施部分的无人监控管理,大幅度提高整个物流及仓储管理系统的效率。(三)系统设计1.功能结构设计本系统是模拟仓储信息管理的各个功能。仓储信息大体.上可分为:入仓信息,存储信息,出仓信息。在这几个环节中,有许多信息是物流方面并不关心的,所以这种数据叫做无效数据,可以在嵌入微控制器部分将其过滤掉。通过对物流仓储管理每-个环节的具体的分析,找出物流
5、管理中的有效数据,然后针对这些数据进行不同方式的加工,我们可以根据数据的性质和流动的规律来设计这个信息管理系统。端发送给计算机主机;由计算机主机记录并记录。货物在仓库中存放的时候,关键是存储环境的问题(比如:温度,湿度等)。这些数据由仓库内部终端的传感器采集加工,在经过485总线传给计算机主机,这样就实现了计算机主机同时对所有仓库实施监控。有些信息是相对固定的(比如:通知公告等),一个大的显示屏可以满足这个方面的需求。这样就基本.上构成了一个相对完整的信息系统,2. 业务流程设计 1)将boa目录放到rootfs/etc/目录下2)将www放到rootfs的目录3)在rootfs/www/下创
6、建cgi-bin目录4)将Windows下html文件夹中的index和images文件夹放到Ubuntu下的rootfs/www下5)将Windows下cgi文件夹中的env.cgiled.cgibeep.cgitemp.cgivol_limit.cgi 可执行文件放到Ubuntu下rootfs/www/cgi-bin目录下6)在rootfs目录下创建driver目录(三)系统设计7)将Windows下driver文件夹下的adc.ko/beep.ko/ds18b20.ko/led.ko放到Ubuntu下rootfs下的driver目录下8)vi/rootfs/etc/init.d/rcS#
7、!/bin/sh /bin/mount -aecho /sbin/mdev /proc/sys/kernel/hotplug /sbin/mdev -secho 4 3 1 7 /proc/sys/kernel/printkinsmod /driver/led.komknod /dev/myled c 600 0insmod /driver/adc.komknod /dev/myadc c 601 0insmod /driver/beep.komknod /dev/mybeep c 602 0insmod /driver/ds18b20.komknod /dev/myds18b20 c 603
8、 0/etc/boa/boa9)确认硬件连接正常后开启Ubuntutftp和nfs开发板上电10)在Ubuntu中在火狐浏览器地址栏中输入开发板IP地址 192.168.1.34查看现象。(三)系统设计项目框架层次1网页端:html-|-网页端服务器:boa开源-|-cgi应用程序:cgi-|-驱动:ledadcbeepds18b202boa服务器boa服务器是一个小型的web服务器,一般在嵌入式设备上用比较多。它的功能是向用户提供网页的支持,向下层操作cgi应用程序,由cgi应用程序操作硬件驱动。boa服务器已经有开发者实现好了,我们只需要将它移植到自己的开发板上即可。1.boa服务器的移植
9、找到要移植的源码boa-0.94.13.tar.gzmkdir boa(三)系统设计把它拖到Ubuntu的boa目录中tar -xvf boa-0.94.13.tar.gz 编译源码cd src./configure /生成Makefile,Makefile他是编译源码文件 修改Makefile 修改CCgcc为CCarm-none-linux-gnueabi-gcc 修改CPPgcc-E为CPParm-none-linux-gnueabi-gcc-E make /编译boa源码编译时出现如下错误: linuxubuntu:/boa/boa-0.94.13/src$ makeyacc -d b
10、oa_grammar.ymake: yacc: Command not foundmake: * y.tab.c Error 127错误的原因:Ubuntu上没有yacc的词法分析的程序(三)系统设计解决办法:安装对应词法分析器/sudo apt-get install bison flex/由于大家没有网,这个命令执行不成功将yacc的安装程序拷贝到Ubuntu的yacc的目录下sudo dpkg -i *.deb安装所有需要的词法分析的软件,当安装完成之后重新执行make即可。编译源码的时候如果遇到错误,或者配置不正确 需要修改编译的时候出现如下错误1: util.c:100:1: err
11、or: pasting t and - does not give a valid preprocessing token错误的原因:开发者的编译器和我们的编译版本不一样,所有导致这些语法问题,编译器识别不了解决办法:(修改源码)100 time_offset = TIMEZONE_OFFSET(t); 如何找到TIMEZONE_OFFSET定义,内核给咱们提供了追代码的工具。(三)系统设计 1.为代码创建索引ctags -R -它会生成tags的索引文件 2.追代码的快捷键在文件中:ctrl + 追进去ctrl + t 退回来在终端上追:vi -t 想要追的函数的名字解决方法:修改Vi sr
12、c/compat.h #define TIMEZONE_OFFSET(foo) foo#-tm_gmtoff 修改成#define TIMEZONE_OFFSET(foo) (foo)-tm_gmtoff 得到boa的应用程序在rootfs的etc目录下创建boa的目录mkdir /rootfs/etc/boa(四)系统实现1.核心模块代码 int main(int argc, char *argv) int result;char *cgiContentLengthString;char *e;cgiSetupConstants();cgiGetenv(&cgiServerSoftware,
13、 SERVER_SOFTWARE);cgiGetenv(&cgiServerName, SERVER_NAME);cgiGetenv(&cgiGatewayInterface, GATEWAY_INTERFACE);cgiGetenv(&cgiServerProtocol, SERVER_PROTOCOL);cgiGetenv(&cgiServerPort, SERVER_PORT);cgiGetenv(&cgiRequestMethod, REQUEST_METHOD); cgiGetenv(&cgiPathInfo, PATH_INFO);cgiGetenv(&cgiPathTransla
14、ted, PATH_TRANSLATED);cgiGetenv(&cgiScriptName, SCRIPT_NAME);cgiGetenv(&cgiQueryString, QUERY_STRING);cgiGetenv(&cgiRemoteHost, REMOTE_HOST);cgiGetenv(&cgiRemoteAddr, REMOTE_ADDR);cgiGetenv(&cgiAuthType, AUTH_TYPE);(四)系统实现cgiGetenv(&cgiRemoteUser, REMOTE_USER);cgiGetenv(&cgiRemoteIdent, REMOTE_IDENT
15、);/* 2.0: the content type string needs to be parsed and modified, socopy it to a buffer. */e = getenv(CONTENT_TYPE);if (e) if (strlen(e) sizeof(cgiContentTypeData) strcpy(cgiContentType, e); else /* Truncate safely in the event of what is almost certainlya hack attempt */strncpy(cgiContentType, e,
16、sizeof(cgiContentTypeData);cgiContentTypesizeof(cgiContentTypeData) - 1 = 0; else cgiContentType0 = 0;/* Never null */cgiMultipartBoundary = ;(四)系统实现/* 2.0: parse semicolon-separated additional parameters of thecontent type. The one were interested in is boundary.We discard the rest to make cgiConte
17、ntType more usefulto the typical programmer. */if (strchr(cgiContentType, ;) char *sat = strchr(cgiContentType, ;);while (sat) *sat = 0;sat+;while (isspace(*sat) sat+;if (cgiStrBeginsNc(sat, boundary=) char *s;cgiMultipartBoundary = sat + strlen(boundary=);s = cgiMultipartBoundary;while (*s) & (!iss
18、pace(*s) s+;(四)系统实现*s = 0;break; else sat = strchr(sat, ;); cgiGetenv(&cgiContentLengthString, CONTENT_LENGTH);cgiContentLength = atoi(cgiContentLengthString);cgiGetenv(&cgiAccept, HTTP_ACCEPT);cgiGetenv(&cgiUserAgent, HTTP_USER_AGENT);cgiGetenv(&cgiReferrer, HTTP_REFERER);cgiGetenv(&cgiCookie, HTTP
19、_COOKIE);#ifdef CGICDEBUGCGICDEBUGSTARTfprintf(dout, %dn, cgiContentLength);fprintf(dout, %sn, cgiRequestMethod);fprintf(dout, %sn, cgiContentType);CGICDEBUGEND(四)系统实现 #endif /* CGICDEBUG */#ifdef WIN32/* 1.07: Must set stdin and stdout to binary mode */* 2.0: this is particularly crucial now and mu
20、st not be removed */_setmode( _fileno( stdin ), _O_BINARY );_setmode( _fileno( stdout ), _O_BINARY );#endif /* WIN32 */cgiFormEntryFirst = 0;cgiIn = stdin;cgiOut = stdout;cgiRestored = 0;/* These five lines keep compilers fromproducing warnings that argc and argvare unused. They have no actual funct
21、ion. */if (argc) if (argv0) cgiRestored = 0;(四)系统实现 #endif /* CGICDEBUG */#ifdef WIN32/* 1.07: Must set stdin and stdout to binary mode */* 2.0: this is particularly crucial now and must not be removed */_setmode( _fileno( stdin ), _O_BINARY );_setmode( _fileno( stdout ), _O_BINARY );#endif /* WIN32
22、 */cgiFormEntryFirst = 0;cgiIn = stdin;cgiOut = stdout;cgiRestored = 0;/* These five lines keep compilers fromproducing warnings that argc and argvare unused. They have no actual function. */if (argc) if (argv0) cgiRestored = 0;(四)系统实现if (cgiStrEqNc(cgiRequestMethod, post) #ifdef CGICDEBUGCGICDEBUGS
23、TARTfprintf(dout, POST recognizedn);CGICDEBUGEND#endif /* CGICDEBUG */if (cgiStrEqNc(cgiContentType, application/x-www-form-urlencoded) #ifdef CGICDEBUGCGICDEBUGSTARTfprintf(dout, Calling PostFormInputn);CGICDEBUGEND#endif /* CGICDEBUG */if (cgiParsePostFormInput() != cgiParseSuccess) #ifdef CGICDEB
24、UGCGICDEBUGSTARTfprintf(dout, PostFormInput failedn);CGICDEBUGEND#endif /* CGICDEBUG */cgiFreeResources();return -1;(四)系统实现#ifdef CGICDEBUGCGICDEBUGSTARTfprintf(dout, PostFormInput succeededn);CGICDEBUGEND#endif /* CGICDEBUG */ else if (cgiStrEqNc(cgiContentType, multipart/form-data) #ifdef CGICDEBU
25、GCGICDEBUGSTARTfprintf(dout, Calling PostMultipartInputn);CGICDEBUGEND#endif /* CGICDEBUG */if (cgiParsePostMultipartInput() != cgiParseSuccess) #ifdef CGICDEBUGCGICDEBUGSTARTfprintf(dout, PostMultipartInput failedn);CGICDEBUGEND#endif /* CGICDEBUG */cgiFreeResources();return -1;(四)系统实现#ifdef CGICDE
26、BUGCGICDEBUGSTARTfprintf(dout, PostMultipartInput succeededn);CGICDEBUGEND#endif /* CGICDEBUG */ else if (cgiStrEqNc(cgiRequestMethod, get) /* The spec says this should be taken care of bythe server, but. it isnt */cgiContentLength = strlen(cgiQueryString);if (cgiParseGetFormInput() != cgiParseSucce
27、ss) #ifdef CGICDEBUGCGICDEBUGSTARTfprintf(dout, GetFormInput failedn);CGICDEBUGEND#endif /* CGICDEBUG */cgiFreeResources();return -1;(四)系统实现 else #ifdef CGICDEBUGCGICDEBUGSTARTfprintf(dout, GetFormInput succeededn);CGICDEBUGEND#endif /* CGICDEBUG */result = cgiMain();cgiFreeResources();return result
28、;(四)系统实现2.系统功能界面:四、项目分工与完成情况组号角色姓名学号班级任务及技术指标完成指标完成程度(%)个人贡献(%)1组长夏红光1810101086计科3班完成项目实验、实现开发板功能开发板功能实现100% 25% 副组长余振伟1810101086 计科3班 虚拟机配置、开发板初始化 初始化成功100% 15% 组号角色姓名学号班级任务及技术指标完成指标完成程度(%)个人贡献(%)1成员李文军1810101075 计科3班 完成虚拟机配置虚拟机正常运行 100%15% 成员李卓超 1810101077 计科3班Linux配置Linux正常运行 100%15% 成员张茂松1810101
29、089计科3班记录实验步骤 记录每个实验步骤 100%15%成员张帅羽1810101090计科3班整合文档 整合实验报告文档100%15%五、课程设计总结及收获(一)难点问题/关键技术/优势与特色图片特效的显示运用问题,各种Linux命令的相互使用和关联问题已经对C语言的理解问题。五、综合实训总结及收获(二)团队体会与收获成员间的相互协作必不可少,组与组的协作也不可少。就图片特效的显示运用起来的时候还是感到很棘手的,由于时间的关系,老师介绍了几种特效实现的方法,完成程序的编写不是困难,但实际上机运行时不断出现麻烦,有时程序本身不存在语法错误,也能够顺利运行,但是运行结果却显然是错误,这确实给我
30、们小组打击不小,同时也警醒了我,C语言平时一定多练啊。不过,以前学习时没有生产实习这么有趣,真正制作出东西才给我学习的意义与动力,毕竟这很有成就感。由于时间紧迫,还有许多的实现特效没完成,所以借助这次的生产实习我要好好完善我的电子相册,同时也好好理解巩固c语言的理论知识。同时这次生产实习也让我知道,只要你努力,任何东西都不会太难。期待下一次的生产实习,我会在这之前好好强大自己的能力的。五、综合实训总结及收获(三)个人体会与收获夏红光:从程序的设计到编写、画图、调试、修改、完善、到最后的实训报告,每个人都付出了时间和精力去做好自己的任务帮助队友,所以团队的合作和队友之间的相互协助非常重要。通过实
31、训让我们更深一步的对自己的专业,对自己的能力,对自己所学的有正确的认识,并且能在以后的学习工作中不断提高和完善自己。特别是讲C语言和进程通信中老师给了我们每个小组的几个小项目,让我学到了更多项目经验,这在学校之前是没有的五、综合实训总结及收获(三)个人体会与收获余振伟:通过网上查询我发现目前国内外这方面的人都很稀缺。一方面,是因为这一领域入门门槛较高,不仅要懂较底层软件(例如操作系统级、驱动程序级软件),对软件专业水平要求较高(嵌入式系统对软件设计的时间和空间效率要求较高),而且必须懂得硬件的工作原理,所以非专业IT人员很难切入这一领域;另一方面,是因为这一领域较新,目前发展太快,很多软硬件技
32、术出现时间不长或正在出现(如ARM处理器、嵌入式操作系统等),掌握这些新技术的人当然很少。嵌入式人才稀缺,身价自然就高,越有经验价格就越高。五、综合实训总结及收获(三)个人体会与收获李文军:本次综合实训是基于Linux操作系统、嵌入式开发技术开发的ARMLinux的物联网物流智能仓储。首先,我跟着老师的讲解搭建好了ubuntn平台。ARM+Linux路线,主攻嵌入式Linux操作系统及其上应用软件的开发目标。老师讲解了许多关于Linux和嵌入式的知识及前景(嵌入式发展现状及前景、嵌入式技术介绍嵌入式项目开发流程、移植交叉编译工具链)以及环境搭建。我了解到了从事嵌入式开发的好处。五、综合实训总结
33、及收获(三)个人体会与收获李卓超:通过此次课程设计,使我更加扎实的掌握了有关Linux技术方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终这次课程设计终于顺利完成了。在设五、综合实训总结及收获(三)个人体会与收获张帅羽:在知识的学习上可能并不会有很深入的了解,但是我们中大部分的人对于以后的就业选择有了一定明确的认识。五、综合实训总结及收获(三)个人体会与收获张茂松:实训对我们的帮助还是比较大的,有助于我们将理论知识与实践联系起来,理解的更加深刻。致 谢感谢老师们在炎炎夏日还在为给我们培训!