哈工大VxWorks嵌入式作业_第1页
哈工大VxWorks嵌入式作业_第2页
哈工大VxWorks嵌入式作业_第3页
哈工大VxWorks嵌入式作业_第4页
哈工大VxWorks嵌入式作业_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VxWorks下串口收发程序设计1.引言VxWorks操作系统是美国温瑞尔〔WindRiver〕公司于1983年设计开发的一种嵌入式实时操作系统〔RTOS〕,是嵌入式开发环境的关键组成局部。良好的持续开展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。VxWorks作为一个优秀的操作系统实现了比其他实时操作系统更好的有效性、商用性、可裁减性以及互操作性,被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。本文利用VxWorks进行串口收发程序的设计,是VxWorks与外界进行通信的根底操作。2.VxWorks系统结构VxWorks由一个基于优先级中断驱动的多任务调度内核和设备管理、文件管理、网络扩展及兼容POSIX协议的运行接口组成,通过二进制信号量、互斥信号量、计数器信号量、管道、消息等支持任务间灵活通信。VxWorks采用类似Unix的进程调度算法,但是考虑到其实时性,VxWorks采用段式或段页式管理来实现访问逻辑空间,一般不采用虚拟内存,也即无缺页中断。专用BSP的编写是实现系统移植的重点,BSP主要用来完成VxWorks对专用目标板的支持。包括硬件初始化、中断处理和产生、硬件时钟管理、本地和总线内存空间映射,同时也包含定制VxWorks映像,如图1所示。它贯穿着硬件级,操作系统级,应用程序级三层。按照操作系统相应标准编写对硬件的驱动,然后挂接于VxWorks的内核中与VxWorks一起为应用程序级提供效劳。图表SEQ图表\*ARABIC1VxWorks系统结构图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_NAME"tyCo/1"#defineCONSOLE_TTY0#defineDEFAULT_BOOT_LINE"fd=0,0(0,0)hostname:/fd0/vxWorks\h=主机ipe=目标机ipu=主机上的登录用户名"(2)在Tornado集成环境中执行菜单命令Project>MakePC486>CommonTargets>clean删除以前生成的文件,执行菜单命令Project>MakePC486>BootRomTargets>bootrom_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在程序中载入头文件#include"vxWorks.h"#include"sioLib.h"#include"intLib.h"#include"taskLib.h"#include"errno.h"#include"time.h"#include"timers.h"#include"stdio.h"#include"stat.h"#include"cacheLib.h"#include"string.h"#include"iv.h"#include"semLib.h"#include"intLib.h"#include"logLib.h"#include"ioLib.h"#include"drv/serial/pcConsole.h"#include"sioLib.h"#include"rtc.h"#include"s3c2410.h"5.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;i<bytes_in;i++) printf("%c",buf[i]); } } } close(fd); return1;6.结论本文简单介绍了VxWorks的组成结构与VxWork编写关于串行设备驱动程序的一般模式,详细给出了设计步骤与局部代码。包括设备的初始化编程,入口函数的编程以及程序实现的编码等。由于课堂上老师对嵌入式系统的许多程序都进行了演示与运行,但真正自己动手用VXworks去加载程序时,才发现完整的运行一个程序并非易事。主要的原因是之前没有使用过这样的软件,关于它的使用教程也没有像C或者Mathlab那样在网上很容易找到,周围的同学对这个软件也不是很熟悉。后来花了一定

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论