使用队列上锁


老师使用这两个函数实现了上锁功能,对串口进行了控制,不太懂实现原理,可以讲解一下吗

当这个队列创建的时候只使用了一个元素的时候,那么这个队列只能被receive一次,必须等到往里面写入一个数据也就是send一次之后,其它的使用者才能调用receive函数读取成功。扩展开来,就是说队列中必须要有可读的数据存在,使用者调用receive才能成功,这个基础知识希望你有所了解。
那么基于此规则,GetUARTLock里面是对队列的读取,读取的等待超时时间是portMAX_DELAY这么多个毫秒,这个时间是很长很长的。如果有个任务1,调用了一次GetUARTLock,那么就意味着队列中的数据被读取完了,其它的任务再次调用这个函数的时候,就会一直等,直到portMAX_DELAY这么多个毫秒走完后返回调用失败,但是这个时间太长了,一般都等不到,所以第二个调用GetUARTLock的任务2的执行就会被“锁足”在这个队列的receive函数中,无法继续往下执行。
那么什么时候任务2或者更多的任务3、4、5、6…才有机会继续执行GetUARTLock函数后的语句呢,就是任务1执行完一些任务后调用PutUARTLock,往队列写入一个数据,那么此时队列里面就有数据可以被receive了,这个时候“锁”就被打开了。
至于后续的任务是谁先被“解锁”,就是看任务优先级了,谁优先级最高谁就会先于其它任务调用GetUARTLock,先于其他任务被“解锁”。