本文和大家分享的主要是ucos中资源与共享资源的异同点,希望对大家学习ucos有所帮助。
资源:
任何为任务所占用的实体。如:打印机,键盘,显示器等。另外资源也可以是一个变量,一个结构或者一个数组。
所以说我们操作系统中的资源是广义的资源,任何为任务所服务的东西,我们都被称为资源。
共享资源:
被一个以上的任务使用的资源。
比如这里面有个变量,这个变量是全局变量,全局变量假设它是一个LEDFlag的状态,在一个LED中,我们要对这个LEDFlag进行修改,或者说做使用,而另外一个按键当中,我们也要用到LEDFlag,那这样的话,这一个变量被两个任务使用,首先这个变量是个资源,接下来这个资源,被两个任务使用,这样的资源就被称为共享资源。
我们子啊使用共享资源的时候,必须使用一些手段来保证共享资源不出问题。什么意思呢?假设LED中刚刚把这个LEDFlag修改为1,然后在按键中,又把它修改为0了,就是在任务执行到LED中把这个LEDFlag修改为1,接下来来判断这个状态。但是在这个之前,按键刚把它修改为0了,那这个时候,我们来看就出问题了,我们把它改为1,这个时候,判断我们应该是1,但是实际上由于按键这个任务的作用,它已经变成了0,所以关于共享资源的访问,我们必须满足一个条件叫做互斥。
对共享资源的访问,必须满足互斥:(独占)
满足互斥的方法:
1、关中断和开中断。
在使用这个全局变量或者共享资源之前呢,我们首先把这个中断给关掉,当共享资源使用完毕以后,我们再把这个中断给打开就行了
2、使用测试并置位指令。
假设还是刚刚一个LED灯的任务,还有一个按键任务,都会使用到一个共享资源叫做LEDFlag,那这个时候我们使用一个测试并置位,我们首先再加一个变量bit,我们把变量bit初始化为0,当LED任务要使用LEDFlag的时候,我先判断bit是否等于0,如果bit等于0,我们就把bit置成1,如果bit等于1的话,就表明我们这个LED正在使用,安接下来就可以使用LEDFlag了,使用完毕后,我们再把bit置成0,这样的话每个任务在使用LEDFlag之前,首先判断bit的状态,判断完毕之后,如果能使用,就把bit置成1,使用完共享资源以后,再把bit置成0,这个方法就是测试并置位指令。我们发现,这样一个测试并置位指令就很好的避免了我们这个共享资源的访问问题。
3、任务禁止切换,使用,允许任务切换。
因为不被任务切换,那么这个时候,我们就不会被别的任务所打断,那这个时候我们就可以使用这个共享资源,使用完毕之后,接下来开启任务的切换功能就行了。
4、使用信号量。
它和我们的使用测试并置位指令这条命令是差不多的,也就是说,在我们使用这个共享资源之前首先开启一个信号量。我们用这个信号量来约束共享资源的访问,怎么办呢?首先还是这个信号量,假设这个共享资源正在访问的时候,我们把这个信号量置为1,接下来,我们访问共享资源,访问后,再把这个信号量变成0,只不过在这里我们需要注意,对信号量它有两个专业的术语,一个叫做获取信号量,一个叫做释放信号量。也就是说,我们使用共享资源的时候,首先来获取这个信号量,获取到了以后,就使用共享资源,使用完毕以后,就把这个信号量释放。