专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

浅谈ucos 2的信号量

作者:佚名   来源:本站原创   点击数:  更新时间:2012年01月19日   【字体:

  这2天在已有空就看信号量,本来没头绪的,查了资料也没找到有用的东西,不过在例子中找到了感觉。于是重新把书那章看了看,然后亲自调试代码,终于摸到了头绪。

       首先我很膜拜下大师。首先不说这个操作系统的有多复杂,大师写的代码这么规范,是我自叹不如的,大师的代码层次分明注释详细,可以看出大师是个十分严谨的人。就光这点让人不得不佩服。然后是操作系统,虽然大师也是从ucos 2那里学到得,不过大师愿意把自己写的用于51的操作系统分享给大家,这点更加的崇敬。

     现在回到正题,本来是想理解深透了再写的,但是怕自己忙着进一步的研究,没时间更新这边的文章。首先信号量是个什么?信号量就象交通灯一样,它告诉控制了汽车的流动。信号量控制了程序的同步运行。谁拿到了信号就可以享用CPU的时间片,没有信号则任务被挂起。OSSemCreate 创建信号量,实际上是初始化信号量数组。OSSemPend()等待一个信号量

   这里首先在任务里初始化信号量,然后在使用等待信号量的函数,一旦有信号量,则立刻返回OS_SEM_OK,取得信号可以做下一步操作,如果取不到信号,则任务被挂起,在挂起之前,必须把局部变量存放到堆栈中,这也是书上说的为了保证重入性。    
            SP++;
        *((uint8 data *)SP) = Index; 
上面则把信号量的索引保存到堆栈中。然后清任务标志再切换到其他任务中,在这里有必要一提的事,在任务运行中,切到其他任务中只有几种方式,1,中断 2.通过系统睡眠函数 OSWait() 3.任务切换函数OSSched() 。 在OSSemPend()这个函数里开了临界区,所以中断不存在,睡眠函数也没有,那么任务就一致运行直到OSSched() 函数的出现,吧CPU交给其他任务,同时正在运行的任务由于清掉了就绪的标志位,它的恢复有2种情况  1.超时时间到了,中断吧时间片切给它继续运行 2.OSSemPost()它调用OSSemintPost()会把等待信号量的表中吧最高优先级的任务的就绪表置1,然后切换并给与信号量,相当于等待到信号量并继续未完成的工作。

      时间不早了,下回更新吧,我睡觉了。

      虽然头又点疼,但还是吧文章更新完再说吧。好像上面已经把信号量说完了。当又信号就OSSemPend会返回得到信号的标志于是就进行对某个硬件的处理,如果没得到则挂起任务,时间片留给其他任务,由于清掉了任务就绪表的标志所以挂起的任务只有等到超时或者某个中断处理中发送了信号,唤醒等待该信号量的任务。  大体就是这样子。至于调试吗,在EN_OS_SEM  宏定义开启,然后就可以使用信号量的函数了。你可以设置个全局变量,然后在2个任务中对他赋值,然后给他们控制信号量来达到测试目的。本人写的代码还有点问题,我挂起的任务唤醒,发现PC走错地址了,知道哪有问题,但一时头疼,无法继续。消息队列下回再更新。
 

关闭窗口

相关文章