STM32的CodeRORWZI区、FlahRam、堆栈你分清了吗

⭐发布日期:2024年09月25日 | 来源:李洪伙

⭐作者:张星阑 责任编辑:Admin

⭐阅读量:332 评论:3人

【新澳门内部资料精准大全9494港澳论坛】

【今晚一肖一码澳门一肖四不像】

【4949澳门精准资料大全】 【二四六天好彩(944cc)免费资料大全2022】 【澳门全年资料免费大全一】 【澳门王中王100%的资料2024年】 【新澳好彩免费资料查询郢中白雪】 【2024澳门天天开好彩资料?】 【2024港澳免费资料】 【二四六香港资料期期准一】
【澳门码的全部免费的资料】 【2024年新澳资料大全免费查询】 【2024香港港六开奖记录】 【老奇人澳门免费资料公开】 【香港二四六开奖免费资料大全】 【2024澳门六开彩最简单处理】 【新澳资料免费资料大全一】 【新澳2024正版资料免费大全】

以cortex-M3为例,例如STM32F103

这篇文章要讲2个问题:

1、编译出的程序(指令)、变量的存放位置、大小?
2、在代码和keil中,“堆、栈”两者的大小如何设置?

keil编译完成后,会有提示,形如:

Program Size: Code=1148 RO-data=424 RW-data=20 ZI-data=1636

其中:
① Code为代码,本质上就是一大堆ARM指令;
② RO为只读的数据,例如,char *name = "TOM";//TOM三个字符就存放在ROM中作为RO-DATA;char cmd[] = "AT";AT两个字符会在RAM和FLASH中各有一份。有些常量会在RO区中,有些例如立即数,会直接被编译在code区中。
③ RW为非0初始化的全局和静态变量占用的RAM大小.注意:同时还要占用等量的ROM大小用于存放这些非0变量的初值;
④ ZI(zero initialize)为0初始化的内存区的大小(该区域3个用途:
0初始化的全局和静态变量+堆区+栈区)。

下面是keil自动生成的.map文件中的信息:

Flash的占用量就是上图中ROM Size的大小,它包含了①+②+③的大小【ARM指令代码+只读数据+非0初始化变量的初值】
RAM的占用量包含上述③+④的大小,也即【非0初始化变量、0初始化RAM(又分为0初始化静态变量区+堆区+栈区)】

我们用jflash或者其他软件打开hex文件,看一下前四个字节:

0x2000678-0x2000000=0x678=1656,而观察一下前文编译出的信息,正好1656 = RW-data(1636) + ZI-data(20)的大小,这就证明了RAM的大小确实=RW+ZI的大小。

注:hex文件的前4个字节为主堆栈指针MSP的初值。

在STM32的启动文件(.s汇编文件)中,一开始我们会看到 Stack_Size、Heap_Size 这两个汇编宏定义:

Stack指的是栈,栈是由堆栈指针MSP/PSP自动管理的,理论上初始化时给堆栈指针赋值为RAM的最高地址即可,但是用keil编译时,keil并不是按RAM的最高地址生成的HEX前4字节(也即MSP的初值),而是按照:全局和静态变量的容量+Heap_Size+Stack_Size三者之和,作为HEX文件的前4字节。

设置某块芯片的RAM的总大小,是在keil的这个地方设的:

其实讲道理,我觉得keil还是把这个值+RAM起始地址(0x2000000)作为MSP的初值更好,只不过keil不是这么做的,keil仅仅是把这个值用作编译检测:检查全局和局部静态变量(含0初始化和非0初始化两部分)所占的空间+堆区+栈区,它们所占空间之和是否超过了上图红框里的这个值,如果超了就编译报错。这就是上面红框里的值唯一的作用。

根据这段理论,我们也就知道了启动文件中Stack_Size该设为多少了,只要【全局变量+局部静态变量+Heap_Size+Stack_Size】的大小不超过芯片的RAM容量即可。
keil编译时,会把C库函数支持的malloc、free所需的内存指向heap内存区,并且当我们不断的malloc吃内存堆时,malloc函数会检测程序已吃掉的内存堆是否超过Heap_Size,超了的话就会返回NULL。
keil是这样为【全局变量+局部静态变量+ Heap_Size + Stack_Size】分配内存的:

上面论述的是,使用C库函数提供的mallloc时,内存堆heap的使用情形,如果我们不打算使用C库提供的动态内存分配,而打算使用自己写的内存堆管理程序,甚至干脆不打算使用动态内配功能,这些情况下,请直接把Heap_Size设为0。

最后总结一下Stack_Size的设置方法:①在keil中正确设置芯片的RAM大小, ②确定堆区Heap_Size的大小,这个值可以通过调试自己估计出来,如果不使用C库的malloc的话,直接设为0,③把Stack_Size设的越大越好,只要编译不报错,就把Stack_Size往尽可能大了配,否则如上图所示的内存空闲区,在整个程序运行期间,将不被使用,纯属浪费,不如让其作为栈,以增强程序稳定性。

PS:自己写的动态内存管理程序,本质上就是申请一个大数组,自己管理这个数组而已,相当于自己写一套malloc/free函数,很多操作系统中有这样的例子,比如freeRtos、ucos等,这些操作系统都提供了好多种动态内存管理方法,最简单的一种,跟切火腿似的,malloc出来之后就释放不掉了,直到把这个大数组切完拉倒,看似很low的内存管理方法,实际上在很多小型项目上却用起来很方便。更好的内存管理程序,那自然是支持动态切,还要支持把动态释放的空间合并起来,以便把刚才合并起来的空间再次malloc,这些更好的内存管理程序,用起来更方便,但是同时,这种功能强大的内存管理程序自身也会占掉很多RAM / ROM / CPU资源,矛盾利弊共存。到底要使用简单的内存管理还是高级的内存管理,要看项目需求,一般嵌入式操作系统会提供4种以上的内存管理程序供我们选用。

本文转自网络分享,如有侵权请联系本人及时删除。

【2024澳门天天开好彩大全免费】 【新澳天天开奖资料大全最新】
【2024年天天开好彩资料】 【新澳天天开奖资料大全最新54期】
【2024澳门天天开好彩大全53期】 【澳门天天开彩期期精准】
【2024全年资料免费大全】 【新澳天天开奖资料大全】
【澳门内部最精准免费资料】 【2024澳门天天开好彩大全】
【2024年新奥门天天开彩免费资料】 【新澳2024今晚开奖资料】 【王中王精准资料期期中澳门高手】
上一条新闻 下一条新闻

推荐文章

发表评论

唐纳德·富利洛夫

3秒前:下面是keil自动生成的.

IP:77.72.9.*

朴根滢

6秒前:keil是这样为【全局变量+局部静态变量+ Heap_Size + Stack_Size】分配内存的:上面论述的是,使用C库函数提供的mallloc时,内存堆heap的使用情形,如果我们不打算使用C库提供的动态内存分配,而打算使用自己写的内存堆管理程序,甚至干脆不打算使用动态内配功能,这些情况下,请直接把Heap_Size设为0。

IP:29.85.4.*

杰瑞·特林伯

3秒前:设置某块芯片的RAM的总大小,是在keil的这个地方设的:其实讲道理,我觉得keil还是把这个值+RAM起始地址(0x2000000)作为MSP的初值更好,只不过keil不是这么做的,keil仅仅是把这个值用作编译检测:检查全局和局部静态变量(含0初始化和非0初始化两部分)所占的空间+堆区+栈区,它们所占空间之和是否超过了上图红框里的这个值,如果超了就编译报错。

IP:22.55.5.*

李洪伙APP介绍

APP图标

今天晚上澳门三肖兔羊蛇APP名:李洪伙

版本:V3.55.821

更新时间:2024-09-24 24:17

2024今晚新澳门开特马这是一个功能强大的新奥正版全年免费资料APP,可以帮助你完成各种任务。包括最新24小时热点资讯,今日最新:在STM32的启动文件(.

香港开奖结果开奖记录表红绿波球APP介绍

APP图标

澳门资料大全正版免费资料APP名:李洪伙

版本:V4.26.664

更新时间:2024-09-24 23:19

澳门天天六开彩免费年资料这是一个功能强大的管家婆期期四肖四码中特管家APP,可以帮助你完成各种任务。包括最新24小时热点资讯,今日最新:③ RW为非0初始化的全局和静态变量占用的RAM大小.

新澳资料免费大全APP介绍

APP图标

澳门内部一码精准公开APP名:李洪伙

版本:V7.75.408

更新时间:2024-09-24 16:21

澳门最准内部资料这是一个功能强大的澳门六开彩开奖结果记录APP,可以帮助你完成各种任务。包括最新24小时热点资讯,今日最新:map文件中的信息:Flash的占用量就是上图中ROM Size的大小,它包含了①+②+③的大小【ARM指令代码+只读数据+非0初始化变量的初值】RAM的占用量包含上述③+④的大小,也即【非0初始化变量、0初始化RAM(又分为0初始化静态变量区+堆区+栈区)】 我们用jflash或者其他软件打开hex文件,看一下前四个字节:0x2000678-0x2000000=0x678=1656,而观察一下前文编译出的信息,正好1656 = RW-data(1636) + ZI-data(20)的大小,这就证明了RAM的大小确实=RW+ZI的大小。

澳门4949免费正版资料大全APP介绍

APP图标

新澳门2024年正版免费公开APP名:李洪伙

版本:V3.21.747

更新时间:2024-09-24 18:14

一码一码中奖免费公开资料这是一个功能强大的2024澳门特马今晚开奖160期APP,可以帮助你完成各种任务。包括最新24小时热点资讯,今日最新:更好的内存管理程序,那自然是支持动态切,还要支持把动态释放的空间合并起来,以便把刚才合并起来的空间再次malloc,这些更好的内存管理程序,用起来更方便,但是同时,这种功能强大的内存管理程序自身也会占掉很多RAM / ROM / CPU资源,矛盾利弊共存。

今晚澳门六开彩开奖结果和查询APP介绍

APP图标

澳门正版免费全年资料大全问你APP名:李洪伙

版本:V2.68.503

更新时间:2024-09-24 15:16

新奥六合全年免费资料大全这是一个功能强大的澳门天天彩期期精准龙门客栈APP,可以帮助你完成各种任务。包括最新24小时热点资讯,今日最新:keil编译完成后,会有提示,形如:Program Size: Code=1148 RO-data=424 RW-data=20 ZI-data=1636 其中:① Code为代码,本质上就是一大堆ARM指令;② RO为只读的数据,例如,char *name = "TOM";//TOM三个字符就存放在ROM中作为RO-DATA;char cmd[] = "AT";AT两个字符会在RAM和FLASH中各有一份。

新奥彩资料大全最新版APP介绍

APP图标

澳门4949开奖结果最快APP名:李洪伙

版本:V6.61.582

更新时间:2024-09-24 21:16

2021澳门天天开彩这是一个功能强大的澳门一码一肖一待一中四不像APP,可以帮助你完成各种任务。包括最新24小时热点资讯,今日最新:注:hex文件的前4个字节为主堆栈指针MSP的初值。

澳门一肖一码100准APP介绍

APP图标

白小姐三肖中特开奖结果APP名:李洪伙

版本:V4.19.914

更新时间:2024-09-24 16:24

二四六香港资料期期准117图片这是一个功能强大的新澳今晚上9点30开奖结果APP,可以帮助你完成各种任务。包括最新24小时热点资讯,今日最新:s汇编文件)中,一开始我们会看到 Stack_Size、Heap_Size 这两个汇编宏定义: Stack指的是栈,栈是由堆栈指针MSP/PSP自动管理的,理论上初始化时给堆栈指针赋值为RAM的最高地址即可,但是用keil编译时,keil并不是按RAM的最高地址生成的HEX前4字节(也即MSP的初值),而是按照:全局和静态变量的容量+Heap_Size+Stack_Size三者之和,作为HEX文件的前4字节。

新澳门彩最新开奖记录查询表下载APP介绍

APP图标

新澳精准资料大全APP名:李洪伙

版本:V7.92.810

更新时间:2024-09-24 14:20

天天免费好彩看资料大全这是一个功能强大的澳门六开彩开奖记录免特色APP,可以帮助你完成各种任务。包括最新24小时热点资讯,今日最新:以cortex-M3为例,例如STM32F103 这篇文章要讲2个问题:1、编译出的程序(指令)、变量的存放位置、大小?