FreeRTOS 上报任务设计---UplinkTask 上行数据上报任务详解

🎬 渡水无言个人主页渡水无言

专栏传送门 : 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》

专栏传送门 : 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏

专栏传送门《产品测评专栏》《Ai智能体专栏

⭐️流水不争先,争的是滔滔不绝

📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生

| 省级优秀毕业生获得者 | csdn新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生

在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连

目录

前言

[一、UplinkTask 任务定位](#一、UplinkTask 任务定位)

二、全局时序交互图

[三、UplinkTask 完整代码](#三、UplinkTask 完整代码)

总结


前言

在前面的系列文章中,我们已经搭建起机器人下位机的三大核心任务:

CommTask 实现上位机指令解析。

ControlTask 完成底盘运动控制闭环。

SensorTask 构建整机状态感知体系。

SensorTask 通过系统状态快照机制,统一采集并缓存了电池电压、轮速、IMU 姿态等关键数据,但这些数据只有上传到上位机,才能实现可视化监控、远程调试、状态诊断等功能。

因此本篇我们实现 UplinkTask 上行数据上报任务 ,它专门负责:定时读取状态快照 → 协议组帧 → DMA 串口发送 → 上传至上位机


一、UplinkTask 任务定位

UplinkTask 是纯数据输出任务,不操作任何硬件传感器,只做三件事:

固定周期从 系统状态快照 安全读取系统状态。

按通信协议打包状态帧。

通过 USART1 + DMA 异步发送到上位机。

二、全局时序交互图

下面是整个系统 采集 → 快照 → 上报 → 发送 的完整时序流程,是整篇文章的核心图:

SensorTask 周期采集传感器数据,并原子写入全局快照。

UplinkTask 周期读取快照,不影响采集任务。

协议层组帧后,通过 DMA 异步发送。

发送完成 / 失败由 HAL 回调通知,释放发送标志。

发送繁忙时自动丢弃,不阻塞、不堆积。

全程无任务阻塞,架构干净、稳定、高效。

三、UplinkTask 完整代码

总体流程:

代码如下:

cpp 复制代码
/**
 ****************************************************************************************************
 * @file        uplink_task.c
 * @brief       上行状态上报任务(Uplink Task)
 * 本任务用于周期性向上位机发送系统状态信息,典型流程为:
 *
 *   SensorTask / ControlTask
 *           ↓
 *   SensorSnap_Get()(获取一次完整快照)
 *           ↓
 *   UplinkProto_SendStatus()
 *           ↓
 *   UART 发送(协议帧)
 *
****************************************************************************************************
 */

#include "uplink_task.h"
#include "FreeRTOS.h"
#include "task.h"
#include <stdint.h>
#include "log_task.h"
#include "control_task.h"
#include "uplink_proto.h"
#include "sensor_task.h"
#include "usart.h"
#include "protocol.h"
#include "monitor_task.h"

/* 上行周期(ms):1s 上报一次状态 */
#define UPLINK_PERIOD_MS      (1000u)

/**
 * @brief   上行状态上报任务入口
 * @details 周期性读取快照 → 协议组帧 → 串口DMA发送
 */
void KaoYaApp_UplinkTask(void *argument)
{
    (void)argument;

    /* 帧序号(用于上位机检测丢包/乱序) */
    uint8_t seq = 0;

    /* 初始化上行协议模块 */
    UplinkProto_Init();

    /* 上行协议帧缓存 */
    proto_uplink_t tx;

    /* 系统状态快照 */
    proto_status_t st;

    /* 周期调度基准 */
    TickType_t last_wake = xTaskGetTickCount();

    for (;;)
    {
        /* 1. 任务心跳:监控任务是否正常运行 */
        MON_HB_UPLINK();

        /* 2. 线程安全读取全局状态快照 */
        SensorSnap_Get(&st);

        /* 3. 协议打包并发送状态帧 */
        UplinkProto_SendStatus(&tx, seq++,
                               st.battery_mv, st.temp,
                               st.vx, st.vy, st.vz,
                               st.gx, st.gy, st.gz,
                               st.ax, st.ay, st.az);

#if UPLINK_KAOYATEACH_ENABLE
        /* 调试打印:上报内容输出 */
        uint32_t seq_sent = (uint32_t)(seq - 1u);
        LOGKAOYA_T("UPLINK", "==================UPLINK==================");
        LOGKAOYA_T("UPLINK", "【上报】STATUS 已发送:seq=%lu", (unsigned long)seq_sent);
        LOGKAOYA_T("UPLINK", "【电池】BAT=%u mV", (unsigned int)st.battery_mv);
        LOGKAOYA_T("UPLINK", "【温度】TEMP=%d C", (int)st.temp);
        LOGKAOYA_T("UPLINK", "【速度】v(mm/s)=(%d,%d,%d)", (int)st.vx, (int)st.vy, (int)st.vz);
        LOGKAOYA_T("UPLINK", "【角速度】g(0.01deg/s)=(%d,%d,%d)", (int)st.gx, (int)st.gy, (int)st.gz);
        LOGKAOYA_T("UPLINK", "【加速度】a(mg)=(%d,%d,%d)", (int)st.ax, (int)st.ay, (int)st.az);
#endif

        /* 4. 固定周期延时:1秒上报一次 */
        vTaskDelayUntil(&last_wake, pdMS_TO_TICKS(UPLINK_PERIOD_MS));
    }
}

总结

本篇实现的 UplinkTask 上行上报任务,与前面的 SensorTask 完美配合,实现数据上报功能。

相关推荐
&Hello Code3 小时前
2.一套可落地的 STM32 六层架构:基础工程框架搭建
stm32·嵌入式硬件·架构
大辉狼_音频架构3 小时前
AudioReach:Tinyalsa PCM Plugin 机制
嵌入式·音视频开发
躺不平的理查德4 小时前
STM32 上拉和下拉
stm32·单片机·嵌入式硬件
czy87874758 小时前
modbus tcp 在线OTA升级407
stm32·嵌入式硬件
feasibility.9 小时前
从数字智能到物理智能体:深度解构具身智能时代的边缘计算、嵌入式实时系统与多形态智能体
人工智能·机器人·自动驾驶·嵌入式·无人机·具身智能·智能体
茉莉玫瑰花茶1 天前
Windows 平台下的 UDP 客户端
stm32·单片机·嵌入式硬件
笔夏1 天前
【移芯平台CAT1模组】烧写固件
stm32·单片机·学习
十月的皮皮1 天前
STM32从零到量产开发:四路继电器工业控制模块开发— 继电器模块bsp_di.h与 bsp_di.c文件
c语言·stm32·stm32cubemx·hal库
wuyk5551 天前
67.嵌入式C语言进阶:结构体指针实战指南——STM32外设、传感器数据访问的高效技巧
c语言·开发语言·stm32·单片机
ajassi20001 天前
AI语音智能体开发日记(一)如何为“小智”服务器启用并调试 License 功能
笔记·ai·嵌入式·ai编程