嵌入式VxWorks学习总结报告 互斥信号量与二进制不同点在于:①它仅用于互斥;②仅能由取(semTake ())它的任务释放;③不能在ISR 中释放(semGive ())。
优先级继承问题。优先级倒置发生在一个高优先级的任务被迫等待一段不确定时间,等待一个低优先级任务完成。VxWorks允许使用优先级继承算法,在互斥信号量中使用选项 SEM-INVERSION-SAFE ,将使能优先级继承算法,优先级继承协议确保拥有资源的任务以阻塞在该资源上的所有任务中优先级最高的任务的优先级执行,直到它释放所拥有的所有信号量,然后该任务返回到正常状态。因此这个“继承的高优先级”任务受到不会被任何中间优先级任务抢占的保护。
删除安全问题。另一个互斥问题涉及到任务删除。在一个受信号量保护的临界区,经常需要保护在临界区执行的任务不会被意外地删除。删除一个在临界区执行的任务可能引起意想不到的后果,造成保护资源的信号量不可用,可能导致资源处于破坏状态,也就导致了其他要访问该资源的所有任务无法得到满足。
原语 taskSafe()和taskUnsafe ()提供了防止任务被意外删除的一种方法。同时互斥信号量提供了选项SEM-DELETE-SAFE ,使用这个选项,每次调用semTake ( )时隐含地使能了taskSafe(),当每次调用semGive ()时隐含地使能了taskUnsafe ()这种方式,任务得到信号量时得到不会被删除的保护。
递归资源访问问题。互斥信号量能够被递归地获得。这意味着信号量能够被一个拥有该信号量的任务在该信号量最终被释放之前多次获取。递归对于满足一些子程序即要求能够相互调用但是也要求互斥访问一个资源非常有用。这种情形是可能的,因为系统需要跟踪哪一个任务当前拥有信号量。
(3)计数器信号量
计数器信号量是实现任务同步和互斥的另一种手段。计数器信号量除了像二进制信号量那样工作外,还保持对信号量释放次数的跟踪。信号量每次释放,计数器加一,每次获取,计数器减一。当信号量减到0 时,试图获取该信号量的任务被阻塞。
正如二进制信号量,当信号量释放时,如果有任务阻塞在该信号量阻塞队列上,那么任务解除阻塞;但是如果信号量释放时,没有任务阻塞在该信号量阻塞队列上,那么计数器加一。
VxWorks的信号灯操作库有semLib、semBLib、semCLib、semMLib,分别对应通用信号灯与二进制、计数型和互斥信号灯的操作。库中信号灯相关的函数有:
semBCreate() semCCreate() semMCreate() semGive() semTake()
创建一个二进制信号灯 创建一个计数型信号灯 创建一个互斥型信号灯 释放信号灯 获取信号灯
8
嵌入式VxWorks学习总结报告 semFlush()
使所有被该信号灯阻塞的任务脱离阻塞状态
信号量在实现多任务间的通信、同步和互斥中发挥着重要的作用。因此,深入理解和正确使用VxWorks的信号量,可以提高实时系统中多任务间通信的效率。
2.3 VMWare上安装VxWorks
2.3.1 概述
VxWorks是风河公司(Windriver)开发的实时操作系统之一,以其优秀的可靠性、实时性及内核的可裁减性,被广泛应用于通信、军事、航天、航空等关键行业领域。VxWorks可以适用于多种硬件体系结构,其中也包括大家日常都可以接触到的PC体系结构。
VMWare 是被广泛应用虚拟PC系统软件,他可以提供基于Inetl CPU的虚拟PC系统环境,包括CPU、BIOS、硬盘和其他外围硬件设备,使您可以在一台PC机上同时运行两个操作系统。VMWare对外围硬件设备的模拟,屏蔽了不同设备型号的差异,在硬件环境发生改变时(硬件型号变化),对于运行于VMWare上的操作系统影响很小(无须安装新的驱动程序)。
本文以下部分将介绍如何在VMWare软件提供的虚拟环境上安装VxWorks操作系统。由于可以在同一台PC机上建立完整VxWorks开发环境,所以可以有效地降低项目初期的开发成本,也可以为初学者提供一个接近于真实的模拟环境。
需要注意的是,由于VMWare本身是运行在Windows操作系统之上的,而VxWorks运行于VMWare之上,所以这个模拟环境无法保证VxWorks的实时特性。因此,Vmware上的嵌入式VxWorks操作只是单机演示作用,可以快速方便的得到一些实验性结果,并不能彻底实现其他诸如实时性测试等方面的目标。
2.3.2 准备工作
我们假设您有一台普通配置的PC机,并安装了Windows2000操作系统。其次您需要安装Tornado 2.2 for pcPentium开发环境。缺省安装的Tornado 2.2 for pcPentium可能不包括pcPentium的BSP组件,但该组件可以从风河公司(Windriver)的网站免费下载。
我们将在下文以WIND_BASE引用Tornado的安装路径。
其次是要安装VMWare软件,这里我们使用4.0的版本。如果您还没有该软件,也可以从VMWare的网站下载试用版。
9
嵌入式VxWorks学习总结报告 最后,由于Tornado自带的PC-NET网卡驱动有问题,所以需要下载AMD的PC-NET网卡的VxWorks系统驱动,可以从AMD网站免费下载。
一张1.44M的软盘,用于制作系统引导盘。
准备并安装好以上软件后,就可以开始下一步的工作了。
2.3.3 开始安装
(1)编译网卡驱动程序
VMWare为运行于其上的操作系统提供虚拟网卡支持,该网卡类型即为AMD的PC-NET。实际上,在Tornado开发包中已经包含了该类型网卡的驱动程序,但经过测试,对于VMWare无法正常工作,所以您需要从AMD的网站下载最新的驱动程序。
下载得到的是一个可执行的安装程序,运行该程序将得到一个压缩包和一个帮助文件,按照该帮助的要求,将压缩包直接释放到Tornado目录下。如果提示是否允许覆盖文件,则选择允许。
此后按如下步骤完成驱动程序的编译和替换:
?
打开一个控制台窗口,运行批处理程序:
$(WIND_BASE)\\host\\x86-win32\\bin\\ torVars.bat;
重新定位到$(WIND_BASE)\\target\\src\\drv\\end目录,运行:
?
make CPU=PENTIUM tool=gnu ln97xend.o
其间会产生一些警告,但这不会影响我们的工作。
?
重新定位到$(WIND_BASE)\\target\\lib\\pentium\\PENTIUM\\common目录,并将上一步生成的文件ln97xend.o复制到此目录下。备份此目录下的文件libdrv.a;
? 运行命令arpentium -d libdrv.a ln97xEnd.o,删除libdrv.a中原有的ln97xEnd模块,然后再运行命令:
arpentium -ra iOlicomEnd.o libdrv.a ln97xEnd.o
将我们刚刚创建的新模块添加进去。
到此有关网卡驱动的设置就完成了。注意不要关闭这个窗口,后面还要使用。
(2)修改配置文件
10
嵌入式VxWorks学习总结报告 在这一节中,我们要修改编译VxWorks的配置头文件Config.h中定义的一些参数,使编译出来的系统引导程序和VxWorks的映象符合我们的要求;同时还要修改sysLn97xEnd.c这个文件,以使系统的网络功能正常运行。
?
定位目录到$(WIND_BASE)\\target\\config\\pcPentium并打开该目录下Config.h文件;
我们首先要修改VxWorks的启动参数。先查找到定义
DEFAULT_BOOT_LINE宏的地方,修改预处理条件CPU == PENTIUM分支下的定义如下:
#define DEFAULT_BOOT_LINE \\
\i(0,0)your_host_name:d:\\\\vxWorks h=192.168.80.169 e=192.168.80.254 u=target pw=vxworks tn=target\
?
其中:
?
lnPci(0,0)指定了使用第0个网卡和第0个处理器,lnPci这个标识会因为使用的驱动程序不同而有所不同,但这里用lnPci就可以了; your_host_name指定您的主机的名字,使用Windows系统的主机名就可以;
d:\\\\vxWorks指定了VxWorks映象下载的完整路径;
h=192.168.80.169是主机的IP地址,就是您当前正在使用的系统的IP地址;
e=192.168.80.254是目标机的IP地址,也就是未来VxWorks操作系统的IP地址,您只要任意指定一个不冲突的IP地址即可,这里我们假设您的目标机IP地址和主机IP地址在同一个网段内;
?
? ?
?
? u=target指定了FTP服务器的用户名,这个FTP就是用来下载VxWorks映象的,后面还会提到;
pw=vxwroks是用户名对应的口令;
tn=target指定目标机的名字,任意指定即可;
? ?
您可以参考Tornado自带的手册以获取更多信息;
?
下面我们要指定使用什么样的网卡驱动程序。首先查找“Network driver options”这段文字,之后您可以看到在该注释后面定义了一系列的有关网卡驱动的宏定义。注意保证INCLUDE_END和
INCLUDE_LN_97X_END这两个宏处于定义状态(define),其他的宏都处于未定义状态(undef);
? 缺省情况下,VxWorks系统是不接受外部输入设备(如键盘)的输入,也不向外部输出设备(如显示器)输出数据。为了便于调试,我们必
11
嵌入式VxWorks学习总结报告 须改变它的这种缺省状态。我们查找定位宏INCLUDE_PC_CONSOLE,然后保证其处于定义状态(define)即可;
?
到此为止,对config.h文件的修改就完成了,保存修改,然后再打开同一目录下的sysLn97xEnd.c文件;
这一步修改的目的是要使网卡正常工作。我们先定位到“memory-mapped IO base”这段文字,然后将其前面的参数由
pciRsrc[endUnit].bar[1]修改为NONE,这样就可以了。最后别忘了保存。
?
到此为止,全部的修改工作都完成了,下一步就可以开始编译连接了。
2.3.4 编译程序
这一节我们要编译生成bootrom引导程序和VxWorks运行映象。
?
打开您的Tornado开发工具,在Build菜单下选择Build Boot ROM,弹出如下对话框:
在BSP列表中选择pcPentium,而在Image to build列表中分别选择bootrom和gnu。完成选择后,点击OK按钮就开始引导程序的编译了。编译产生的文件bootrom将保存在$(WIND_BASE)\\target\\config\\pcPentium目录下。
?
编译生成bootrom后,还要创建一个VxWorks映象(image),也就是VxWorks操作系统本身的代码。
o 创建一个“bootable VxWorks image”的工程;
12