Freertos-互斥量的基本使用

1.刚创建的互斥量可以被成功"take"
2.“take"互斥量成功的任务,被称为"holder”,只能由它"give"互斥量;别的任务"give"不成功。
3.在 ISR 中不能使用互斥量。
4.本程序创建 2 个发送任务:故意发送大量的字符。 可以做 2 个实验:使用互斥量:可以看到任务 1、任务 2 打印的字符串没有混杂在一起。不使用互斥量:任务 1、任务 2 打印的字符串混杂在一起。
main函数

/* 互斥量句柄 */
SemaphoreHandle_t xMutex;

int main( void )
{
	prvSetupHardware();
	
    /* 创建互斥量 */
    xMutex = xSemaphoreCreateMutex( );

	if( xMutex != NULL )
	{
		/* 创建2个任务: 都是打印
		 * 优先级相同
		 */
		xTaskCreate( vSenderTask, "Sender1", 1000, (void *)1, 1, NULL );
		xTaskCreate( vSenderTask, "Sender2", 1000, (void *)2, 1, NULL );

		/* 启动调度器 */
		vTaskStartScheduler();
	}
	else
	{
		/* 无法创建互斥量 */
	}

	return 0;
}

发送任务函数:

static void vSenderTask( void *pvParameters )
{
	const TickType_t xTicksToWait = pdMS_TO_TICKS( 2UL );	
	int cnt = 0;
	int task = (int)pvParameters;
	int i;
	char c;
	
	/* 无限循环 */
	for( ;; )
	{	
		/* 获得互斥量: 上锁 */
		xSemaphoreTake(xMutex, portMAX_DELAY);
		
		printf("Task %d use UART count: %d, ", task, cnt++);
		c = (task == 1 ) ? 'a' : 'A';
		for (i = 0; i < 26; i++)
			printf("%c", c + i);
		printf("\r\n");
		
		/* 释放互斥量: 开锁 */
		xSemaphoreGive(xMutex);
		
		vTaskDelay(xTicksToWait);
	}
}

vSenderTask 函 数 的 for 循 环 中 xSemaphoreTake 和xSemaphoreGive 这 2 句代码保留、不保留。
保留:实验现象如下图左边,任务 1、任务 2 的打印信息没有混在一起
不保留:实验现象如下图右边,打印信息混杂在一起

在这里插入图片描述

 


原文链接:https://blog.youkuaiyun.com/qq_49864684/article/details/123255242

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值