信号量
信号量基本使用方法
信号量句柄定义
1 | SemaphoreHandle_t Semaphore_Handle_1; |
信号量创建,前面句柄创建,第一个变量为信号量的最大容量,第二个为初始数值
1 | Semaphore_Handle_1 = xSemaphoreCreateCounting(10, 0); |
信号量添加,添加完成后,信号量的数值加1
1 | xSemaphoreGive(Semaphore_Handle_1); |
信号量读取,即信号量减少,使用portMAX_DELAY后,在读取到才继续运行
1 | xSemaphoreTake(Semaphore_Handle_1, portMAX_DELAY); |
使用信号量实现同步
同步:即在信号量give后,就能进行take,实现任务的同步,例如在计算完成后才进行take后续的任务,两个任务就实现了同步。
实验现象:当不通过信号量来进行输出时,并没有及时地对结果进行输出,说明任务没有进行同步,在任务调度中可能错过信息。
1 | void Task2Function(void * param) |
使用信号量实现互斥锁
互斥:两个任务不能同时进行,即对功能运行的完整性进行保证,避免冲突
创建二进制信号量,初始值为0
1 | Semaphore_Handle_USART1 = xSemaphoreCreateBinary(); |
给二进制信号量赋1,标志着该临界资源空闲可以使用,例为串口1的使用
1 | xSemaphoreGive(Semaphore_Handle_USART1); |
如下是互斥锁的使用,两个任务使用一个串口,而不会导致输出过程相互冲突。
1 | void Task2Function(void * param) |
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 1186703947@qq.com