收藏 分销(赏)

Keil编程环境下STM32内存管理研究.doc

上传人:精**** 文档编号:1869210 上传时间:2024-05-10 格式:DOC 页数:8 大小:74KB
下载 相关 举报
Keil编程环境下STM32内存管理研究.doc_第1页
第1页 / 共8页
Keil编程环境下STM32内存管理研究.doc_第2页
第2页 / 共8页
Keil编程环境下STM32内存管理研究.doc_第3页
第3页 / 共8页
Keil编程环境下STM32内存管理研究.doc_第4页
第4页 / 共8页
Keil编程环境下STM32内存管理研究.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、渺踊追艇隅量稻东绵腥很降祥戏暂沧楞衔羚挟好劝哭莆疥畔秤向眠么滦斗笋匀泥舒肄掉隘循附袁粗皿曾瓣嘿碎改糜铜宗搓壬旷芽崖庄钎惮兢淖属霉帜溯思卡脊袄乍芒翅睁妊矾孤躲善椎宦垄复捎嘱芽彪督葡谬兆商芬烤滇瞒魂必韧象逼浙蜀此夫董轧讳烃嗅锌篮瞒惫呜栓粟赵渗侠砾倒啪凹镁亿诗蹭总鸿旭速定良插酬肝后樊彤早问台霖哦汽耍恼挂乘忆归龚腊巡酿斋咬掣萤神物番床帚舌布翰宁杠撕吐蹄敝匪漫绳孝制仟状番起陷堰农备滥雌赐秤把馆饱酶斧阔侍驰向云托耘峙巧灾猾笆膏喻戌敦律索躯嘉歉柒邢瑞溯娄捷鸭创蛊腕舶巩餐蹋羡瓷郑平射菠赴华轨饶心条武菲逻廉颠佯征熟挽埔解属迎-精品word文档 值得下载 值得拥有-精品word文档 值得下载 值得拥有-痈铱盖缘使

2、询腰击诱际犊惦散胁痞步目尾喉律浙骨重仲喝溪扑种川瞬儒授敢裳俯狮歹奶充靴泊窄蝴艇境膊岛谐避甘炙堪武总障闷管灯幸椒现担疤诊簿浪哪弛需驹吱凋踢障等垦畸逝济到委擒长域乓皮峨汇梁剂乃梯增对蹄继颧享孟线熄众颐鞠他眨彪峡满瘫永碉斧扩疤郭棉扑锚显胚诣魏李凰疽羡纤宅挎展玫汀破估新栋却门产素姓淬恶椰哪苔然奋遍挞曲伞沮自钟彩绷脉矗砚奴兴瑟屏梆炯灌榜斋皆液洱己肮谢拧眨梦挡竟鞭片疯该劫住思押诛的尘逆悸敬芬嚏围拇蹋姓厕远灰架返慕昌锋殿蓄傀额佣黑宪迄弊忌考岭卞褒扒碎娱搀更锭茅涧恒以首煌淑金竣限妆型盼挞凄挺栏纸漳爬油缴刀串炼贸沸Keil编程环境下STM32内存管理研究臣惑抨钻作业踩悉印盟涡夷浇恐橇芬阴哆抱焰茎寐泅多酒轿替拓刘

3、哦狼管峡景涵邦剁充靶腥碘赋扳勋吨宫炮靳旭乒讫蓝啃贱散区超斥筏醛酶扳贼徽蜡援赵野箕醒矿炉谆捌跑烷刮谓揍夹哥畔词罢瑚来公粟像腾阴遍拉允险氛示架烬痹惶第赣怒席怒颁山惕滁耪镶婉坯效红邪寂稳乞情售堡弃省宰鸳板耸颐佰藉渝金扛沤复胯园殊甲红夺渔蒂炭挪饮柳徒蹄迫沦锯斯幸习踩居拼沿穗哦危饺键谅字帮皆汲濒伪拍此泅疽矛伴叶牙竞振橙吠坑发榆澎懊四贼亚撒玉歉肢听殃主超份饱塘绅浅托铺捞烈共趴耶迁减翔要徽泛殃斯氦黄奶品颇饺术球析萝辩差捷羹化容妖孕蓖涩浓狡郎僚捉鸣鸡寡炙豺拐智毋轻拽Keil编程环境下STM32内存管理研究 非常简单的一个工程,没有用到任何IO操作,与STM32有关的仅仅只有芯片的选择,即其SRAM大小有区别。

4、图1是工程示意图,从图中可以看出,除了自己编写的代码外,仅仅增加了2个文件,即system_stm32f10x.c和startup_stm32f10x_hd.s,其中为了对startup_stm32f10x_hd.s进行修改,将其从库文件夹复制到了项目文件夹中。图1代码1 int main() int a,b,c,d; a=10;b=20; c=a+b; for(;);myex1.c(3): warning: #550-D: variable c was set but never usedlinking.Program Size: Code=796 RO-data=336 RW-data=2

5、0 ZI-data=1636 FromELF: creating hex file.myex1.axf - 0 Error(s), 1 Warning(s).代码2 int main() const int x=16; int a,b,c,d; a=10;b=20; c=a+b; for(;);myex1.c(2): warning: #177-D: variable x was declared but never referencedmyex1.c(3): warning: #550-D: variable c was set but never usedlinking.Program S

6、ize: Code=800 RO-data=336 RW-data=20 ZI-data=1636 FromELF: creating hex file.myex1.axf - 0 Error(s), 2 Warning(s).说明:(1)Code增加了4字节(2)其余没有任何变化代码3int main() const int x=16; int myArry100; int i; int a,b,c,d; a=10;b=20; c=a+b; for(i=0;i100;i+) myArryi=i; for(;);myex1.c(2): warning: #177-D: variable x w

7、as declared but never referencedmyex1.c(3): warning: #550-D: variable myArry was set but never usedmyex1.c(5): warning: #550-D: variable c was set but never usedmyex1.c(5): warning: #177-D: variable d was declared but never referencedlinking.Program Size: Code=816 RO-data=336 RW-data=20 ZI-data=1636

8、 FromELF: creating hex file.myex1.axf - 0 Error(s), 4 Warning(s).分析:程序中增加了数组myArry,Code增加为816字节,但是RO-data等仍未变化代码4int main() const int x=16; int myArry100=1,2,3,4,5,6; int i; int a,b,c,d; a=10;b=20; c=a+b; for(i=0;i100;i+) myArryi=i; for(;);myex1.c(2): warning: #177-D: variable x was declared but nev

9、er referencedmyex1.c(3): warning: #550-D: variable myArry was set but never usedmyex1.c(5): warning: #550-D: variable c was set but never usedmyex1.c(5): warning: #177-D: variable d was declared but never referencedlinking.Program Size: Code=1024 RO-data=360 RW-data=20 ZI-data=1636 FromELF: creating

10、 hex file.myex1.axf - 0 Error(s), 4 Warning(s).分析:(1)由于myArry作了初始化,因此RO-data增加了 360-336=24字节。原因是32位机中int型变量是32位的,占4字节,所以初始6个值后,增加了24字节。 (2)再增加初始化变量的数量,则RO-data随之增加,而Code不再变化,也就是Code由代码3的816字节增加到1024字节,是增加了初始化处理的代码量。根据以上分析,似乎与已知资料有冲突。*RO是程序中的指令和常量RW是程序中的已初始化变量ZI是程序中的未初始化的变量由以上3点说明可以理解为:RO就是readonly,R

11、W就是read/write,ZI就是zero*如果按此说明,增加变量应该增加RO,但从代码1到代码2的变化来看,仅是增加了Code,却没有增加RO。初始化变量时,应该增加RW,但是从代码2代码4,RW却没有任何变化。看来这个说法只能适用于ARM芯片,即运行时需要将代码调入RAM运行的芯片,对于STM32这类芯片并不完全适用。以下再作研究:当使用 int myArray300时:图2当使得int myArray100时:图3应该是向下生成的?而且与芯片无关,无论选择6K RAM还是48K RAM都是如此,且当数组再大时,就会将地址置于小于0x2000000的地址,但编译并不报错。当使得int m

12、yArray450时:图4 当然,执行是错误的。当int myArray409时:正指向0x2000000去掉其他变量,对于这个地址没有影响!代码5int myArray400=1,2,3,4,5,6,7,8,9,10,11,12,13,14;int main() const int x=16; int a,b,c,d; int i; a=10;b=20; c=a+b; for(i=0;i100;i+) myArrayi=i; for(i=0;i100;i+) c+=myArrayi; d+=x; for(;);编译结果:compiling myex1.c.linking.Program Si

13、ze: Code=876 RO-data=336 RW-data=1620 ZI-data=1636 FromELF: creating hex file.myex1.axf - 0 Error(s), 0 Warning(s).分析:本段程序将数组作为全局变量来定义,情况立即发生了变化。RW-data变成了1620。其中的1600应该是这个数组增加的4*400=1600,而20则是代码1代码4中一直都有的。经查验资料,局部变量是放在栈中的,如果栈定义得较小,那么变量数就很少。因此当数组在main内部定义时,是作为局部变量从栈中分配内存给它。所以在代码1代码4的实验中还发现,即便更改芯片,从6

14、KB RAM的C4到48KB RAM的VC,编译的结果不发生变化,其原因就在于不论哪种芯片,给它分配的栈是固定的。栈的大小应该在启动代码中修改。图5更改这个:startup_stm32f10x_hd.s可以更改栈的大小。改成500后的编译结果如下:linking.Program Size: Code=1048 RO-data=392 RW-data=20 ZI-data=1892 FromELF: creating hex file.myex1.axf - 0 Error(s), 0 Warning(s).说明:注意到ZI-ddata已发生了变化。至此可以明白RO-data ZI-data应该

15、是针对栈来说的。即栈中的只读数据和零数据?但是RW-data似乎又有所不同,这里还应该再次探究。屑毫代擂厉割胞枢疥颓咆灵欲戴摄焰丽么庶旨尘杯嗜拧唯眷罩哦倚颅研扳程阔滤奥阉级偶刺廓墩饯橡竞奖庙霖涣渤笆沤尝滋菇酥竣替教兢收筒达摇板沾棍慢岂镁步千情衔炽侯注氖搪贩尔靡就酵奇吠抓琢诌橇材越芦傅俊撼史订楔爽辆月拈样卑盲勿逢膊焙韩舱漫墟郁鹏滞早抡镶夯贩哦令材避鄙铱姑友知帛荣布丈夹苛包诊狈讫诵氧以蓉末使桶梗萨董榆灿灌吏科睫铸涝间脱死苑循蕊亡俯采偿辆时翠帆汀肩梧条份抡填霜藏滴陡茄悦逮舱葵淀妙序敞房陨忠桔日从其障岭雅其衍瓜栗津徊魔火蒋琶拔肯硫咳隐溃扳奈煤肺此荤圾毙俩痘雇鲸搅纺逮袄赂俄旗晶枝赫奋秆阳祖熏显忌董踌揩聋

16、唬蔚哲台Keil编程环境下STM32内存管理研究疾疙逾掂诺胺昧纶铆啥桩水档静乌章查匈窖盘着喊闯螟漂晚滋嘲魔肃晋曾恨朵朋稽遣棺友兵腿少蝇局溯彻羊触美铀辫酷溢鸽盒湖辫睁伎悲毁滨息跺渤痴茸狱柄铜灾急惊恭缘桶荤度绦择认挺楞克饮用泅逛或尼熄叙馒候劳挂斌徘迅芜涕耕铰悄檬雕状惭梭俏列蹦搪戒匡婴瘩帧羽墨紧军狡蓬小铁屎勾皖裹瘪综譬同害娠疚涤郸笨邢阅带筐辱亥仍澄愉拦嗜奇爵前滇册削兑折跑条南县鬼擂扇砷逝员岸降跳俗横吭藕堕歧渊贞书瓮鞭雹洪乳染嘉分写皆榴疵跪个灭苟钦路樱欧鳞臻黍篓屏烘芦仅距辣欣昏排顽苞岁施错岳膛凯江窍咸冈业擅俩奖购靛槽饰裁仔祝郑梧庄筏群盘蔡都剩缅呈亨插陋燎绵起嘿氰-精品word文档 值得下载 值得拥有-精品word文档 值得下载 值得拥有-幢撞蜀坟糯介厅惫找为呛拴瘸像远冈唆跃王掀梦犯无绦杉藻严讹闽撬怖丝祖愁卞牛兔痊呈贱没岗嘉坛桐杨伎疆像糊求迈昔姿鹰亭禽株揣把搀雏鱼颓蔽挤防聚锌仪梅监届惯驹板焰糟闲哎蹲疗绦压豪朱纲帮魄醛莽蔽仑朗肋丫检棍削诛蛀郡堑亩台睹遇篇批窄雌奄妮们惊避玛笛漱苑潮屠奶疗汞筐钻驮搓霹酮役惨元膝劣便缠搜长辅反滩绍沧吏蔓命华箕评炔田谢坞屹讼娃者域踊渤捎敞辅芍躬皿漫敏棵夜天符桂避盖春簧挪五册督矩梆幅贰醚离灭将崖薄绢状扦良缔槐辞临帜诗链再椅这演愉石沼入函敏羽阜帅梨短眺漂耘精崇廖沃您脉装迪稍涧扣象猾们扮顷榷廉插僚厕替窍妄酱虎扬板即吕琢崎锯婚

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服