STM32 FreeRTOS 二值信号量

文章描述了一个使用二值信号量进行任务同步的示例,涉及三个优先级不同的任务:High、Normal和Low。High任务首先获取信号量,然后释放;Low任务在等待两个信号量,其中一个由串口接收中断释放。当串口数据发送后,Low任务继续,而High任务因优先级高再次获取信号量。
摘要由CSDN通过智能技术生成

二值信号量可以用于任务同步(任务与任务间,任务与中断间)。
假设有高,中,低三个任务。
高级任务:

API

  1. 创建一个二值量、并返回一个ID:osSemaphoreCreate
osSemaphoreDef(telesendSem);
telesendSemHandle = osSemaphoreCreate(osSemaphore(telesendSem), 1);
  1. 删除一个信号量:osSemaphoreDelete
 osSemaphoreDelete(BinarySem01Handle);
  1. 释放信号量
osSemaphoreRelease(telerecvSemHandle);
  1. 获取信号量
osSemaphoreWait(telerecvSemHandle, osWaitForever);

代码部分

任务High

void StartHighTask(void const * argument)
{
  for(;;)
  {
  	printf("进入任务High,等待二值量\n");
    osSemaphoreWait(telerecvSemHandle, osWaitForever);		// waiting for Semaphore
    printf("High: 获得二值量\n");
    printf("High: 释放二值量\n\n");
    osSemaphoreRelease(telerecvSemHandle);		// releasng Semaphore
    osDelay(500);
  }
}

任务Normal

void StartNormalTask(void const * argument)
{
  for(;;)
  {
	printf("进入任务Normal\n");
	printf("退出任务Normal\n\n");
   	osDelay(1000);
  }
}

任务Low

void StartteletransTask(void const * argument)
{
  for(;;)
  {
	printf("进入任务Low,等待二值量\n");
	osSemaphoreWait(telerecvSemHandle, osWaitForever);		// waiting for Semaphore
	printf("Low: 获得二值量\n");
    osSemaphoreWait(gpsrecvSemHandle, osWaitForever);		// waiting for Semaphore
    printf("Low: 释放二值量\n\n");
    osSemaphoreRelease(telerecvSemHandle);		// releasng Semaphore
    osDelay(500);
  }
}

任务中的“gpsrecvSemHandle”通过串口接收中断释放。

实验结果

在这里插入图片描述
初始运行时,程序按照任务优先级依次运行High,Normal,Low程序。
Low获取完telerecvSemHandle后,因为没有向串口发数,gpsrecvSemHandle一直未被释放。任务开始等待。
由于无需等待信号量,Normal可以继续按照自己的节奏发送数据。

osSemaphoreWait(gpsrecvSemHandle, osWaitForever);		// waiting for Semaphore

此处后便进入进行等待。

接下来给串口发送数据,释放gpsrecvSemHandle。
在这里插入图片描述
上图可以看出
gpsrecvSemHandle被释放,Low解除等待,释放二值量
High获取到二值量并释放
Low和High都等待500ms,因为High优先级高,再次获得信号量并释放
Low任务运行,因为gpsrecvSemHandle没有被释放,程序开始等待。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值