BMS系统专栏:CommTask通信管理任务

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

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

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

专栏传送门《产品测评专栏》 《Ai智能体专栏) 《ROS开发专栏

专栏传送门 :《BMS专栏

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

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

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

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

目录

前言

一、任务定位与调用关系

二、freeertos完整源码

总结


前言

前面已经讲解完采集、保护、SOC 算法、充放电均衡、调试打印五大核心任务,本期博客介绍整套架构最后一个任务:CommTask通信管理任务。

该任务作为 BMS 与外部设备(上位机、触摸屏、储能逆变器)交互的统一入口,当前为预留空框架,未集成具体通信协议,后期可快速对接自定义串口协议。

整体调度规则、优先级、栈配置和 Info 信息任务保持统一,通信优先级最低,保障电池保护、采集等高实时业务优先运行。


一、任务定位与调用关系

数据上行:打包 SOC、电压、电流、温度、故障、均衡状态上传上位机;

指令下行:接收远程指令,遥控充放电、均衡开关、参数配置;

整套任务优先级排序(数值越大优先级越低)

Protect > Monitor > Analysis > Energy > Info > Comm

调用栈

cpp 复制代码
BMS_CommInit                 // 通信任务初始化、创建线程
└── BMS_CommTaskEntry        // 2000ms周期主循环,预留通信处理逻辑

二、freeertos完整源码

cpp 复制代码
#define BMS_DBG_TAG "Comm"

#include <stdio.h>
// FreeRTOS内核头文件
#include "FreeRTOS.h"
#include "task.h"

#include "main.h"
#include "bms_comm.h"

// 底层硬件驱动
#include "bms_hal_monitor.h"
#include "bms_hal_control.h"

// 全业务全局数据
#include "bms_monitor.h"
#include "bms_energy.h"
#include "bms_analysis.h"
#include "bms_global.h"
#include "bms_debug.h"

// 任务配置参数
#define COMM_TASK_STACK_SIZE	512U	
#define COMM_TASK_PRIORITY		13U
#define COMM_TASK_TIMESLICE	25U
#define COMM_TASK_PERIOD		2000U

static void BMS_CommTaskEntry(void *pvParameters);

// 通信任务初始化
void BMS_CommInit(void)
{
	BaseType_t xRet;
	TaskHandle_t commHandle = NULL;

	xRet = xTaskCreate(
		BMS_CommTaskEntry,
		"CommTask",
		COMM_TASK_STACK_SIZE,
		NULL,
		COMM_TASK_PRIORITY,
		&commHandle
	);

	if (xRet != pdPASS)
	{
		BMS_ERROR("Create Comm Task Fail\r\n");
	}
}

// 通信任务主循环,预留通信业务处理区域
static void BMS_CommTaskEntry(void *pvParameters)
{
	(void)pvParameters;
	BMS_INFO("Communication task ready, waiting protocol development");

	while(1)
	{	
		// ====================待开发区域====================
		// 1.Modbus RTU报文接收、CRC校验、指令解析
		// 2.CAN报文组包,上传电池实时数据
		// 3.上位机遥控指令处理:启停充放电、均衡开关、故障复位
		// 4.定时上报SOC、压差、温度、故障码等整机参数
		// ==================================================

		// 周期阻塞延时,让出CPU给高优先级安全任务
		vTaskDelay(pdMS_TO_TICKS(COMM_TASK_PERIOD));
	}
}

BMS 通信任务上电由BMS_CommInit调用 FreeRTOS 接口周期创建后台线程,任务以 2000ms 为周期循环阻塞运行,当前预留空白业务处理区域,暂无实际收发逻辑,后期可在此添加 Modbus、CAN 等通信代码,实现电池数据向上位机上报、远程控制指令解析功能;该任务整机优先级最低,运行时主动让出 CPU,保障采集、保护等高实时性电池业务优先调度。


总结

本期博客介绍了本套系统的CommTask通信管理任务。