inUnlock()与intLock()注意

 

VxWorks提供两个重要API

1intLock():使中断禁止

2intUnlock():开中断

可以用intLock/intUnlock提供最高级别的互斥机制以保护临界区域不被打断,例如:

intLock()禁止中断后,当前执行的任务将一直继续,中断处理和任务调度得不到执行,直到该任务主动调用intUnLock解锁中断为止。对于intLockunLock的使用,我们要注意如下几点:

1)不要在中断禁止期间调用vxWorks系统函数,否则有可能意外使能中断,违反临界代码的设计意图。另外,intLock也不能屏蔽调度,如果在中断禁止代码区使用系统调用,就可能出现任务调度,其他任务的运行可能会解锁中断;

2)中断禁止对系统的实时性有很大的影响,在解决执行代码和中断处理互斥问题才可使用,并且应使中断禁止时间尽可能的短。对于任务间的互斥问题,可以使用taskLock()taskUnLock()来解决;

3)有些CPU中断是分级,我们可以用intLockLevelSet()intLockLevelGet()来操作中断闭锁的级别。缺省情况下,taskLock禁止所有等级的中断。

WARNINGS

Do not call VxWorks system routines with interrupts locked. Violating this rule may re-enable interrupts unpredictably.

The routine intLock( ) can be called from either interrupt or task level. When called from a task context, the interrupt lock level is part of the task context. Locking out interrupts does not prevent rescheduling. Thus, if a task locks out interrupts and invokes kernel services that cause the task to block (e.g.,taskSuspend( ) ortaskDelay( )) or that cause a higher priority task to be ready (e.g.,semGive( ) ortaskResume( )), then rescheduling occurs and interrupts are unlocked while other tasks run. Rescheduling may be explicitly disabled withtaskLock( ). Traps must be enabled when calling this routine.

intLock能从中断或任务调用,当从任务调用的时候,中断锁是任务切换的一部分,因此锁中断并不能阻止任务调度。如果一个任务锁定了中断,并调用内核服务,造成任务阻塞(例如,taskSuspend()的任务或taskDelay())或导致更高的优先级的任务就绪(例如,semGive()或taskResume()),则任务会重新调度,中断被解锁同时运行其他任务.

 

intLock和taskLock 一样,当调用者进入READY、PEND、SUSPEND 这样的状态而主动让出CPU 时,VxWorks 会重新使能中断,并调度到其它任务

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值