介绍
嵌入式严禁大量零散全局变量!
// 禁止!!!垃圾代码
int temp;
int humi;
int fan_flag;
int timer_count;
int sample_interval;
正确规范:用 结构体 把所有全局变量打包成 一个结构体变量。
开发规范
1. 防止全局变量泛滥
- 变量多了,不知道谁改的
- 调试极难
- 容易被意外篡改导致死机
2. 防止多线程冲突
结构体统一管理,方便加锁
3. 方便保存到 Flash / 固件升级
直接存整个结构体,不用一个个变量存
4. 代码可读性提升 10 倍
别人一看就知道:
这是一个模块的所有配置/状态
例子
结构体聚合全局变量
1. 定义头文件
创建文件,如:global_var.h,内容如下:
#ifndef __GLOBAL_VAR_H__
#define __GLOBAL_VAR_H__
#include <stdint.h>
// 定义结构体
typedef struct {
float temp;
float humi;
} Sht40Stat_t;
// 对外接口
const Sht40Stat_t* GlobalVar_Get_Sht40Stat(void);
int GlobalVar_Set_Sht40_TempHumi(float temp, float humi);
int GlobalVar_Set_Sht40(const Sht40Stat_t* stat);
#endif
定义结构体 Sht40Stat_t,与之相关的所有全局变量放在结构体中
2. 实现
创建文件,如:global_var.c,内容如下:
#include "global_var.h"
// 唯一静态全局变量
static Sht40Stat_t g_sht40Stat;
const Sht40Stat_t* GlobalVar_Get_Sht40Stat(void)
{
return &g_sht40Stat;
}
int GlobalVar_Set_Sht40_TempHumi(float temp, float humi)
{
g_sht40Stat.temp = temp;
g_sht40Stat.humi = humi;
return 0;
}
int GlobalVar_Set_Sht40(const Sht40Stat_t* stat)
{
g_sht40Stat = *stat;
}
在别的文件调用
第一步:包含头文件
#include "global_var.h" // 👈 必须加这一行
第二步:修改变量
GlobalVar_Set_Sht40_TempHumi(temp,humi);
// 1. 定义一个新配置
Sht40Stat_t new_stat = {
.temp = 28.0f,
.humi = 60.0f,
.fan_enable = 1,
.sample_ms = 1000,
};
// 2. 调用设置函数
GlobalVar_Set_Sht40(&new_stat);
第三步:读取变量
// 读取配置
const AgriConfig_t *cfg = Agri_GetConfig();
// 然后就能用里面的参数
float temp = cfg->temp;
uint32_t time = cfg->sample_ms;
总结
- 禁止零散全局变量
- 同类变量打包成结构体
- 用 static 私有化全局结构体
- 对外只提供读/写函数接口