初始化函数的用法-节约flash空间的“妙计”

文章目录

前言

前一段时间排查问题时发现Simulink模型生成的代码中有意思的操作,后面思考了一下,才恍然大悟,本文对思考进行总结。

变量存储的区域

熟悉MCU内存的小伙伴应该知道,bss段和data段的差异,不知道的我可以再简单介绍下:

.bss 段:未初始化或初始化为 0 的全局变量,不占用 Flash 空间 ,仅在 RAM 中分配。

.data 段:初始化为非 0 值的全局变量,既占用 RAM 也占用 Flash (用于存储初始值)

bss段和data段的初始化一般在MCU启动代码中执行,bss段直接对ram赋值为0,data段需要从对应的flash空间copy数据到ram

模型生成代码的思考

模型中定义了一个带初始值的全局变量,但是在生成代码时并没有生成带初始值的全局变量,而是一个没有初值的变量。示例如下:

复制代码
int g_configVal = 0; 

在初始化的函数中,对该变量进行赋值:

复制代码
void nb_init(void)
{
	 g_configVal = 1;
}

这样生成代码能够节约变量所占用的flash空间,可能有善于思考小伙伴又要问了,你这初始化函数编译使用不是也要占用flash空间么,确实是这样,所以实际需不需要在初始化函数中进行变量赋值,取决于要初始化的变量有多少,理论上来说,变量越多在初始化中进行赋值越节约flash空间。以下占用情况仅供参考,没有实测过

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    Flash 占用对比曲线                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  变量数量    直接初始化    函数初始化    哪种更优           │
│  ─────────────────────────────────────────────────         │
│     1 个         4 字节        ~10 字节    ✅ 直接初始化     │
│     2 个         8 字节        ~12 字节    ✅ 直接初始化     │
│     3 个        12 字节        ~15 字节    ✅ 直接初始化    │
│     4 个        16 字节        ~18 字节    ✅ 直接初始化     │
│     5 个        20 字节        ~20 字节    ⚖️ 基本持平          │
│    10 个        40 字节        ~30 字节    ✅ 函数初始化     │
│                                                             │
│  💡 临界点:约 5 个变量时开始划算                          │
└─────────────────────────────────────────────────────────────┘

同时,也要考虑Flash空间(一般MCU现在Flash都比较大,很少存在flash不够用的情况),如果flash完全够用,也没必要在初始化函数中赋值来初始化了。

总结

合理选择初始化方式,在代码优化中也是能够有一定帮助的,需要注意的时,如果选择在初始化函数中进行初始化变量,一定不要忘记对初始化函数进行调用~

相关推荐
赞哥哥s2 天前
Autosar网络管理笔记-被动唤醒和主动请求时Nm报文发送的差异
autosar·网络管理·nm
硅农深芯3 天前
解读AUTOSAR:定义现代汽车电子的标准化架构
架构·汽车·autosar
普中科技3 天前
【普中STM32F1xx开发攻略--标准库版】-- 第 49 章 FLASH 字库实验
stm32·单片机·嵌入式硬件·flash·gbk·字库·普中科技
叶修_A9 天前
【IF-SAFE-05】MTU内存测试 - ASIL-B安全机制
autosar
飞斯柯罗11 天前
[飞斯柯罗] 为满足网络安全要求,是否必须使用AUTOSAR?
autosar·crypto·mcal·软件复用·汽车网络安全·iso21434·控制器开发
叶修_A12 天前
【CP-11】复杂驱动设计 - AUTOSAR CP驱动架构与实现
架构·嵌入式·autosar·cp·驱动设计
赞哥哥s15 天前
诊断请求1101到MCU复位的完整流程
autosar·dcm·1101
无畏jh18 天前
CCFC3008PCSN与Vector适配经验分享
autosar·国产化·汽车嵌入式·ccfc3008pcsn
sramdram19 天前
SPI NOR FLASH芯片512Kb位串行NOR闪存设计方案
flash·nor flash芯片·spi nor flash·flash芯片
车软派开发学长23 天前
零基础学习车软嵌入式AUTOSAR,以一帧CAN报文实战讲解AUTOSAR的学习
网络·stm32·车载系统·autosar·嵌入式实时数据库