#1. C51的ROM大小
Keil编译完之后,显示的Program Size: data=9.0 xdata=8 const=15 code=180,则
The Total ROM(const + code + code-gap + const-gap) is 199BYTE
实际生成的bin文件大小:
在.MAP中的C O D E M E M O R Y 中
code-gap为0,cosnt-gap为4,则const + code + const-gap=15 + 180 + 4 = 199,刚好和实际生成的bin文件大小一致。
#2. C51的ROM大小优化
如果实际编译显示的const + code远小于实际的Bin文件,表明有非常大的空隙,需要优化。
优化空间,有几个查找方向:
.A51文件中的代码段起始地址CSEG AT 0xXX是否与Off-chip Code Memory设置的起始位置一致,如果不一致可能导致GAP。
函数及变量指定的绝对地址超出Off-chip Code Memory设置的范围。
interrupt vectors at adress: 0xXX设置的中断向量地址是否超出Off-chip Code Memory设置的范围。interrupt vectors at adress必须设置,因为Keil C51默认的是0x03,可能不在Off-chip Code Memory设置的范围内,导致GAP。
打开.MAP文件,搜索GAP,如果存在一些GAP,则可能是多个指定的绝对地址之间有GAP导致的,可以将绝对地址调整对齐。
因为xdata + const + code将占用整个Off-chip(1581为58KB),所以可以将一些const,code类型的变量转换成xdata。总之,根据这三者根据实际情况进行一个调整,总大小不超过58KB即可。有时ROM存放在EEPROM上,所以适当减少const+code的大小,一些变量转换成Xdata是一种方法。
#3. C51变量绝对地址定位及初始化
##3.1. 关键字_at_
int xdata nValA _at_ 0x1114;
int xdata nValA = 0x2222; // nValA绝对地址定位于x:0x1114,初始化值为0x2222
char code nValD _at_ 0xD2;
char code nValD = 0x22; // 此句无效,nValD绝对地址定位于c:0xD2,初始值为0
##3.2. LX51 Locate
当勾选Use Extended liker(LX51) instead of BL51时,即使用LX51 Locate。
LX 51 Locate->User Segments->?CO?MAIN(C:0xD2), ?XD?MAIN(x:0x1114)
LX51 Misc->use linker control file->edit->SEGMENTS (?CO?MAIN(C:0xD2), ?XD?MAIN(x:0x1114))
以上两种设置均可,推荐用前面一种更方便,且还能够添加REMOVEUNUSED等编译关键字。
?CO?MAIN和?XD?MAIN作为segment name,是以变量类型缩写+文件名大写组合而成,对此不熟练,可以打开生成的.MAP文件,查看MEMORY MAP OF MODULE区域的描述也可以找到
当指定了当前文件Segment所在,那么当前文件所有的全局变量,均会在指定的绝对地址之后顺序排列,并且可以对变量进行初始化。
int xdata nValA = 0x2222; // nValA绝对地址定位于x:0x1114,初始化值为0x2222
int xdata nValB = 0x1111; // nValB绝对地址定位于x:0x1116,初始化值为0x1111
char code nValD = 0x22; // nValD绝对地址定位于c:0xD2,初始值为x22
char code nValD = 0x11; // nValD绝对地址定位于c:0xD2,初始值为x11
##3.3. BL51 Locate
当不勾选Use Extended liker(LX51) instead of BL51时,即使用BX51 Locate。
BL 51 Locate->code->?CO?MAIN(0xD2)
BL 51 Locate->Xdata->?XD?MAIN(0x1114)
BL1 Misc->use linker control file->edit->CODE( 0X0000-0X0FFF , ?CO?MAIN(0XD2) ) XDATA( 0X1000-0X2FFF , ?XD?MAIN(0x1002) )
以上两种设置均可,推荐使用LX51,这是新的链接器,性能更好。
#4. MDK的ROM大小
此处主要是针对M0而言。Keil编译之后,在.MAP文件结尾会显示:
Code (inc. data) RO Data RW Data ZI Data Debug
26864 2124 1284 2040 26632 118060 Grand Totals
26864 2124 1284 72 26632 118060 ELF Image Totals (compressed)
26864 2124 1284 72 0 0 ROM Totals
===================================================================
Total RO Size (Code + RO Data) 28148 ( 27.49kB)
Total RW Size (RW Data + ZI Data) 28672 ( 28.00kB)
Total ROM Size (Code + RO Data + RW Data) 28220 ( 27.56kB)
Code,不仅包括生成的代码,还包括inline data, literal pools, and short strings。
RO Data,Read Only data,用const修饰的变量,或是地址定位到RO Data的变量。
ZI Data,Zero Initialie data,编译器进行0初始化的数据。所有未显示初始化,或是显式初始化为0的变量均是ZI Data(包括栈变量和堆变量)。
RW Data,Read Write Data,显式初始化为非0的全局变量。
Total Rom Size即是生成的bin文件大小。ROM Size所包含的RW Data为28220-28148=72,而不是2040。
实际的代码:
int nArr[500] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
nArr作为RW Data,实际大小有2000B,那么为什么通过ROM计算出的RW Data只有72B呢?
首先,RW Data为什么要记录在ROM中呢?这是因为RW Data的初始化值是编译期生成的,所以这些初始化值要记录在ROM中,这样一上电就能够初始化。正因为只记录初始化的值,所以上面的nArr只初始化了10个值,其他未初始化的其实都没有放进ROM中。所以这才导致了两者的不同。
Total RW Size即运行时存放变量的RAM的大小。
#5. MDK的ROM优化
打开.MAP文件,找到Memory Map of the image处,搜查看是否有PAD,如果存在一些PAD,则可能是多个指定的绝对地址之间有GAP导致的,可以将绝对地址调整对齐PAD的大小然后编译再查看.MAP文件的PAD。
因为Code + RO Data + RW Data + ZI Data将占用整个SRAM(5081为60KB),Code一般不易修改,所以可以动态调整RO Data、RW Data以及ZI Data的分布,只要总的大小不超过60KB即可,来优化ROM的大小。有时ROM存放在EEPROM上,所以适当减少ROM的大小,一些变量转换成ZI Data是一种方法。
#6. MDK的变量绝对地址定位及初始化
##3.1. 关键字__attribute__((at(address)))
const int MAX_LUN_CNT __at(0x2000E000) = 10; // IROM1
const int MY_COLOR[4] __at(0x2000E004) = {1, 2, 3, 4}; // IROM1
int g_Val __at(0x2000E004); // 正确 // IROM1
int g_Val1 __at(0x2000E200); // 正确 // IRAM1
// 错误.This is fixed with ARM Compiler V5.06u2, released in combination with MDK-ARM V5.20.
int g_Val __at(0x2000E200) = 10; // Keil 4编译错误,Keil 5.20编译通过
上一篇:Keil C51 Code Banking
下一篇:51单片机学习笔记之中断
推荐阅读
史海拾趣
1965年,Everett Charles Technologies (ECT) 公司正式成立,标志着其在电子测试系统硬件与软件领域的起点。ECT的创始人凭借对电子技术的深刻理解和市场需求的敏锐洞察,成功开发出了一系列符合工业标准的产品,包括POGO探针、ValuGrid测试治具等。这些产品的推出,不仅奠定了ECT在电子测试领域的基础,也为公司的后续发展提供了强大的动力。
1996年,ECT为了进一步壮大在产业中的主导地位,加入了Dover集团。Dover集团是一家在纽约股票交易所上市的全美500强大企业之一,其业务涵盖工业、工程系统、流体、电子技术等多个领域。加入Dover集团后,ECT得到了更多的资源和支持,实现了跨越式发展。Dover集团的全球布局和丰富资源,为ECT在全球范围内的业务拓展提供了有力保障。
随着国内市场的日益饱和,博众电气开始将目光投向国际市场。公司制定了国际化发展战略,积极参与国际竞争与合作。通过在国外设立分支机构、参加国际展会等方式,博众电气成功打开了国际市场的大门。如今,公司的产品已经远销海外多个国家和地区,国际市场份额逐年攀升。
2005年,重庆平洋电子有限公司迎来了一个重要的合作机会。经过严格的筛选和谈判,公司与海尔集团达成了先期采购协议,成为海尔集团在重庆市唯一一家免第三方认证的企业。这一合作不仅为公司带来了稳定的订单和收益,还进一步提升了公司的品牌影响力和市场竞争力。
在追求经济效益的同时,Chyao Shiunn也注重履行社会责任。公司积极参与公益事业,为当地社区的发展做出贡献。同时,公司还注重环境保护和可持续发展,通过采用环保材料和节能减排技术等方式降低生产过程中的环境污染。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实基础。
请注意,这些故事都是虚构的,并不针对任何真实存在的公司。在现实中,每个公司的成长和发展都有其独特的故事和经历。如果您需要了解特定公司的真实发展历程,建议查阅相关资料或咨询相关人士。
为了扩大市场份额,DYMO公司积极寻求与各大零售商和办公用品供应商的合作。通过与这些合作伙伴建立紧密的合作关系,DYMO公司的产品得以更广泛地进入市场,并被更多的消费者所熟知。此外,DYMO公司还积极开拓国际市场,将其产品销往全球各地。
1. 木纹状的干扰 这种干扰的出现,轻微时不会淹没正常图像,而严重时图像就无法观看了(甚至破坏同步)。这种故障现象产生的原因较多也较复杂。大致有如下几种原因: (1)视频传输线的质量不好,特别是屏蔽性能差(屏蔽网不是质量很好的铜 ...… 查看全部问答∨ |
|
各位好,我想在wince在把clistctrl的滚动条换肤,可是发现OnNcCalcSize在wince下不能用了,请问大家都是怎么解决的呢?谢谢… 查看全部问答∨ |
各位大侠,我想问下,过程性连续赋值语句的最大特点是什么啊? 我还想问下,过程性连续赋值语句对于reg变量是不是不支持啊? 我最近用quartusII仿真程序,在全编译的时候出现procedural continuous assignment to register is not su ...… 查看全部问答∨ |
=== 请问,CCS的help和tutorial里面好多乱码,怎么解决? === 我用的是CCS2.2,C6000的tutorial里面, dsp/bios那部分里面好多乱码,尤其是涉及到文件路径的地方 是不是我的系统少装了什么? 谢谢… 查看全部问答∨ |
基于 Cortex-M3 的当前应用如果需要更强的计算能力,Cortex-M4 的引进将会扩展 Cortex-Mx 核心在这方面的应用。各大半导体原厂早已计划将 Cortex-M3 继续升级到 Cortex-M4 ,包括 TI、NXP、S ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- ELEXCON 2022 深圳国际电子展11月6日(新档期)开幕,速领门票!更有N重好礼等你拿!
- 有奖直播:瑞萨电子 R-Car 先进驾驶辅助系统方案
- 芯币 E金币可以兑换3D打印啦!
- 免费下载 | TE暖通空调 & 热泵解决方案资料包!
- 4月25日上午10:00-11:30 ADI与您相约 TOF (Time Of Flight) 技术介绍及产品应用 有奖直播
- 看视频赢京东卡 | PI无刷直流电机学习中心正式上线
- TE携手ARCH打造定制化摩托骑行体验,助力智能出行未来
- 直播已结束【英飞凌全新Wi-Fi6单芯片SoC助力物联网产品的快速开发】(9:30入场)
- 【世健的ADI之路主题游】 第三站:了解物联网前沿器件与方案,打卡赢Kindle、《新概念模拟电路》
- 瑞萨电子100套开发套件等你来抢