版权声明:玛雅实时操作系统(MY-RTOS)软件及其说明文档由 欣欣学习网 版主 Stoneway QI 创作,作者保留其版权。任何人可以免费在其产品设计或著作中使用或引用该软件及其说明文档,但要求保留原作品当中的版权声明,并注明引用段落的出处。 -- Stoneway QI 主页: http://www.xxworks.com 邮箱: Stonewayqi@hotmail.com 玛雅实时操作系统中避免任务间在资源使用上发生冲突的机制是“互斥量”。任务在使用公有资源之前,首先要锁定相关的互斥量,而在停止使用之后,要解锁相关的互斥量。一个任务在试图锁定已被其它任务锁定的互斥量时,将进入等待状态,直到该互斥量被解锁或因超时而退出等待。
在使用互斥量之前,首先要定义互斥量。在玛雅系统中,要求互斥量被成全局变量,或者静态局部变量。互斥量的定义中要赋予其初值。互斥量共有4个成员,前两个成员的初值要求是该互斥量的地址,而后两个成员的初值要求是0。如下列示例代码所示:
|
...
OS_MUTEX Mutex = {&Mutex, &Mutex, 0, 0}; //将互斥量定义成全局变量
...
void main(void)
{
static OS_MUTEX Mutex = {&Mutex, &Mutex, 0, 0}; //将互斥量定义成静态局部变量
BSP(); // 硬件初化
OSInit(72000); //玛雅系统初始化
...
while(1)
{
...
}
} (1) |
|
在有些场合的应用中,需要在动态内存中建立互斥量。而这种情况下是不能够采上述的方法赋予其初值的。这时需要调用系统函数OSResetMutex()来对其进行初始化。
|
...
U8 * pMem; //指向动态内的指针
...
void main(void)
{
OS_MUTEX * pMutex;
...
pMutex = (OS_MUTEX *)pMem; //将互斥量建立在动态内存中
OSResetMutex(pMutex); //调用系统函数初始化互斥量
...
while(1)
{
...
}
} (2) |
|
切忌使用系统函数OSResetMutex()对已投入使用的互斥量做初始化,这会导致严重的系统错误!
互斥量定义好后即可以投入使用。系统函数OSLockMutex()用于锁定互斥量,而OSUnlockMutex()则用于解锁互斥量。OSLockMutex()有两个入口参数,第1个参数的取值是待操作的互斥量的地址,第2个参数的取值是超时限定时间,单位为系统节拍。当给第2个参数赋予-1时,表示无限期等待。该函数的返回值为OS_STATUS_OK时,表示互斥被成功的锁定,而它值分别代表各种错误。函数OSUnlockMutex()只有1个入口参数,指向待操作的互斥量的地址,而没有返回值。使用互斥量的示例代码如下:
|
...
...
void main(void)
{
...
...
while(1)
{
...
OSLockMutex(&Mutex, -1); //锁定互量,不限定等待时间
...
OSUnlockMutex(&Mutex); //解锁互斥量
...
if(OSLockMutex(&Mutex, 1000) == OS_STATUS_OK) //锁定互斥量,并限定等待时间为1000个
{ //系统节拍,返回值为OS_STATUS_OK表示
... //成功锁定
OSUnlockMutex(&Mutex); //解锁互斥量
...
}
...
}
} (3) |
|
当紧急任务所等待的互斥量被解锁时,紧急任务的紧急信号会被触发,若此时它的紧急信号未被屏弊,它将转到紧急优先级上。互斥量被解锁后,等待它的各个任务中,高优先级的任务优先锁定该互斥量。
当一个任务被复位,或者结束时,系统内核会解锁所有被其锁定的互斥量。
|