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

FreeRTOS【16】直达任务通知使用

1.开发背景

        直达任务通知,FreeRTOS 的线程任务提供的接口,可以用作线程唤醒,或者是传递数据,因为是基于线程本身的操作,是轻量级,速度响应更快,适合小内存芯片使用。

        事实上本人使用得比较少,常用的项目内存都比较多,对响应时间也没有特别苛刻,需要快速响应的最好还是硬实时中断。直达任务通知实际上操作的都是一个 32bit 的数据,操作的类型有5 种,如下。

/* Actions that can be performed when vTaskNotify() is called. */
typedef enum
{eNoAction = 0,				/* Notify the task without updating its notify value. */eSetBits,					/* Set bits in the task's notification value. */eIncrement,					/* Increment the task's notification value. */eSetValueWithOverwrite,		/* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */eSetValueWithoutOverwrite	/* Set the task's notification value if the previous value has been read by the task. */
} eNotifyAction;

2.开发需求

设计实验:

        创建 2 个线程,一个线程等待唤醒,另一个线程则是通过不同的方式定时唤醒

3.开发环境

        window10 + MDK + STM32F429 + FreeRTOS10.3.1

4.实现步骤

4.1 实现编码

xTaskNotifyWait 接收需要注意的参数是

ulBitsToClearOnEntry        写入 0xFFFFFFFF 在调用前清除所有位

ulBitsToClearOnExit          写入 0xFFFFFFFF 在成功触发后清除所有位

#include "appTest.h"#include <stdio.h>
#include <string.h>
#include <stdlib.h>#include "mspDwt.h"
#include "mspGpio.h"
#include "mspExti.h"#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "stream_buffer.h"
#include "event_groups.h"#include "appLog.h"typedef struct
{/* 任务线程 */TaskHandle_t task1;     // 线程TaskHandle_t task2;     // 线程}Ctrl_t;/* 文件指针 */
static Ctrl_t s_ctrl = {0};
static Ctrl_t *p = &s_ctrl;
static void Task1(void *pvParameters);
static void Task2(void *pvParameters);/* 接收线程 */
static void Task1(void *pvParameters)
{vTaskDelay(100);/* 唤醒 */vTaskDelay(100);xTaskNotifyGive(p->task2);Log_Debug("%s xTaskNotifyGive\r\n", __func__);/* 唤醒 */vTaskDelay(100);xTaskNotify(p->task2, 0, eNoAction);Log_Debug("%s xTaskNotify eNoAction\r\n", __func__);/* 传递数据 */vTaskDelay(100);unsigned int value = 0x12345678;xTaskNotify(p->task2, value, eSetValueWithoutOverwrite);Log_Debug("%s xTaskNotify eSetValueWithoutOverwrite\r\n", __func__);xTaskNotify(p->task2, value << 4, eSetValueWithOverwrite);Log_Debug("%s xTaskNotify eSetValueWithOverwrite\r\n", __func__);/* 数据自增 */vTaskDelay(100);xTaskNotify(p->task2, 0, eIncrement);Log_Debug("%s xTaskNotify eIncrement\r\n", __func__);/* 修改部分位 */vTaskDelay(100);xTaskNotify(p->task2, 0xAB00, eSetBits);Log_Debug("%s xTaskNotify eSetBits\r\n", __func__);for ( ; ; ){vTaskDelay(1000);}
}/* 发送线程 */
static void Task2(void *pvParameters)
{vTaskDelay(100);/* 等待唤醒 */ulTaskNotifyTake(pdTRUE, portMAX_DELAY);Log_Debug("%s ulTaskNotifyTake OK\r\n", __func__);/* 等待唤醒 */ulTaskNotifyTake(pdTRUE, portMAX_DELAY);Log_Debug("%s ulTaskNotifyTake OK\r\n", __func__);for ( ; ; ){/* 等待接收数据 */unsigned int value = 0;xTaskNotifyWait(0xFFFFFFFF, 0xFFFFFFFF, &value, portMAX_DELAY);Log_Debug("%s xTaskNotifyWait OK, value = 0x%.8X\r\n", __func__, value);vTaskDelay(10);}
}/* 测试初始化 */
void aTest_Init(void)
{/* 创建动态任务 */xTaskCreate(Task1, "Task1", 500, NULL, 5, &p->task1);xTaskCreate(Task2, "Task2", 500, NULL, 5, &p->task2);
}/* Key2 PC13   Key0 PH3 Key1 PH2 */
void Exti13_TriggerInterrupt(void)
{mspExti_Close(13);if (mspGpio_GetInput("PC13") == 0){}
}

4.2 结果显示

http://www.lryc.cn/news/361413.html

相关文章:

  • 关于软件<PDF文档管理系统V1.0>的介绍
  • Java面试题-Tomcat初级面试题
  • 红队内网攻防渗透:内网渗透之windows内网权限提升技术:数据库篇
  • rust嵌入式开发之总结
  • 【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版6(附带项目源码)
  • 回溯算法指组合总和
  • java-stream转换map key重复报错解决小记
  • 王春城 | 如何解决精益转型过程中的信任问题?
  • Ubuntu Nvidia Docker单机多卡环境配置
  • 小公司的软件开发IT工具箱
  • 代码随想录算法训练营第四十四天| 背包问题、背包问题之滚动数组、416. 分割等和子集
  • 最新一站式AI创作中文系统网站源码+系统部署+支持GPT对话、Midjourney绘画、Suno音乐、GPT-4o文档分析等大模型
  • C# 语言类型(二)—预定义类型之字符串及字符类型简述
  • 微信小程序canvas画图使用百分比适配不同机型屏幕达到任何屏幕比例皆可!完美适配任何机型!指定canvas尺寸适配亦可!保证全网唯一完美
  • Redis-02
  • 如何编辑pdf文件内容?编辑技巧大揭秘,秒变办公达人!
  • Linux Shell Script 编写入门
  • 不是从APP store下载的APP在mac上一直提示有损坏,打不开怎么办?
  • ubuntu22.04部署docker版zlmediakit和源码运行wvp-GB28181-pro
  • MySQL表的增删改查初阶(上篇)
  • Spring Boot 集成 zxing 生成条形码与二维码
  • C# 编程基础:注释、变量、常量、数据类型和自定义类型
  • 网络原理-三
  • 使用Ollama搭建一个免费的聊天机器人
  • 计算机网络之快重传和快恢复以及TCP连接与释放的握手
  • vue 引用第三方库 Swpier轮播图
  • RabbitMQ-直连交换机(direct)使用方法
  • 942. 增减字符串匹配 - 力扣
  • 2024华为OD机试真题-机器人搬砖-C++(C卷D卷)
  • 【DevOps】深入了解RabbitMQ:AMQP协议基础、消息队列工作原理和应用场景