打印
[技术问答]

keil对单片机变量和函数的编译处理

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

使用特权

评论回复
沙发
chenqianqian| | 2023-2-13 09:46 | 只看该作者
编译优化等级可以设置

使用特权

评论回复
板凳
i1mcu| | 2023-3-7 20:19 | 只看该作者
声明的变量时如何处理的?               

使用特权

评论回复
地板
geraldbetty| | 2023-3-7 20:42 | 只看该作者
预编译处理的吗?              

使用特权

评论回复
5
plsbackup| | 2023-3-7 21:16 | 只看该作者
这个keil的定义吗?              

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

535

主题

9633

帖子

23

粉丝