[技术问答] keil对单片机变量和函数的编译处理

[复制链接]
 楼主| 51xlf 发表于 2023-2-12 22:49 | 显示全部楼层 |阅读模式
(1)初始值不是0的全局变量
在程序调到main()函数执行前,除了要进行内存清零、初始化堆栈外,还需要将全局变量的初始值加载到RAM的指定区域(编译过程中为全局变量分配的空间)。
(2)未初始化的局部变量
实际的编译后的反汇编程序也看不到这些局部变量的初始化。这些局部变量占据哪些还未被使用的内存或者其他函数中局部变量释放的空间。倘若是后者,其他函数局部变量释放的空间并没有清零,所以使用这些释放空间的局部变量就一开始被赋值了,这是需要程序员小心的。
  1. void function()
  2. {
  3. unsigned char k,j; //k,j都未被初始化
  4. if(k<j) ;
  5. else{
  6. }
  7. }
(3)函数的优化
实验代码
  1. void function()
  2. {
  3. unsigned char i,j,k;
  4. i=j+k;
  5. }
编译结果:如下函数的内容经过keil的编译后,就变成了“REI”,也就是说function的内容全被忽略掉。
解释:keil对程序进行了优化,由于function的内容并没有任何作用,所以优化时就把这些内容忽略掉。倘若在变量前边加上“volatile”,这部分内容就不会被忽略。

chenqianqian 发表于 2023-2-13 09:46 来自手机 | 显示全部楼层
编译优化等级可以设置
i1mcu 发表于 2023-3-7 20:19 | 显示全部楼层
声明的变量时如何处理的?               
geraldbetty 发表于 2023-3-7 20:42 | 显示全部楼层
预编译处理的吗?              
plsbackup 发表于 2023-3-7 21:16 | 显示全部楼层
这个keil的定义吗?              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

547

主题

9919

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部

547

主题

9919

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部