新闻中心

EEPW首页 > 测试测量 > 设计应用 > 基于PC/104的1553B总线测控系统的设计与实现

基于PC/104的1553B总线测控系统的设计与实现

作者:西北工业大学自动化学院 张晓斌 肖立恒 郑先成 时间:2008-07-29 来源:中电网 收藏

  底层设备驱动配置
  驱动程序为硬件平台和应用软件间提供一个固定接口的软件层,应用程序必须通过驱动程序才能与硬件进行数据通信。而驱动程序的编写又与操作系统密切相关,具体的操作系统对驱动的要求有所不同,本设计的底层驱动和操作系统VxWorks及任务关系图如图5所示。根据本系统的实际需要,编写了与VxWorks系统密切相关的底层设备驱动。

本文引用地址:https://www.eepw.com.cn/article/86354.htm

  首先介绍1553B通讯卡的驱动配置。本系统选用的1553B通讯卡有两种板卡访问方式:内存映射和I/O访问。I/O寻址采用专门的指令,编程缺乏灵活性,并且每次只能传送单个字节;而内存映射方式指令丰富,编程方便、硬件节省,便于实现快速交换数据。故选用内存映射方式,PC/104可以映射的空间为0xC8000~0xEFFFF,选取内存映射基地址为0xD0000。同时INT引脚通过跳线选择IRQ9。软件设置如下:

  1)调用setup_fw.c将固件库源文件F002p.dat生成与ASF-P104卡匹配的Firmware.h(固件数据结构)文件,为板卡硬件提供匹配的接口定义信息;
  2)在sbs_sys.h文件中添加#define VXWORKS和#define NO_FILE_SYSTEM语句行,设置操作系统信息;
  3)在dev_cfg.h文件中按如下设置定义设备配置信息:


  配置好软件设置后就是1553驱动程序的实现,即完成设备驱动函数的编写。在编写函数之前,需要定义驱动号以及设备的描述符,这在头文件中实现,如下所示:
 

}M1553_DEV; /*1553设备描述符*/
头文件定义完毕就可以编写函数了,以编写M1553Drv( )函数为例。M1553Drv( )函数调用iosDrvInstall( )安装设备的驱动例程。它在设备驱动程序表中为设备分配一个条目,并在其中填入此设备xxCreate( ),xxDelete( ),xxOpen( ),xxClose( ),xxRead( ),xxW rite ( )和xxIoctl( )等函数的地址。函数实体如下:

 
  一一编写其他的1553设备驱动函数M1553DevCreate( ),M1553Open( ),M1553Read( )和M1553Write( )以及中断服务程序M1553Int( )。

  以上为1553B卡的底层驱动编写,ADT600与之类似,只是头文件有差异,同理编写设备函数ADC_InitializeBoardSettings(),ADC_DigitalToSBS(),ADC_SetChannel(),ADC_StartConversion(),ADC_ConversionDone()和ADC_ReadData()。至此,设备驱动配置完成,将驱动程序加载至应用程序,上层程序代码就可以直接调用这些底层驱动函数进行编程。

  任务设计
  VxWorks是一个实时多任务操作系统,因此根据系统的功能模块要求,将应用程序分割成若干个独立的任务,使CPU通过操作系统来调度多个任务,轮番服务于一系列任务中的一个,使得应用程序的设计大大简化,并使程序的结构模块化、层次化。同时,使用了实时内核,所有时间要求苛刻的事件都可以尽可能快地得到处理。


  任务划分的好坏直接影响到系统的性能。将一个实时应用问题分解为多个任务,可以加快执行速度,且有效地利用系统资源。但是,过度地分解任务,将会使系统中有大量的任务,需频繁地进行任务的切换,任务之间还要进行很多同步和互斥控制,将增加系统服务工作,降低系统的速度和有效性。因此,划分任务时必须进行各种综合平衡和折衷,有时将两个操作合并在一起处理效果好些,但有时必须分开处理。这都依赖于实时应用的特性。

  根据系统功能需求,主任务划分如下,任务间总体上采用优先级抢占机制进行调度,各任务功能及优先级的划分如表2所示。PC/104优先接受来自飞机控制设备的命令字,然后执行负载控制任务,等待控制任务释放信号量后,程序就执行数据采集及发送任务,通讯监控任务对数据的接发进行实时监控,确保无信息的丢失,更重要的是,第一时间传递发控设备的控制命令,若启动重发机制之后仍然接受不到信息则会报错。而硬件初始化及自检测任务只是在主程序开始时调用,由于优先级的限制,只有等待再次软启动之后才会再次执行。

  除了优先级的抢占外,主要任务间还通过设置信号量进行二次调度,确保任务的连续正确执行及资源的合理分配,优化程序结构。在主程序引导函数ProgStart( )中,建立了2个二进制信号量和1个互斥信号量:semCON,semSEND,currNodeSemId。semCON信号量用于数据接收任务和监控任务的信息传递,主要是数据的超时重发机制监控;semSEND信号量用于数据采集任务和数据发送任务的信息传递;currNodeSemId信号量用于数据采集监控任务中数据采集的完整性而设立的信号量,避免通讯任务抢占临界资源以及调用不合理而产生"死锁"现象。其中,2个二进制信号量创建时为空(SEM_EMPTY),处于不可用状态,高优先级任务执行semGive()释放后变为满(SEM_FULL),变为可用状态,供低优先级任务执行semTake()使用。互斥信号量currNodeSemId创建时,为了避免优先级倒置的情况以及为任务提供删除安全,联合使用了SEM_Q_PRIORITY、SEM_INVERSION_SAFE、SEM_DELETE_SAFE选项联合使用,使用按位或操作,程序代码如下:

  currNodeSemId=semMCreate(SEM_Q_PRIORITY|SEM_INVERSION_SAFE|SEM_DELETE_SAFE)
程序最后执行ProgStop()结束主程序,删除创建的任务并释放信号量资源。因为程序中使用了互斥信号量,并启动了互斥信号量的任务删除保护功能,所以在删除任务之前,必须先成功占有互斥信号量。先删除任务,再删除信号量。

结束语

  本文主要讲述了1553B总线系统的设计及其在VxWorks下的软件开发过程。实际中,建立了地面最小实验系统,经过联机调试,系统运行正常,系统具有很好的实时性和稳定性,达到了预期效果。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 下一页

评论


相关推荐

技术专区

关闭