非常简单的一个工程,没有用到任何io操作,与stm32有关的仅仅只有芯片的选择,即其sram大小有区别。图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 used
linking...
program size: code=796 ro-data=336 rw-data=20 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 referenced
myex1.c(3): warning: #550-d: variable c was set but never used
linking...
program size: 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)其余没有任何变化
代码3
int main()
{ const int x=16;
int myarry[100];
int i;
int a,b,c,d;
a=10;b=20;
c=a+b;
for(i=0;i<100;i++)
myarry[i]=i;
for(;;);
}
myex1.c(2): warning: #177-d: variable x was declared but never referenced
myex1.c(3): warning: #550-d: variable myarry was set but never used
myex1.c(5): warning: #550-d: variable c was set but never used
myex1.c(5): warning: #177-d: variable d was declared but never referenced
linking...
program size: code=816 ro-data=336 rw-data=20 zi-data=1636
fromelf: creating hex file...
myex1.axf - 0 error(s), 4 warning(s).
分析:程序中增加了数组myarry,code增加为816字节,但是ro-data等仍未变化
代码4
int main()
{ const int x=16;
int myarry[100]={1,2,3,4,5,6};
int i;
int a,b,c,d;
a=10;b=20;
c=a+b;
for(i=0;i<100;i++)
myarry[i]=i;
for(;;);
}
myex1.c(2): warning: #177-d: variable x was declared but never referenced
myex1.c(3): warning: #550-d: variable myarry was set but never used
myex1.c(5): warning: #550-d: variable c was set but never used
myex1.c(5): warning: #177-d: variable d was declared but never referenced
linking...
program size: code=1024 ro-data=360 rw-data=20 zi-data=1636
fromelf: creating 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,rw就是read/write,zi就是zero
****************************************************
如果按此说明,增加变量应该增加ro,但从代码1到代码2的变化来看,仅是增加了code,却没有增加ro。
初始化变量时,应该增加rw,但是从代码2~代码4,rw却没有任何变化。
看来这个说法只能适用于arm芯片,即运行时需要将代码调入ram运行的芯片,对于stm32这类芯片并不完全适用。
以下再作研究:
当使用 int myarray[300]时:
图2
当使得int myarray[100]时:
图3
应该是向下生成的??
而且与芯片无关,无论选择6k ram还是48k ram都是如此,且当数组再大时,就会将地址置于小于0x2000000的地址,但编译并不报错。
当使得int myarray[450]时:
图4
当然,执行是错误的。
当int myarray[409]时:正指向0x2000000
去掉其他变量,对于这个地址没有影响!
代码5
int myarray[400]={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;i<100;i++)
myarray[i]=i;
for(i=0;i<100;i++)
c+=myarray[i];
d+=x;
for(;;);
}
编译结果:
compiling myex1.c...
linking...
program size: 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的实验中还发现,即便更改芯片,从6kb 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应该是针对栈来说的。即栈中的只读数据和零数据??但是rw-data似乎又有所不同,这里还应该再次探究。
Facebook第三季度营收为214.70亿美元,比去年同期增长22%
关于安防智能机器人的发展历程浅析
贾跃亭的造车项目能否落地内蒙尚未可知,莫干山基地存在被收回风险
智能手机市场增长停滞,下半场拼什么?
中兴5G 奥地利商用
在Keil环境编程中发现STM32内存管理存在的问题
手机电脑双接口 朗科这款U盘数据传输很方便
半导体超级周期开启,电脑攒机成为“奢侈品”,iPhone 13要涨价?
首个职教“开源鸿蒙班”开班,深信院与深开鸿开启数字化特色人才培养新范式
耦合电容用多大合适_耦合电容容量大小影响
如何通过SSH连接到树莓派
华为云会议SmartRooms智能会议室,企业高效开会神器
24V大功率直流稳压电源电路图
监控硬盘与普通硬盘有什么不同之处
在Mac的几乎任何文本字段中键入表情符号的方法
高精度电流测量的DI系列/分流隔离器EN 50463
一次JVM GC长暂停的排查过程
新人工智能工具助力取出越南战争时未爆炸的炸弹
物联网和流量卡的区别是什么
东芝面向智能手机和平板电脑推出2,000万像素CMOS图像传感器