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 (10) /* 事件位 */ #define EVENTBIT_1 (11) #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]); } } }

相关新闻

最新新闻

【XP11/12】Toliss机模A320/A330/A220/A340和谐版全家桶

【XP11/12】Toliss机模A320/A330/A220/A340和谐版全家桶

更新时间:2026年7月20日下载目录中含有下面这些:TolissA220-100 v1.7.2 TolissA220-300 v1.0.2 TolissA330-900v1.1.0 TolissA319加小平板 TolissA320加小平板 TolissA340-600免费下载免费下载!!!倒卖的滚开下载链接&a…

2026/7/27 7:49:03
CVE-2023-2928漏洞深度剖析:从PHP文件包含到DedeCMS getshell实战

CVE-2023-2928漏洞深度剖析:从PHP文件包含到DedeCMS getshell实战

1. 项目概述:一次从漏洞公告到实战利用的完整复盘最近在安全圈里,DedeCMS又因为一个编号为CVE-2023-2928的文件包含漏洞被推上了风口浪尖。这个漏洞的利用链最终能导致远程getshell,对于任何一个还在使用老版本DedeCMS的站点来说,…

2026/7/27 7:49:03
HarmonyOS 应用开发《掌上英语》第58篇:布局层级优化——减少嵌套以提升渲染性能

HarmonyOS 应用开发《掌上英语》第58篇:布局层级优化——减少嵌套以提升渲染性能

布局层级优化——减少嵌套以提升渲染性能一、布局层级对性能的影响 在 ArkTS 声明式 UI 开发中,组件以树状结构组织。每个组件节点在渲染时都需要进行测量(Measure)和布局(Layout)两个阶段: 测量阶段&#…

2026/7/27 7:49:03
学 Simulink—— 磁力计校准与地磁干扰抑制算法仿真

学 Simulink—— 磁力计校准与地磁干扰抑制算法仿真

目录 手把手教你学 Simulink —— 磁力计校准与地磁干扰抑制算法仿真 一、为什么要做磁力计校准 + 干扰抑制? 1.1 磁力计在导航中的角色 1.2 主要误差来源 二、仿真总体架构 三、关键参数(教学默认) 四、Simulink 建模 Step‑by‑Step Step ① —— 真实姿态与地磁…

2026/7/27 7:49:03
Java枚举深度解析:从基础到高级应用

Java枚举深度解析:从基础到高级应用

1. Java枚举深度解析:从基础使用到企业级实践在Java开发中,枚举(Enum)是一个既基础又强大的特性。我第一次在项目中使用枚举是在处理订单状态流转时,当时用常量类定义状态码导致代码难以维护。自从改用枚举后&#xff…

2026/7/27 7:49:03
Android App Startup库:优化组件初始化的Jetpack利器

Android App Startup库:优化组件初始化的Jetpack利器

1. App Startup库的核心价值解析在Android应用开发中,组件初始化一直是个令人头疼的问题。传统做法通常会在Application.onCreate()中集中初始化各种库和组件,或者滥用ContentProvider进行隐式初始化。这两种方式都存在明显缺陷:前者导致启动…

2026/7/27 7:44:03

月新闻