vxworks基础知识--更新

      timex,我们可以在shell下调用timex myFunc,myArg1,myArg2,...(最多8个参数),就可以测量myFunc的执行时间,但如果myFunc的执行时间过短(意味着误差比较大),timex会提示我们使用timexN重测以求精确结果。

     我们可以把任务的状态分为两类,READY、DELAY和PEND称为任务的基本状态,它们是互斥的,也就是一个任务同一时刻有且只能有一个基本状态。其余的状态我们称之为?附加?状态(+S、+T、+I),附加状态可以和基本状态相组合得到任务的实际状态,几种附加状态的含义如下:??+S表明任务被挂起,不能继续运行,它可以和任何基本状态组合。??+T表明任务带有超时,通常是指任务在等待资源时不是一直等待,而是设置了超时,因此+T只能和PEND组合。??+I表明任务发生了优先级继承,优先级继承的细节将在下一章述。这种附加
状态可以和任何基本状态组合。

 

      局部变量是分配在栈空间上的,而每个任务的栈空间是隔离的,因此就可以避免重入问题VxWorks提供了锁住中断的API:intLock,在锁住中断后,系统不会响应中断。我们可以使用intLock来达到互斥的效果,因为系统的tick来自于定时中断,当intLock之后,tick也因为定时中断得不到执行而失效了,因此所有的处于DELAY态的任务,都没有机会进入READY了,也就不会发生高优先级任务的抢占了。

      一个任务就是一个独立运行的运行环境,这个环境的一个重要部分就是任务堆栈,每个任务都有自己独立的栈空间,任务的栈大小是在创建时指定的。函数中的局部变量都是在栈空间中分配,当函数层层调用时,局部变量消耗的栈空间会层层叠加。VxWorks提供了shell命令checkStack可以检查一个任务的堆栈的使用情况

     taskDelay(0)来触发调度器的运行,taskDelay(0)会将当前任务置于READY队列的尾部,这样同优先级的其它READY任务就可以得
到运行,如果同优先级没有其它READY任务,也没有更高优先级的任务需要运行,那么当前任务继续运行。轮转的时间片单位也是一tick,VxWorks API-kernelTimeSlice可以设置一个时间片为多少个tick,一个任务会持续运行一个时间片,然后轮转到同级的其它任务。设置kernelTimeSlice(0)会禁止系统的时间片轮转调度,这也是VxWorks缺省的调度策略。

 

       一般来说当我们调用taskLock之后,即使有更高优先级任务进入READY态需要运行,VxWorks也不会抢占当前任务,但如果调用taskLock的任务自身由于某些原因不能继续运行,比如进入DELAY或PEND状态,那么VxWorks还是会调度到其它可以运行的任务semTake带有一个额外的参数timeout来设置超时时间,单位为tick,用于当不能取得信号量时最长等待多长时间,我们也可以设置不等待(timeout为0),或者无限等待(timeout为-1)创建时我们可以指定它的初始状态:0或者1。如果状态为1,semTake就会将其状态改为0,状态为0,semTake就会阻塞或者超时返回;同样的,状态为0时,semGive可以将其从0改为1,状态为1时,semGive直接返回失败。在VxWorks中分别将0和1这两个状态称为EMPTY和FULL。


        互斥信号量,简称互斥量,顾名思义就是专门用作互斥的信号量,互斥量引入了owner任务的概念,每个互斥量被take之后,其owner就是take它的任务。然后这个任务可以多次take,不会再阻塞,这就解决了程序中嵌套take的问题由于互斥量存在owner任务,所以需要用到任务上下文,那么在中断服务程序中就绝对不可以使用互斥量,这一点需要切记。

 

1.中断上锁(中断上锁时不要调用VxWorks操作系统函数。强行使用会导致意外的中断)
对于互斥使用最强有力的办法是禁止中断。这种上锁的方法保证了对CPU的单独
访问。
funcA()

int lock=intLock();
    /*禁止中断的代码临界区域*/
intUnlock(lock);
}
    但是这种方法涉及到使用中断服务程序的互斥,由于它在上锁期间阻止系统对外部事件响应,因此对于大部分实时系统,不能作为一种通用的互斥方法。一旦要求紧急响应外部事件时,此时的中断响应时间将难以接受。然而在使用中断服务程序时,有时又需要中断上锁,在这种情况下应保持中断上锁时间尽量短。

 

2.抢占上锁(临界区代码禁止队塞。否则,抢占将被重新激活.)
    当不允许其他任务抢占当前执行任务时,禁止抢占提供了一种较小限制性的互斥,此时,中断服务程序仍然能够执行。
funcA()
{
taskLock
    /‘禁止中断的代码临界区域*/
taskUnlock
    但是使用这种方法可能会造成系统实时性得不到充分的保证。尽管高优先级任务本身没有涉及到临界区,然而该任务只能在上锁任务离开临界区后才能够执行,由于使用该种互斥机制简单,因此使用时确保较短的响应时间。

 

所有中断服务程序使用相同的中断堆栈。该堆栈由系统启动时根据指定配置参数来定位和初始化。为能够处理最坏情况下的中断嵌套,必须分配足够大的中断堆栈空间。调用中断服务程序函数存在着很多的限制。例如,在应用中断服务程序时不能使用printf( ), malloc()和semTake()函数,但是可以使用semGive( ), logMsg( ), msgQSend( )和

bcopy{)这样的函数。详细信息请参考“2.6.4中断服务程序特殊限制”。

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值