【FreeRTOS】事件组实验_车辆协同


0 前言

学习视频:
【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS(FreeRTOS教程 基于STM32,以实际项目为导向)】 【精准空降到 00:28】 https://www.bilibili.com/video/BV1Jw411i7Fz/?p=43&share_source=copy_web&vd_source=8af85e60c2df9af1f0fd23935753a933&t=28

参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》

  • 《第10章 同步互斥与通信》
  • 《第14章 事件组(event group)》

在这里插入图片描述

1 事件组实验_车辆协同

本节源码:在"22_mutex_priority_inversion"的基础上,改出:

  • 23_eventgroup_broadcast: car1到站后,广播通知car2,car3启动
  • 24_eventgroup_or: car1或car2到站后,car3启动
  • 25_eventgroup_and: car1和car2都到站后,car3启动

1.1 car1到站后,广播通知car2,car3启动

编写程序,在Car1Task,不去获得信号量了,移动到最右边去设置事件组;在Car2Task里也不获取信号量了,直接等待事件,不释放信号量;在Car3Task里也不获取信号量了,直接等待事件,不释放信号量。

代码如下:

static EventGroupHandle_t g_xEventCar;  //汽车事件



static void Car1Task(void *params)
{
   
   
	struct car *pcar = params;
	struct ir_data idata;
	
	/* 创建自己的队列 */
	QueueHandle_t xQueueIR = xQueueCreate(10, sizeof(struct ir_data));
	
	/* 注册队列 */
	RegisterQueueHandle(xQueueIR);

	/* 显示汽车 */
	ShowCar(pcar);
	
//    /* 先获取信号量 */
//    xSemaphoreTake(g_xSemTicks, portMAX_DELAY); //不成功就永远等待
    
	while (1)
	{
   
   
		/* 读取按键值:读队列 */
		// xQueueReceive(xQueueIR, &idata, portMAX_DELAY);
		
		/* 控制汽车往右移动 */
		// if (idata.val == pcar->control_key)
		{
   
   
			if (pcar->x < g_xres - CAR_LENGTH)
			{
   
   
				/* 隐藏汽车 */
				HideCar(pcar);
				
				/* 调整位置 */
				pcar->x += 2;
				if (pcar->x > g_xres - CAR_LENGTH)
				{
   
   
					pcar->x = g_xres - CAR_LENGTH;
				}
				
				/* 重新显示汽车 */
				ShowCar(pcar);
                
                vTaskDelay(50);
                if (pcar->x == g_xres - CAR_LENGTH) //移动到最右边
                {
   
   
//                    /* 释放信号量 */
//                     xSemaphoreGive(g_xSemTicks);
                    
                    /* 设置事件组:bit0 */
                    xEventGroupSetBits(g_xEventCar, (1<<0));
                    vTaskDelete(NULL);
                }
			}
		}
	}
}

static void Car2Task(void *params)
{
   
   
	struct car *pcar = params;
	struct ir_data idata;
    
	/* 创建自己的队列 */
	QueueHandle_t xQueueIR = xQueueCreate(10, sizeof(struct ir_data));
	
	/* 注册队列 */
	RegisterQueueHandle(xQueueIR);

	/* 显示汽车 */
	ShowCar(pcar);
    
    vTaskDelay(1000);   //1S后运行
    
//    /* 先获取信号量 */
//    xSemaphoreTake(g_xSemTicks, portMAX_DELAY); //不成功就永远等待
    
    /* 等待bit0事件 */
    xEventGroupWaitBits
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北国无红豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值