FreeRTOS学习记录

这里将会总结一些我在FreeRTOS中遇到的问题,将不定时更新

=========================================================================

有关二值信号量实验中遇到的问题

xSemaphoreTake()函数用于获取信号量

我们先来看Receive_Task和Send_Task这两个函数:

static void Receive_Task(void* parameter)
{
		BaseType_t xReturn = pdTRUE;//定义一个创建信息返回值,默认为pdTURE
	
		while(1)
		{
				xReturn = xSemaphoreTake(BinarySem_Handle,//二值信号量句柄
																 portMAX_DELAY);//一直等
				/*这里如何理解呢,这个接收任务正在上面这条语句其实是一直是阻塞态
			   *只有当检测到有效的信号量时,才会变成就绪,然后执行循环
			   */
			  //把接收到的消息存到r_queue中
				if(pdTRUE == xReturn)
					printf("BinarySem_Handle 二值信号量获取成功!\n\n");
				else
					printf("123456");
				toggleLED_G();
		}
}
static void Send_Task(void* parameter)
{
		BaseType_t xReturn = pdPASS;//定义一个创建信息返回值,默认为pdPASS
		while(1)
		{
				if( Key_Scan(KEY_GPIO_PORT,KEY_GPIO_PIN) == KEY_ON)
				{
						xReturn = xSemaphoreGive( BinarySem_Handle );//给出二值信号量
						if(xReturn == pdPASS)
							printf("BinarySem_Handle 二值信号量释放成功!\r\n");
						else
							printf("BinarySem_Handle 二值信号量释放失败!\r\n");
				}
				vTaskDelay(20);/* 延时 20 个 tick */
		}
}

在学习中我遇到的困惑是,如果没有获取到有效信号,那么Receive_Task这个任务还怎么进到while(1)中来执行xSemaphoreTake()函数,在仔细阅读后教材后,发现自己的问题非常的愚蠢,这里列出正确的执行流程:

Receive_Task会先执行xSemaphoreTake()函数,由于此时按键还没有按下,因此必然没有有效信号量,此时,Receive_Task会进入阻塞态,直到他接收到有效信号量。

                                                                                                                                       2022.5.6

=========================================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值