二值信号量可以用于任务同步(任务与任务间,任务与中断间)。
假设有高,中,低三个任务。
高级任务:
API
- 创建一个二值量、并返回一个ID:osSemaphoreCreate
osSemaphoreDef(telesendSem);
telesendSemHandle = osSemaphoreCreate(osSemaphore(telesendSem), 1);
- 删除一个信号量:osSemaphoreDelete
osSemaphoreDelete(BinarySem01Handle);
- 释放信号量
osSemaphoreRelease(telerecvSemHandle);
- 获取信号量
osSemaphoreWait(telerecvSemHandle, osWaitForever);
代码部分
任务High
void StartHighTask(void const * argument)
{
for(;;)
{
printf("进入任务High,等待二值量\n");
osSemaphoreWait(telerecvSemHandle, osWaitForever);
printf("High: 获得二值量\n");
printf("High: 释放二值量\n\n");
osSemaphoreRelease(telerecvSemHandle);
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);
printf("Low: 获得二值量\n");
osSemaphoreWait(gpsrecvSemHandle, osWaitForever);
printf("Low: 释放二值量\n\n");
osSemaphoreRelease(telerecvSemHandle);
osDelay(500);
}
}
任务中的“gpsrecvSemHandle”通过串口接收中断释放。
实验结果
初始运行时,程序按照任务优先级依次运行High,Normal,Low程序。
Low获取完telerecvSemHandle后,因为没有向串口发数,gpsrecvSemHandle一直未被释放。任务开始等待。
由于无需等待信号量,Normal可以继续按照自己的节奏发送数据。
osSemaphoreWait(gpsrecvSemHandle, osWaitForever);
此处后便进入进行等待。
接下来给串口发送数据,释放gpsrecvSemHandle。
上图可以看出
gpsrecvSemHandle被释放,Low解除等待,释放二值量
High获取到二值量并释放
Low和High都等待500ms,因为High优先级高,再次获得信号量并释放
Low任务运行,因为gpsrecvSemHandle没有被释放,程序开始等待。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)