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

FreeRTOS任务通知操作

模拟二值信号量:

/** * @brief task1 * @param pvParameters : 传入参数(未用到) * @retval 无 */ void task1(void *pvParameters) { uint8_t key = 0; while (1) { if (Task2Task_Handler != NULL) { key = key_scan(0); switch (key) { case KEY0_PRES: /* 发送任务通知 */ { xTaskNotifyGive((TaskHandle_t)Task2Task_Handler); /* 接收任务通知的任务句柄 */ break; } default: { break; } } } vTaskDelay(10); } } /** * @brief task2 * @param pvParameters : 传入参数(未用到) * @retval 无 */ void task2(void *pvParameters) { uint32_t notify_val = 0; uint32_t task2_num = 0; while (1) { notify_val = ulTaskNotifyTake((BaseType_t )pdTRUE, /* 通知值在函数退出时清零,类似二值信号量 */ (TickType_t )portMAX_DELAY); /* 等待时间 */ if (notify_val != 0) { lcd_fill(6, 131, 233, 313, lcd_discolor[++task2_num % 11]); /* LCD区域刷新 */ } } }

模拟计数型信号量:

/** * @brief task1 * @param pvParameters : 传入参数(未用到) * @retval 无 */ void task1(void *pvParameters) { uint8_t key = 0; while (1) { key = key_scan(0); if (Task2Task_Handler != NULL) { switch (key) { case KEY0_PRES: /* 发送任务通知 */ { xTaskNotifyGive((TaskHandle_t)Task2Task_Handler); /* 接收任务通知的任务句柄 */ break; } default: { break; } } } vTaskDelay(10); } } /** * @brief task2 * @param pvParameters : 传入参数(未用到) * @retval 无 */ void task2(void *pvParameters) { uint32_t notify_val = 0; uint32_t task2_num = 0; while (1) { notify_val = ulTaskNotifyTake((BaseType_t )pdFALSE, /* 通知值在函数退出时递减,类似计数型信号量 */ (TickType_t )portMAX_DELAY); /* 等待时间 */ lcd_show_xnum(166, 111, notify_val - 1, 2, 16, 0, BLUE); /* 在LCD上显示任务通知值 */ lcd_fill(6, 131, 233, 313, lcd_discolor[++task2_num % 11]); /* LCD区域刷新 */ vTaskDelay(1000); } }

模拟消息邮箱:

/** * @brief task1 * @param pvParameters : 传入参数(未用到) * @retval 无 */ void task1(void *pvParameters) { uint8_t key = 0; while (1) { key = key_scan(0); if ((Task2Task_Handler != NULL) && (key != 0)) { xTaskNotify((TaskHandle_t )Task2Task_Handler, /* 接收任务通知的任务句柄 */ (uint32_t )key, /* 要更新的bit位 */ (eNotifyAction )eSetValueWithOverwrite); /* 更新方式为覆写 */ } vTaskDelay(10); } } /** * @brief task2 * @param pvParameters : 传入参数(未用到) * @retval 无 */ void task2(void *pvParameters) { uint32_t notify_val = 0; uint32_t task2_num = 0; while (1) { xTaskNotifyWait((uint32_t )0x00000000, /* 进入函数时,不清除任务通知值 */ (uint32_t )0xFFFFFFFF, /* 函数退出时,清零任务通知值 */ (uint32_t* )&notify_val, /* 接收到的通知值 */ (TickType_t )portMAX_DELAY); /* 等待时间 */ switch (notify_val) { case KEY0_PRES: /* LCD区域刷新 */ { lcd_fill(6, 126, 233, 313, lcd_discolor[++task2_num % 11]); break; } case KEY1_PRES: /* LED0闪烁 */ { LED0_TOGGLE(); break; } default: { break; } } } }

模式事件组:

#define EVENTBIT_0 (1<<0) /* 事件位 */ #define EVENTBIT_1 (1<<1) #define EVENTBIT_ALL (EVENTBIT_0 | EVENTBIT_1) /** * @brief task1 * @param pvParameters : 传入参数(未用到) * @retval 无 */ void task1(void *pvParameters) { uint8_t key = 0; while (1) { if (Task2Task_Handler != NULL) { key = key_scan(0); switch (key) { case KEY0_PRES: { xTaskNotify((TaskHandle_t )Task2Task_Handler, /* 接收任务通知的任务句柄 */ (uint32_t )EVENTBIT_0, /* 要更新的bit位 */ (eNotifyAction )eSetBits); /* 更新方式为设置bit位 */ break; } case KEY1_PRES: { xTaskNotify((TaskHandle_t )Task2Task_Handler, /* 接收任务通知的任务句柄 */ (uint32_t )EVENTBIT_1, /* 要更新的bit位 */ (eNotifyAction )eSetBits); /* 更新方式为设置bit位 */ break; } default: { break; } } } vTaskDelay(10); } } /** * @brief task2 * @param pvParameters : 传入参数(未用到) * @retval 无 */ void task2(void *pvParameters) { uint32_t notify_val = 0; uint32_t event_val = 0; uint32_t task2_num = 0; while (1) { xTaskNotifyWait((uint32_t )0x00000000, /* 进入函数时,不清除任务通知值 */ (uint32_t )0xFFFFFFFF, /* 函数退出时,清零任务通知值 */ (uint32_t* )&notify_val, /* 接收到的通知值 */ (TickType_t )portMAX_DELAY); /* 等待时间 */ if (notify_val & EVENTBIT_0) /* 模拟事件0发生 */ { event_val |= EVENTBIT_0; } else if (notify_val & EVENTBIT_1) /* 模拟事件1发生 */ { event_val |= EVENTBIT_1; } lcd_show_xnum(182, 110, event_val, 1, 16, 0, BLUE); /* LCD上显示事件值 */ if (event_val == EVENTBIT_ALL) { event_val = 0; /* 模拟事件组清零 */ lcd_fill(6, 131, 233, 313, lcd_discolor[++task2_num % 11]); } } }
http://www.jsqmd.com/news/1272260/

相关文章:

  • 嵌入式图形显示实战:CLUT与位图窗口原理、配置与调试
  • AI短剧创作系统:技术架构与低成本实践指南
  • PCB贴片打样如何提升研发效率?专业PCBA加工厂为您解析
  • 概率思维与贝叶斯方法在AI中的应用
  • 深入理解C++内存五大区:栈、堆、全局/静态、常量与代码区
  • 三自由度机械臂自适应神经网络控制与Matlab实现
  • 嵌入式硬件热设计实战:从TI AM1705热阻表到PCB散热优化
  • C++类模板实战指南:从基础语法到智能指针实现
  • Unity前向渲染与多光源Shader实战:从平行光到聚光灯的完整实现
  • Adam优化器原理与深度学习实践指南
  • 【AcWing题解/洛谷题解/USACO题解】P1948 Telephone Lines S 通信线路
  • MBA论文写作必备:9款AI工具提升科研效率
  • 易语言软件怎么免费增加网络验证?怎么增加卡密系统?
  • 《热江绿色版》热江手游:最新下载入口,官方正版下载渠道三端互通IOS、安卓、电脑最新下载地址,纯粹靠手打、靠积累、无数值氪金、长期养老不翻车的复古武侠
  • Golang调用Windows API实现ARP扫描与网络探测
  • 跳出制衣局限:模板机跨界窗帘家居布艺生产科普,实现服装家纺柔性共线
  • ERTC协议与WebRTC优化在智能家居音视频通信中的应用
  • 零侵入式系统性能分析:多维度流量监控实践
  • 优质高速喷射点胶阀口碑盘点 靠谱供应商深度解析,技术好的高速喷射点胶阀供应商选哪家,快速喷射稳定,保障点胶的质量 - 品牌推荐师
  • DM6467T嵌入式系统设计:互连架构、电源时钟与PCB实战解析
  • C语言-函数(数组传值)
  • 文本到图像模型的空间智能评估与优化实践
  • 二分算法原理、实现与工程实践全解析
  • 大模型内容生成对平台流量与创作者生态的影响分析
  • AI智能体开发实战:从架构设计到部署优化
  • Python数据分析(三):NumPy数组操作与矩阵计算
  • 专科生必备:AI降重工具实战指南与避坑技巧
  • 正则表达式实战:从基础到高效应用的完整指南
  • Agent 架构七大反模式:七月生产环境踩坑总结
  • iPhone数据恢复实战:原理、工具与关键技巧