嵌入式操作系统内核原理和开发(信号量)-2
上一篇 / 下一篇 2012-09-17 15:19:16 / 个人分类:杂谈
上面的get函数看上去比较复杂,但是所有的同步函数基本上都是这样的设计的,看多了反而有一种八股文的感觉。刚开始看的同学可能觉得不是很习惯。不要紧,每天多看两眼,时间长了就ok了。好了,接着我们继续去卡看信号量的释放函数是怎么处理的,大家做好心理准备哦,
0ccqg,T%Bu;A3?v051Testing软件测试网5N0N0k+J%T!P ?.O ?51Testing软件测试网_1Au9Z]!l|*H%^Y
51Testing软件测试网!L*TJe4\)wy1@ static RAW_U16 internal_semaphore_put(RAW_SEMAPHORE *semaphore_ptr, RAW_U8 opt_wake_all) Waj&fhXj8J3W0 #if (RAW_SEMA_FUNCTION_CHECK > 0) block_list_head = &semaphore_ptr->common_block_obj.block_list; *XT*G*`.~;Z*B/H:^aZ0 RAW_CRITICAL_EXIT(); +i g P3Ek!@;`0 }51Testing软件测试网B'pJAY]o d-xD2wrM*nyZ{0 /*wake all the task blocked on this semphore*/51Testing软件测试网-J2X;cdI while (!is_list_empty(block_list_head)) {51Testing软件测试网Klqm&O^R dM[:Pajx0 } i!s E1q L?8L08NA$Yo`9L0 else { @x-d%Pi6emH0 raw_sched(); 51Testing软件测试网8H QL]*d h5`\A 4c+P%V9LQ~
@;}0 return RAW_SUCCESS;51Testing软件测试网z#Y0Y&Y TlfbN\Z |
看上去,信号量的释放函数也比较长,不管只要有耐心,都是可以看明白的,我们就来具体分析一下,
-G/G?q B cO6_u0/kj}7GV?+eGD5M0 (1)判断参数的合法性;51Testing软件测试网?(KC+a7a.m
51Testing软件测试网H7|L'h@&`o(2)判断当前是否有等待队列,如果没有,则count自增,函数返回,当然如果count达到了0xffffffff也要返回,不过概率极低;51Testing软件测试网(oj4yn"fB-w
51Testing软件测试网,hc"cV6mBF(3) 当前存在等待队列,根据opt_wake_all的要求是唤醒一个线程还是唤醒所有的线程;51Testing软件测试网Hd6v5A}
^/g`J/u |'I0 (4)调用系统调度函数,让高优先级任务及时得到运行的机会;51Testing软件测试网Ub"vcm*R3i
3I"f MY#Xk!\y/P0 (5)当前线程再次得到运行的机会,函数返回。51Testing软件测试网 U LQ5S-F}v7O
51Testing软件测试网A(_cW{有了上面的讲解,我们发现os的代码其实也没有那么恐怖。所以,请大家一鼓作气,看看信号量是怎么删除的吧,51Testing软件测试网R3fNi#kS#Y1m
51Testing软件测试网;v!WI(c#q/R m-R5BC&oXQmt)bl{S051Testing软件测试网:~6w/R @P7J!H&a |