在嵌入式开发中,只要你使用实时操作系统,那么使用信号量可以说必不可少。我们常使用信号量进行同步或互斥。
信号量(semaphore)是一种用于提供不同进程之间或者一个给定的不同线程间同步手段的原语。信号量多用于任务间的同步与互斥。 信号量在FreeRTOS中分为三种:计数型信号量、二值信号量和互斥信号量。
二值信号量顾名思义就是信号量取值只有0和1的信号量,但他与互斥信号量不同,他没有优先级继承机制,也不是获取和释放均只能在同一个任务里进行。在实现任务间同步中,使用的非常广泛。
设置两个任务和一个信号量。 任务1运行时会令LED1闪烁,并串口发送01,当运行4次任务1后,任务1会释放二值信号量。 任务2首先获取二值信号量,如果获取失败任务进行调度。当获取到信号量时,任务2会执行LED2闪烁,并串口发送02。 实现任务1 每运行四次,任务2运行一次。
#include "Semaphore.h"SemaphoreHandle_t LED_Semaphore;void initSemaphore(void){
LED_Semaphore =xSemaphoreCreateBinary();
configASSERT(LED_Semaphore != NULL);}
void LED1ToggleTesk(void const * argument){
BaseType_t xReturn=pdTRUE;
int ledtime1=4;
for(;;)
{
usart_send[0]=0x1;
ledtime1--;
if(ledtime1==0){
xSemaphoreGive(LED_Semaphore);
ledtime1=4;
}
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
HAL_UART_Transmit(&huart3,usart_send,1,portMAX_DELAY);
vTaskDelay(1000);
}}
void LED2ToggleTesk(void const *argument){
BaseType_t xReturn=pdTRUE;
for(;;)
{
usart_send[0]=0x2;
xReturn =xSemaphoreTake(LED_Semaphore,0);
if(xReturn==pdTRUE)
{
HAL_UART_Transmit(&huart3,usart_send,1,portMAX_DELAY);
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
}
vTaskDelay(1000);
}
}
实现的现象是LED1始终在翻转,串口始终发送01,当执行四次上述现象的时候。LED2翻转并串口发送02.