VX_SMP_CPU_EXPLICIT_RESERVE表示将指定CPU排除在“可使用CPU-Affinity属性的CPU池”之外。它是一个字符串,若填写“2 3 7”,则代表CPU2,3,7不能使用CPU-Affinity属性。即不能通过taskCpuAffinitySet()分配任务到这些CPU上运行。
当某个CPU被VX_SMP_CPU_EXPLICIT_RESERVE包含,唯一能够使他们恢复预留属性的方法是调用vxCpuReserve()。
4. 在多核AMP系统上配置VxWorks SMP
略
5. 启动VxWorks SMP
在WorkBench开启后会有一个默认的SMP的simulator,如图4所示:
图 4 WR自带的SMP虚拟机
点击连接后启动,启动过程如图5所示,代表目前已经进入VxWorks SMP系统以及当前CPU的个数。
图 5 SMP虚拟机启动过程
启动后在SHELL中输入i可以查看系统目前运行的任务,你会发现两个idle任务,它们分别运行在两个不同的CPU上。如图6所示。
图 6 SMP系统任务运行情况
6. VxWorks SMP编程
VxWorks单核编程(UP)与SMP编程在多数情况下是一样的。类似的,多数API在UP和SMP编程中是通用的。一些少数UP编程中的API不能在SMP中使用。与此同时,SMP中的一些API在UP中使用时表现的不是SMP中的效果,而是默认UP的效果,或者
压根就不能使用(例如,task spinlock 默认表现为task lock)。
由于SMP系统的特殊性,因此SMP编程需要特别注意,尤其是在互斥/同步机制上,在使用的时候需要充分考虑如何提高系统的性能。在VxWorks SMP系统中针对每个CPU都有一个idle任务,这在UP中是没有的。Idle任务是最低优先级(用户级任务是不能达到这么低优先级的)。当CPU进出idle状态时,idle任务会提供任务上下文,这可以用来监视CPU的利用率情况。
当CPU无事可做时,Idle任务的存在不会影响CPU进入睡眠状态(当电源管理开启时)。 可以使用kernelIsCpuIdle()或者kernelIsSystemIdle()这两个API查看一个指定CPU是否执行了idle任务或者所有CPU是否执行了idle任务。
【注意】不要对idle任务进行挂起、关闭、跟踪、改变优先级等一系列操作。
SMP的互斥/同步机制
SMP编程与UP编程最大的一个不同就是互斥/同步API的使用。有一些API在这两种编程中都可以使用,而有一些则不同。此外,UP编程中的一些隐式同步技巧(例如使用任务优先级替代显示同步锁等)在SMP中是不能用的。
与UP系统不同,SMP系统允许真正意义上的同时执行。即多个任务或多个中断可以同时执行。在绝大多数情况下,UP系统中与SMP系统中的互斥/同步机制(例如,信号量、消息队列等)是一样的。
但是,UP中的一些机制(例如,关中断、挂起任务抢占机制以此来保护临界资源等)在SMP中是不适用的。这是因为这些机制阻碍了同时执行的理念,降低了CPU的利用率,是的SMP系统向UP系统的回溯。
SMP编程与UP编程的一点不同是关于taskLock()和intLock()的使用上。SMP提供了以下互斥/同步锁机制进行替代: a. 任务级、中断级的spinlock; b. 任务级、中断级的CPU-specific; c. 原子操作;
d. 内存障碍(memory barrier)
7. spinlock互斥/同步机制
在UP(单核)编程中通过信号量的方法可以实现task的互斥与同步,在SMP系统中可以继续沿用信号量的机制,而spinlock则用于替换UP编程中使用taskLock()和intLock()的地方。
简介taskLock()和intLock()
通过taskLock()可以关闭系统的任务调度机制,调用taskLock()的任务将是唯一获得CPU运行资源的任务,直到这个任务调用taskUnlock()为止。intLock()与taskLock()类似,intLock()用于关闭中断,使得中断IRS无法执行,直到调用者调用了intUnlock()。
Spinlock具有“满内存障碍”属性
VxWorks spinlock的获取与释放操作具备“满内存障碍”属性。“满内存障碍”属性可
以使读、写内存操作按照严格的顺序执行而不受到多CPU的影响。因此,在申请与释放spinlock之间进行更新的数据可以保证“更新顺序”。
Spinlock的种类
Spinlock分为两种:中断级spinlock和任务级spinlock:
a. 中断级spinlock:可用于关闭本地CPU的中断。当任务调用中断级spinlock时,将
会关闭本CPU的任务抢占机制;
b. 任务级spinlock:用于关闭本地CPU的任务抢占机制。 (本第CPU指的是调用这些API的CPU)
Spinlock的作用以及使用说明
与信号量不同的是,当一个任务试图申请一个已被另一个任务占用的spinlock时,该任务并不会进入阻塞状态(pend),而是可以继续运行,它会进入一个简单的、紧凑的循环直到spinlock得到释放。
这种等待spinlock释放的状态可以用’spinning’和’busy waiting’来描述。在此,我们可以看出spinlock的优点和缺点。优点是:由于任务(或ISR)在等待spinlock的时候没有进入pend状态而是继续执行(一个简单的循环用于获取spinlock),这就避免了任务调用度以及上下文切换的消耗。缺点是:循环操作没有实际意义,会占用CPU资源。
因此,只有在必要时才使用spinlock。即占用spinlock的时间越短,spinlock的优势发挥的越明显(例如UP中的taskLock()和intLock())。否则,如果占用spinlock较长的时间,在UP编程中的缺陷(增加了任务和中断的响应时间)同样也会在多核编程中出现。
在一个CPU上获取spinlock,并不会影响另一个CPU上任务和中断的调度机制。当一个任务在持有spinlock的时候,该任务不能被删除。
(1) 中断级spinlock
任务和中断都可以获使用中断级spinlock。有两种中断级spinlock:确定性的和非确定性的。
【注意】在UP系统中,中断级spinlock与intLock()和intUnlock()的效果是一样的。
确定性中断级spinlock
确定性中断级spinlock的最大特点是:公平、确定性。Spinlock会分给第一个申请的中断或任务。申请的spinlock会屏蔽掉本地CPU的其他中断。如果是一个任务申请了中断用spinlock,本地CPU的任务调度机制将被停止直到该任务释放spinlock。Spinlock确保了任务可以独占CPU完成一些操作。其他CPU上的中断和任务不会受到干扰。确定性中断级spinlock的API全部包含在spinLockLib中,API如表1所示。
表 1 确定性中断级spinlock的API
API 描述 void spinLockIsrInit( 初始化确定性中断级spinlock spinlockIsr_t *pLock, /* pointer to ISR-callable spinlock */ int flags ) /* spinlock attributes */ void spinLockIsrTake( 获取确定性中断级spinlock spinlockIsr_t *pLock /* pointer to ISR-callable spinlock */ ) void spinLockIsrGive( 释放确定性中断级spinlock spinlockIsr_t *pLock /* pointer to ISR-callable spinlock */ )
非确定性中断级spinlock
非确定性中断级spinlock提供了更高的性能,但是当多个CPU试图同时申请一个spinlock时,它并不保证公平性和确定性。即非确定性中断级spinlock并不一定会把spinlock分配给第一个申请者。它的优势在于中断响应时间较短,即当CPU等待获取spinlock的时候,中断不会被屏蔽。API如表2所示。
表 2 非确定性中断级spinlock的API
API 描述 void spinLockIsrNdInit( 初始化非确定性中断级spinlock spinlockIsrNd_t * spin /* pointer to spinlock */ ) int spinLockIsrNdTake ( 获取非确定性中断级spinlock spinlockIsrNd_t * spin /* pointer to spinlock */ ) void spinLockIsrNdGive ( spinlockIsrNd_t * spin, int key /* return spinLockIsrNdTake */ ) (2) 任务级spinlock
任务级spinlock(中断不可调用该spinlock)可以关掉本地CPU的任务切换机制,使持有spinlock的任务独占CPU完成一些操作。同时,它不会对其他CPU上的任务调度机制产生影响。
【注意】SMP中任务级spinlock等同于UP编程中的taskLock()和taskUnlock() API如表3所示。
表 3 任务级spinlock的API
释放非确定性中断级spinlock value of API void spinLockTaskInit( 描述 初始化任务级spinlock
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新高中教育VxWorks SMP多核编程指南 (2)全文阅读和word下载服务。
相关推荐: