目录
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