本节开始讲freeRTOS的信号量,先从最基本的二值信号量讲起,后面会讲解计数信号量,最后是信号量与临界段保护的区别。
1)什么是信号量
信号量是操作系统中用来解决资源共享和进程同步的一种方法。
举两个例子分别说明。
资源共享:假如我们系统里有一个串口,各个任务都要通过它发送数据,这个串口可以看作共享资源;如果不加控制地让任务随意访问串口,那么很可能会产生一个任务发送了一部分的数据时,串口资源被别的任务抢占,发送了新的数据;这样就出现了共享资源出错。我们希望在一个任务访问串口时,其他需要访问串口的任务暂时等待,直到占用串口的任务用完释放了串口资源,再轮到下一个任务访问。
信号量就是用来处理这类问题的,我们可以约定,在访问串口资源前,各任务先去竞争获取信号量,获取到信号量的任务可以访问串口,而其他任务被(信号量)阻塞;等到第一个任务访问完,它会释放信号量,让被阻塞的任务再去竞争,之后也是一样,获取到信号量的任务可以获得串口的使用权。这样我们就通过信号量解决了资源共享的问题。
任务同步:信号量用于任务同步的比较简单,假如多个任务间执行有先后要求,必须任务A完成了事件a,才能执行任务B中的函数b,那么我们可以在事件a之后释放一个信号量,而在b执行之前等待这个信号量,那么就保证了任务A、B中的事件同步执行。
信号量的作用有点像一些全局的标识量,我们也可以用全局变量来实现资源共享和任务同步,只是信号量还带有阻塞任务的功能,在操作系统里使用起来更为方便。