哈工大VxWorks嵌入式作业

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

VxWorks下串口收发程序设计1.引言VxWorks操作系统是美国温瑞尔(WindRiver)公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。VxWorks作为一个优秀的操作系统实现了比其他实时操作系统更好的有效性、商用性、可裁减性以及互操作性,被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。本文利用VxWorks进行串口收发程序的设计,是VxWorks与外界进行通信的基础操作。2.VxWorks系统结构VxWorks由一个基于优先级中断驱动的多任务调度内核和设备管理、文件管理、网络扩展及兼容POSIX协议的运行接口组成,通过二进制信号量、互斥信号量、计数器信号量、管道、消息等支持任务间灵活通信。VxWorks采用类似Unix的进程调度算法,但是考虑到其实时性,VxWorks采用段式或段页式管理来实现访问逻辑空间,一般不采用虚拟内存,也即无缺页中断。专用BSP的编写是实现系统移植的重点,BSP主要用来完成VxWorks对专用目标板的支持。包括硬件初始化、中断处理和产生、硬件时钟管理、本地和总线内存空间映射,同时也包含定制VxWorks映像,如图1所示。它贯穿着硬件级,操作系统级,应用程序级三层。按照操作系统相应规范编写对硬件的驱动,然后挂接于VxWorks的内核中与VxWorks一起为应用程序级提供服务。硬件无关的软件应用工具I/O系统VxWorks库TCP/IP文件系统操作系统内核硬件相关的软件SCSI控制器版级支持包BSP网络驱动程序硬件SCSI控制器串口控制器定时器网卡图表1VxWorks系统结构图3.VxWorks的串口收发程序基本原理VxWorks提供了一个快速灵活的与ANSIC兼容的I/O系统,包括UNIX标准的BasicI/O(creat(),remove(),open(),close(),read(),write(),andioctl()),BufferI/O(fopen(),fclose(),fread(),fwrite(),getc(),putc())以及POSIX标准的异步I/O。VxWorks包括以下驱动程序:网络驱动、管道驱动、RAM盘驱动、SCSI驱动、键盘驱动、显示驱动、磁盘驱动、并口驱动等。串口在嵌入式系统当中是一类重要的数据通信接口,其本质功能是作CPU和串行设备间的编码转换器。当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位;在接收数据时,串行的位被转换为字节数据。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。串口通信的优点是开发简单,在传输数据量不大、要求速度不高而传输距离较大的通信场合得到广泛应用。在VxWorks中,将I/O系统设计成为任何类型的设备提供一个简单、统一、独立于设备的接口,任何对于串口的操作都可以视为对一个文件的操作,而不必了解串口设备或程序驱动实现的细节。在串口通信软件的设计中,当串口初始化完成后,在使用之前利用open()打开相应串口,然后进行配置。VxWorks提供终端和伪终端设备驱动。Tty驱动针对实终端,pty针对仿真终端的程序。Tty设备有两种操作模式:raw模式和line模式。在raw模式下,每个刚从设备输入的字符对读者都是有效的;在line模式下所有输入字符被存储,直到NEWLINE字符输入。设备选项字使用带FIOSETOPTIONS功能的ioctl()程序来设置。配置完成后,依据串口打开时的读写标志,调用函数write()、read()对串口进行只读操作、只写操作或同时进行读写操作。为提高数据接收的实时性,可采用中断方式,利用VxWorks提供的select函数的事件触发机制,将读串口的任务阻塞使其一直等待数据,当有数据来到的时候该任务会立刻自动响应,提高系统的实时性。4.环境设置环境配置的基本步骤如下:(1)修改通用配置文件\\Tornado\target\config\pc486\config.h。在config.h文件中加入以下宏定义:#defineINCLUDE_WDB#defineINCLUDE_WDB_TTY_TEST#undefWDB_COMM_TYPE#defineWDB_COMM_TYPEWDB_COMM_SERIAL/*定义通信方式为串口联结*/#defineWDB_TTY_CHANNEL1/*通道号*/#defineWDB_TTY_BAUD9600/*串口速率,可设置至38400*/#defineWDB_TTY_DEV_NAMEtyCo/1#defineCONSOLE_TTY0#defineDEFAULT_BOOT_LINEfd=0,0(0,0)hostname:/fd0/vxWorks\h=主机ipe=目标机ipu=主机上的登录用户名(2)在Tornado集成环境中执行菜单命令ProjectMakePC486CommonTargetsclean删除以前生成的文件,执行菜单命令ProjectMakePC486BootRomTargetsbootrom_uncmp,编译链接生成bootrom_uncmp。再选择VxWorksTarget,编译生成vxworks;(3)拷贝\\Tornado\target\config\pc486\bootrom_uncmp至\\Tornado\host\bin下(4)重命名文件bootrom_uncmp为bootrom;(5)准备一张已格式化的空盘插入软驱;(6)在目录\\Tornado\host\bin下执行命令mkboota:bootrom;(7)拷贝\\Tornado\target\config\pc486\VxWorks至软盘;(8)将系统制作盘插入目标机软驱,载入VxWorks系统。5.程序设计5.1在程序中载入头文件#includevxWorks.h#includesioLib.h#includeintLib.h#includetaskLib.h#includeerrno.h#includetime.h#includetimers.h#includestdio.h#includestat.h#includecacheLib.h#includestring.h#includeiv.h#includesemLib.h#includeintLib.h#includelogLib.h#includeioLib.h#includedrv/serial/pcConsole.h#includesioLib.h#includertc.h#includes3c2410.h5.2打开串口intopen_com1(void)//打开串口1函数{intsfd;//串口设备文件描述符sfd=open(/tyCo/0,0_RDWR,0);//打开串口并返回串口设备文件描述符if(sfd==ERROR)//如果不能打开串口1则打印出错信息printf(Youcan'topenportcom1!);}5.3串口发送函数inttty_send(intsnum){intfd;intbytes_out;charbuff[]=$GGCX,090821,013149,31.93083997,118.78616720,000029.8,072.069,-00.068,*24\r\n;chartyName[20];charconsoleName[20];sprintf(tyName,%s%d,/tyCo/,snum);strcpy(consoleName,tyName);fd=open(consoleName,O_RDWR,0);ioctl(fd,FIOSETOPTIONS,OPT_RAW);ioctl(fd,FIOFLUSH,0);setBaud(fd,115200);setOption(fd,8,1,0);while(1){bytes_out=write(fd,buff,strlen(buff));taskDelay(10);}close(fd);return1;}5.4串口接收数据inttty_receive(intrnum){inti,j;intfd,width;intbytes_in;charbuf[100];structfd_setreadFds;chartyName[20];charconsoleName[20];sprintf(tyName,%s%d,/tyCo/,rnum);strcpy(consoleName,tyName);fd=open(consoleName,O_RDWR|O_NONBLOCK,0);ioctl(fd,FIOSETOPTIONS,OPT_RAW);ioctl(fd,FIOFLUSH,0);setBaud(fd,115200);setOption(fd,8,1,0);while(1){FD_ZERO(&readFds);FD_SET(fd,&readFds);width=fd+1;if(select(width,&readFds,NULL,NULL,NULL)==ERROR)returnERROR;if(FD_ISSET(fd,&readFds)){while((bytes_in=read(fd,buf,100))0){for(i=0;ibytes_in;i++)printf(%c,buf[i]);}}}close(fd);return1;6.结论本文简单介绍了VxWorks的组成结构与VxWork编写关于串行设备驱动程序的一般模式,详细给出了设计步骤与部分代码。包括设备的初始化编程,入口函数的编程以及程序实现的编码等。由于课堂上老师对嵌入式系统的许多程序都进行了演示与运行,但真正自己动手用VXworks去加载程序时,才发现完整的运行一个程序并非易事。主要的原因是之前没有使用过这样的软件,关于它的使用教程也没有像C或者Mathlab那样在网上很容易找到,周围的同学对这个软件也不是很熟悉。后来花了一定的时间在网上找到了相关的资料之后,运行了教学课件里dome里的几个例子,对VXworks的使用才有了一定的了解。没有的时候觉得挺难,上手了之后还是挺容易的,特别是对它的原理有了一定的了解之后。VxWorks下串口收发程序设计,在参照已有的相关资料下,对程序进行了理解和相应的修改。在这个过程中,加深了我对VxWorks相关语句和命令的理解,对串口数据的发送和接受原理及编程方法也有了更深的了解。感觉嵌入式这门课跟VxWorks这个软件一样,入门还是挺简单的,但要做到精通,感觉很难。

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功