首页 > 其他分享 >Keil编译后的Code,RO,RW,ZI等相关

Keil编译后的Code,RO,RW,ZI等相关

时间:2024-05-08 09:45:45浏览次数:18  
标签:Code ZI STM32F407ZGT6 Keil SRAM Flash RW RO

在使用keil开发STM32应用程序时,点击Build后在Build Output窗口中经常会有如下信息:

以前一直好奇这几个参数和实际使用的STM32芯片中Flash和SRAM的对应关系,于是上网搜了一圈,做如下总结:

  • 这些参数的单位是Byte
  • 图中几个参数分别代表 
    • Code:代码的大小
    • RO:常量所占空间(加了const修饰)
    • RW:程序中已经初始化的变量所占空间。
    • ZI:未初始化的static变量全局变量以及堆、栈所占的空间
  • 上述参数和芯片Flash以及SRAM的对应关系是 
    • Flash占用大小=Code+RO+RW
    • SRAM占用大小=RW+ZI

不知道有没有人会像我一样好奇为什么RW参数同时参与了Flash和SRAM占用量的计算。这是因为Flash部分的属性是Read-Only的,而SRAM虽然是Read-Write但里面数据不能掉电保存,所以只能把已经初始化的值保存到ROM里,上电后再拷贝到SRAM中进行读写操作,即两部分都需要留出RW变量所占用的空间。

在此我参照着用STM32F407ZGT6图解一下。

STM32F407ZGT6的Flash大小为1MB,SRAM大小为(128KB+64KB)。这里SRAM之所以分开表示是因为在芯片内部前面的128KB和后面的64KB地址不是连续的,后面的64KB在ST官方叫做CCM (core coupled memory) ,据说是由内核直接访问的,不能由外设访问(见原帖2楼。下面给出的示意图中只标出了前面的128KB的SRAM空间。红色部分表示STM32F407ZGT6提供的Flash和SRAM大小。

结合上图说下STM32F407ZGT6的启动过程(采用Cortex-M4、Cortex-M3内核的芯片基本都是这个过程):上电后首先从 0x00000000(映射到0x08000000,这里只考虑从内部Flash启动)处获得中断向量表,然后在运行用户代码之前会【在标号2处】有一段引导代码负责把存在Flash中的初始化变量的值Copy到SRAM中对应的变量位置(标号3),之后把ZI区全部清零(标号4),之后才正式开始运行用户代码(标号5)。

 

标签:Code,ZI,STM32F407ZGT6,Keil,SRAM,Flash,RW,RO
From: https://www.cnblogs.com/icaowu/p/18178989

相关文章

  • 华为云开发者桌面全新发布CodeArts IDE for Python,极致优雅云原生开发体验
    本文分享自华为云社区《华为云发布CodeArtsIDEforPython,极致优雅云原生开发体验》,作者:华为云头条。近日,华为云正式发布CodeArtsIDEforPython,这是一款内置华为自主创新的Python语言服务,提供智能编程、灵活调试能力的可扩展桌面开发工具,为华为云开发者提供卓越Python编码体验......
  • HashCode 为什么使用 31 作为乘数?
    为什么java的hashcode的选用31次方?以下是java源码部分publicinthashCode(){inth=hash;if(h==0&&value.length>0){charval[]=value;for(inti=0;i<value.length;i++){h=31*h+val[i];......
  • QRCoderHelper-二维码的操作工具类
    /***┌──────────────────────────────────────────────────────────────┐*│描述:二维码QRCoder的操作工具类(QRCoder1.5.1)*│作者:执笔小白*│版本:1.0*│创建时间:2023-06-2216:21:56*......
  • ATcoder ABC 352 F - Estimate Order 搜索
    很恶心的一个搜索,当然好像不用搜索也能做。没啥好讲的,一个联通块大小>=2就要搜索找位置,联通块大小等于1的不用搜。能调出来也是真不容易。#include<bits/stdc++.h>#defineintlonglong#defineDBdoubleusingnamespacestd;intn,m,tsiz,yinum;constintN=23;intfa[......
  • Leetcode --- 203. 移除链表元素
    题目描述给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val==val 的节点,并返回 新的头节点 。示例1: 示例输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]输入:head=[7,7,7,7],val=7输出:[]参考实现方式1、使用递归实现......
  • 免费的visual studio智能代码插件——CodeGeeX
    CodeGeeX是什么?什么是CodeGeeX?CodeGeeX是一款基于大模型的智能编程助手,它可以实现代码的生成与补全,自动为代码添加注释,不同编程语言的代码间实现互译,针对技术和代码问题的智能问答,当然还包括代码解释,生成单元测试,实现代码审查,修复代码bug等非常丰富的功能。CodeGeeX是一款基于......
  • vscode配置C环境
    已经安装了gccC:\Users\ychen>gcc-vUsingbuilt-inspecs.COLLECT_GCC=gccCOLLECT_LTO_WRAPPER=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/lto-wrapper.exeTarget:x86_64-w64-mingw32Configuredwith:../gcc-13.2.0/configure--prefix=/mingw64......
  • 加密压缩文件zip&tar
    加密一些机密的文件使用zip加密加密过程#zip-repackageTest.zippackageTest#或者写为明文密码zip-rPyourpasswordpackageTest.zippackageTestEnterpassword:Verifypassword:adding:packageTest/(stored0%)adding:packageTest/a.txt(stored0%)add......
  • leedcode-分发饼干(贪心算法)
    自己写的,没有使用排序,会超出时间限制:classSolution:deffindContentChildren(self,g:List[int],s:List[int])->int:iflen(s)==0:return0count=0foriinrange(len(g)):mydict={}forjin......
  • 免费的visual studio智能代码插件——CodeGeeX
    CodeGeeX是什么?什么是CodeGeeX?CodeGeeX是一款基于大模型的智能编程助手,它可以实现代码的生成与补全,自动为代码添加注释,不同编程语言的代码间实现互译,针对技术和代码问题的智能问答,当然还包括代码解释,生成单元测试,实现代码审查,修复代码bug等非常丰富的功能。CodeGeeX是一款基于......