![](https://csdnimg.cn/release/download_crawler_static/12320267/bg8.jpg)
压根就不能使用(例如, 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 的获取与释放操作具备“满内存障碍”属性。 “满内存障碍”属性可