本文介绍: 二进制信号量的使用方法
简介信号量 信号量基本上用于将任务与系统中的其他事件同步。在FreeRTOS中,信号量是基于队列机制实现的。FreeRTOS中有4种信号量: 二进制信号量计数信号量互斥信号量递归信号量Binary Semaphore之所以称为Binary信号量,是因为它存在(‘1’)或不存在(‘0’)。其中没有第三个条件。因此,任务要么具有信号量,要么根本没有。对于Task,我们可以创建一个条件,使其必须具有信号量才能执行自身。因此,如果Task没有信号量,则它别无选择,只能等待当前具有信号量的Task释放它。 假设关键部分正在运行“低优先级任务”。高优先级任务可以在任何时间抢占低优先级任务。但是,如果低优先级任务具有信号量,并且直到它退出关键部分才释放它,那么高优先级任务除了等待信号量之外别无选择,并且它不能抢占低优先级任务。
建立工程 在上一篇基础上加上信号量,如下图,再更新工程即可。
通过1s发送一次信号量来开始任务。 具体实现如下: 3.1 Task1_Init每1s发送一次信号量
/* USER CODE END Header_Task1_init */void Task1_init(void const * argument) { /* USER CODE BEGIN 5 / / Infinite loop / for(;😉 { osDelay(1000); osSemaphoreRelease(BinarySem01Handle);//释放信号量 printf(“semaphore released by Task1\n”); } / USER CODE END 5 */ } ```
3.2 `Task2_Init`等待信号量,然后通过uart1 printf一些提示信息 /* USER CODE END Header_Task2_init */ void Task2_init(void const * argument) { /* USER CODE BEGIN Task2_init */ /* Infinite loop */ for(;;) { printf("waiting for semaphore\n"); osSemaphoreWait(BinarySem01Handle, osWaitForever); printf("semaphore acquired by Task2\n"); } /* USER CODE END Task2_init */ } 输出 在osSemaphoreWait(BinarySem01Handle, osWaitForever);中,任务进入阻塞状态,等待1s,通过osSemaphoreRelease(BinarySem01Handle);来释放信号量,才能开始从等待这里运行。Code下载地址