一步一步教你使用uCOS-II( 九 )


void(void *pdata)
INT8U err;
pdata = http://www.kingceram.com/post/pdata;
while (1) {
/* ---------应用程序代码 ---------- */
(, 0, &err);
/* ------- 访问共享资源 ------ */
();
/* --------- 应用程序代码 ---------- */
void(void *pdata)
INT8U err;
pdata = http://www.kingceram.com/post/pdata;
while (1) {
/* ---------应用程序代码---------- */
(, 0, &err);
/* -------访问共享资源------ */
();
/* ---------应用程序代码---------- */
上面代码为互斥信号使用示例
uC/OS-II'互斥信号包含三个元素,一个flag表示当前mutex是否能够获得(0或1);一个表示使用这个mutex的任务,以防一个高优先级的任务需要访问mutex;还包括一个等待这个mutex的任务列表 。
为了启动uC/OS-II’s mutex服务,应该在.H中设置=1 。在使用一个互斥信号之前应该首先创建它,创建一个mutex信号通过调用()完成,mutex的初始值总是设置为1,表示资源可以获得 。
uC/OS-II提供了六种访问互斥信号量的操作 (), (),(), (), () and ().
展示了任务和互斥信号量的关系 。一个互斥信号量只能被任务访问 。在以后的资料中使用钥匙符号表示互斥信号 。钥匙符号表明互斥信号用来访问共享资源 。没有钥匙就无法访问 。只有得到钥匙的任务才有资格访问共享资源
UCOS互斥信号量操作函数分析
//建立并初始化一个互斥型信号量(优先级继承优先级(PIP)、出错代码指针)
* (INT8U prio, INT8U *err)
#if== 3/*for CPU*/
;
#endif
*;
if ( > 0) {/* See iffrom ISR ...*/
*err = ;/* can''tmutex from an ISR*/
(( *)0);
}//不能从ISR中建立,不允许在ISR中调用此函数
#if> 0
if (prio >= ) {/*PIP*/
*err = ;
(( *)0);
}//不合理的PIP
#endif
();
if ([prio] != ( *)0) {/* Mutexmustexist*/
//确认PIP没有被任何任务占用 。[ ]中的一个指向NULL的空指针指示//PIP有效
();/* Taskexist at...*/
*err = ;/* ...*/
//如果优先级存在 ,则出错 。
(( *)0);
[prio] = ( *)1;/*the table entry*/
//置非空指针,将这个优先级保留下来 。
= ; /* Get next free eventblock*/
//从空余ECB中得到一块空的ECB 。
if ( == ( *)0) {/* See if an ECB was*/
//看ECB是否可用
[prio] = ( *)0;/* No,the table entry */
//如果不可用,释放此优先级表入口
();
*err = ;/* No more event*/
();
= ( *)->; /*the free list
//如果可用,重新调整事件控制块的表头
();
-> = ; //将其标记为互斥型信号量
->= (prio = (void *)0;/* No taskthe mutex*/
//消息正在初始化,所以没有等待这个mutex的任务
();//初始化事件等待列表
*err= ;
();
PIP是该函数的参数,指定优先级继承优先级 。当发生优先级反转时,将占用该mutex的任务的优先级太高到PIP 。
UCOS互斥信号量操作函数分析
等待(申请)一个互斥信号量:()
关键代码剖析:
( *,, INT8U *err)