简单理解:全局变量默认存放在 RAM 📅 2026/6/30 11:29:03 1、先讲核心全局变量默认存放在 RAMRF433一定是一个全局结构体变量定义在函数外面所有函数都能访问。 C 语言的存储规则全局未初始化变量 / 全局初始化变量 → 存放在RAM内存只有常量字符串、const修饰的只读全局数据、程序代码才存放在Flash。你这句代码RF433.RF433_Address_CodeSave 0xABCD;就是修改RAM 里的全局变量值。2、RAM 和 Flash 存放内容区别RF433 结构体RAM上电之后单片机从 Flash 读取保存的遥控器地址复制到 RAM 里的RF433.RF433_Address_CodeSave。 程序运行过程中每次收到 433 无线数据都是拿RAM 里这个地址和遥控器发送的地址做比对匹配成功才执行按键动作。断电之后RAM 数据会全部丢失你在这里直接赋值修改当前程序立刻生效不用重启。EEPROM_Type 写入的区域FlashFlash 属于非易失存储器断电数据不会丢。 你把解绑标志、遥控器原始地址写入 Flash 第 61 页作用是下次上电重新从 Flash 把地址读到 RAM 的 RF433 变量里。3、举个上电完整流程就懂单片机上电从 Flash 第 61 页读取保存的遥控器地址、对码标记把读到的地址赋值给RF433.RF433_Address_CodeSave放到 RAM 全局变量程序循环接收 433 信号用 RAM 里的这个地址校验遥控器你调用清空函数时Flash 里解绑标记改成 0永久清除绑定记录手动把 RAM 里正在用的地址改成无效值0xABCD当前运行立刻停止匹配旧遥控器 如果不修改这行 RAM 变量只要不重启程序依旧拿着上次从 Flash 加载到 RAM 的旧地址匹配遥控器。补充小误区很多人误以为变量存在 Flash 普通全局变量只能存 RAMFlash 只能存程序代码const 常量你手动调用 Flash 写入函数存放的配置参数需要上电主动读取拷贝到 RAM 才能使用。一、从代码使用方式就能判断它是全局变量RF433.RF433_Address_CodeSave 0xABCD;依据 1函数内部直接使用没有局部定义这个变量既没有在DrvRF433ClearAddr函数内部定义也没有通过函数参数传进来却能直接访问使用。 C 语言变量作用域规则局部变量只能在当前大括号{}内使用出函数就失效如果不是局部、不是形参、不是静态局部能在任意函数直接调用的结构体变量只能是全局变量。依据 2业务场景逻辑决定它必须是全局这个变量用来保存当前系统正在使用的 433 遥控器地址遥控器中断接收函数要读取它做地址校验对码函数要更新保存遥控器地址你这个清空解绑函数也要修改它 需要在多个不同函数之间共享同一个状态局部变量根本做不到只有全局变量可以跨函数访问。依据 3如果是局部变量会直接编译报错假设RF433是局部变量 只能在某一个函数内定义别的函数用的时候编译器会报「未定义标识符」错误。 你现在能正常编译运行说明该变量定义在所有函数外部属于全局作用域。二、全局变量默认存储位置RAM普通全局变量、未初始化全局变量存储在 RAM 数据段上电可用断电数据丢失const修饰的全局常量才会存放至 Flash函数内局部变量存储在 RAM 栈区你这里没有加const修饰所以RF433这个全局结构体一定存放在 RAM 中。三、补充两种特殊情况排除如果是static全局变量 只是限制只能在当前.c文件内访问存储位置依旧是 RAM不改变存储区域。如果是局部静态变量static 依然在 RAM且只能当前函数访问不可能跨函数多处调用。综上从代码调用方式 项目业务场景可以确定RF433是普通全局变量存储在 RAM。