本程序创建了一个二进制信号量,然后创建2个任务:一个用于释放信号量,另一个用于获取信号 量;
发送任务、接收任务的代码和执行流程如下:
A:发送任务优先级高,先执行。连续3次释放二进制信号量,只有第1次成功
B:发送任务进入阻塞态
C:接收任务得以执行,得到信号量,打印OK;再次去获得信号量时,进入阻塞状态 在发送任务 的vTaskDelay退出之前,运行的是空闲任务:现在发送任务、接收任务都阻塞了
D:发送任务再次运行,连续3次释放二进制信号量,只有第1次成功
E:发送任务进入阻塞态
F:接收任务被唤醒,得到信号量,打印OK;再次去获得信号量时,进入阻塞状态
即使发送任务连续释放多个信号量,也只能成功1次。释放、获得信号量是一一对应的。
一、HAL库基础环境配置
HAL库三板斧
1、配置下载线
2、配置晶振
3、配置时钟
二、配置外设-串口1
三、在CubeMX中添加FreeFTOS
注意:修改时基【由于使用了FreeRTOS系统,需要将时基修改为基本时钟,如TIM6】
四、配置FreeRTOS参数
创建了一个二进制信号量,然后创建2个任务:一个用于释放信号量,另一个用于获取信号量;
1、任务创建:
2、二进制信号量创建
五、编写任务代码
发送任务:
/* USER CODE END Header_Sender */
void Sender(void *argument)
{/* USER CODE BEGIN Sender *//* Infinite loop */int i;int cnt_ok = 0;int cnt_err = 0;const TickType_t xTicksToWait = pdMS_TO_TICKS(10UL);for(;;){for(i = 0;i<3;i++){if(xSemaphoreGive(myBinarySem01Handle) == pdTRUE){printf("Give BinarySemaphore %d TimeOut_t:OK\r\n",cnt_ok++);}else{printf("Give BinarySemaphore %d TimeOut_t:ERR\r\n",cnt_ok++);}}vTaskDelay(xTicksToWait);}/* USER CODE END Sender */
}
接收任务:
/* USER CODE END Header_Receiver */
void Receiver(void *argument)
{/* USER CODE BEGIN Receiver *//* Infinite loop */int cnt_ok = 0;int cnt_err = 0;for(;;){if(xSemaphoreTake(myBinarySem01Handle,portMAX_DELAY) == pdTRUE){printf("Get BinarySemaphore %d TimeOut_t:OK\r\n",cnt_err++);}else{printf("Get BinarySemaphore %d TimeOut_t:ERR\r\n",cnt_err++);}}/* USER CODE END Receiver */
}
程序运行效果:
发送任务、接收任务的代码和执行流程如下:
A:发送任务优先级高,先执行。连续3次释放二进制信号量,只有第1次成功
B:发送任务进入阻塞态
C:接收任务得以执行,得到信号量,打印OK;再次去获得信号量时,进入阻塞状态 在发送任务 的vTaskDelay退出之前,运行的是空闲任务:现在发送任务、接收任务都阻塞了
D:发送任务再次运行,连续3次释放二进制信号量,只有第1次成功
E:发送任务进入阻塞态
F:接收任务被唤醒,得到信号量,打印OK;再次去获得信号量时,进入阻塞状态
即使发送任务连续释放多个信号量,也只能成功1次。释放、获得信号量是一一对应的。
配套示例源码:链接:https://pan.baidu.com/s/1Vs75_JZgR3nAU9B-FFWBSQ
提取码:z8pv
计数型信号量无非就是能设置初始值和上限值,用法和二值信号量一样,看什么场景什么适用,这个和我之前学的互斥量差不太多,也是拿锁和上锁,总的来说都是实现同步的功能,不能实现数据交换。