当前位置: 首页 > news >正文

【FreeRTOS】第七课(4):任务间的通信——一个设备的数据写入多个队列

目录

一、程序框架

二、代码示例

1.游戏层

数据获取层


一、程序框架

红外遥控框架

二、代码示例

1.游戏层

/**************************************变量创建**************************************/
struct car {int x;int y;int control_key;
};struct car g_cars[3] = {{0, 0, IR_KEY_1},{0, 17, IR_KEY_2},{0, 34, IR_KEY_3},
};/**************************************任务函数**************************************/
static void CarTask(void *params)
{struct car *pcar = params;struct ir_data idata;/* 创建获取红外遥控器解析数据的队列 */QueueHandle_t xQueueIR = xQueueCreate(10, sizeof(struct ir_data));/* 注册队列 */RegisterQueueHandle(xQueueIR);/* 显示汽车 */ShowCar(pcar);while (1){/* 读取按键值:读队列 */xQueueReceive(xQueueIR, &idata, portMAX_DELAY);if (idata.val == pcar->control_key){/* 如果没有到最右边,控制汽车往右移动 */if (pcar->x < g_xres - CAR_LENGTH){/* 隐藏汽车 */HideCar(pcar);/* 调整位置 */pcar->x += 20;if (pcar->x > g_xres - CAR_LENGTH){pcar->x = g_xres - CAR_LENGTH;}/* 重新显示汽车 */ShowCar(pcar);}}}
}/**************************************游戏函数**************************************/
void car_game(void)
{/* 其他代码 */.../* 创建了三个汽车任务,每个汽车任务中都有创建获取红外遥控器解析数据的队列并将自己的队列句柄写入注册数组的操作 */xTaskCreate(CarTask, "car1", 128, &g_cars[0], osPriorityNormal, NULL);xTaskCreate(CarTask, "car2", 128, &g_cars[1], osPriorityNormal, NULL);xTaskCreate(CarTask, "car3", 128, &g_cars[2], osPriorityNormal, NULL);	
}

数据获取层

static QueueHandle_t g_xQueueIR; /* 红外队列 *//* 用于保存注册的队列的句柄 */
static QueueHandle_t g_xQueues[10];
static int g_queue_cnt = 0;/* 注册队列 */
/* 每一个创建有自己队列的任务,如果想要获得红外遥控器的解析数据,就把自己的句柄保存在数组中 */
void RegisterQueueHandle(QueueHandle_t queueHandle)
{if (g_queue_cnt < 10){g_xQueues[g_queue_cnt] = queueHandle;g_queue_cnt++;}
}/* 此函数就是将IRReceiver_IRQTimes_Parse(void)中的xQueueSendFromISR()扩展为写入多个队列 */
static void DispatchKey(struct ir_data *pidata)
{
#if 0	extern QueueHandle_t g_xQueueCar1;extern QueueHandle_t g_xQueueCar2;extern QueueHandle_t g_xQueueCar3;xQueueSendFromISR(g_xQueueCar1, pidata, NULL);xQueueSendFromISR(g_xQueueCar2, pidata, NULL);xQueueSendFromISR(g_xQueueCar3, pidata, NULL);
#else/* 优化上面的代码,使用数组来保存队列 *//* 如果保存注册队列的数组未满 */int i;for (i = 0; i < g_queue_cnt; i++){/* 将数据写入数组中的每个队列*/xQueueSendFromISR(g_xQueues[i], pidata, NULL);   }/* 之前挡球板游戏中创建的保存红外遥控器解析数据的队列也可以将自己的句柄传入数组,来获得红外遥控器解析数据,从而保证挡球板游戏也能玩 */
#endif	
}/**********************采集并解析红外遥控数据保存进入红外队列**********************/
/* 处理原始数据 */
static int IRReceiver_IRQTimes_Parse(void)
{/* 写红外遥控原始数据队列 */struct ir_data data;data.dev = dev;data.val = val;/* 将数据分发给多个队列 */DispatchKey(&idata);return 0;
}/* 采集原始数据,回调数据处理函数 */
void IRReceiver_IRQ_Callback(void)
{/* 前置代码 */...IRReceiver_IRQTimes_Parse();
}
http://www.dtcms.com/a/415045.html

相关文章:

  • js的this—13
  • 从“全量”到“增量”:Diff解析器如何彻底优化数据处理效率?
  • steamGame——饥荒联机版(2025)
  • 网站服务器连接被重置中网可信网站查询
  • 【Qt】Windows下Qt+MSVC的使用
  • STL容器:vector
  • 网站什么时候备案好wordpress 新浪博客模板
  • 嵌入式面试高频(十二)!!!C++语言(嵌入式八股文,嵌入式面经)c++11新特性
  • iptables 详解
  • 基于dify搭建的论文查询和内容提取应用(可加群)
  • elasticsearch面试八股文
  • MySQL笔记---表的约束
  • 单页产品网站源码带后台东莞全网推广
  • Kafka 事务协议 KIP-890 更强的防重、无感升级与端到端性能
  • 【精品资料鉴赏】873页5A级智慧景区信息化规划设计方案
  • kanass入门到实战(5) - 如何进行任务管理
  • Spring AI alibaba对话上下文持久化数据库
  • 嵌入式面试题合集附答案(六)
  • 青岛做模板网站的公司wordpress自定义注册页面模板
  • 【大模型】深入理解大模型输出的Temperature、Top-k与Top-p采样
  • 如何编辑网站标题简约网站设计
  • 关于七牛云OSS存储的图片数据批量下载到本地
  • 左值引用、右值引用、万能引用
  • TrendFinder - 社交媒体趋势追踪工具
  • 【QT第一章】QT基础知识
  • 网站开发亿玛酷技术河南营销推广软件
  • 操作系统经典PV操作——读者-写者问题的公平性实现
  • 商业机构的网站是什么酒店网站模板设计方案
  • 【SpringAI中Chat-Client用法】
  • Python 数学公式构建海洋不明生物(好像是水母)动画 - 简谐振动